美文网首页
排序算法

排序算法

作者: 有毒的程序猿 | 来源:发表于2018-02-03 17:01 被阅读36次

准备工作

/*
 交换方法
 */

- (void)swap:(int *)p1 andB:(int *)p2 {
    int tmp = *p1;
    *p1 = *p2;
    *p2 = tmp;
}
一、快速排序
20140317163240031.gif
/*
 快速排序
 */

- (void)quickSort:(int[])a start:(int)start end:(int)end {
    if (start >= end) {
        return; // 出口
    }
    
    int low = start;
    int high = end;
    int keyIndex = start;
    
    // 一趟 快排跳出while
    while (low < high) {
        // 从后往前找
        while (a[high] >= a[keyIndex] && high > keyIndex) {
            high --;
        }
        
        //找到交换
        if (a[high] < a[keyIndex]) {
            [self swap:&a[high] andB:&a[keyIndex]];
            keyIndex = high;
        }
        
        // 从前往后找
        
        while (a[low] <= a[keyIndex] && low < keyIndex) {
            low ++;
        }
        
        // 找到交换 并重新keyIndex赋值
        if (a[low] > a[keyIndex]) {
            [self swap:&a[low] andB:&a[keyIndex]];
            keyIndex = low;
        }
    }
    // 确定 keyIndex 位置并递归 两边
    if (low == high) {
        [self quickSort:a start:start end:keyIndex - 1];
        [self quickSort:a start:keyIndex + 1 end:end];
    }
}
二、归并排序
/*
 归并排序
 */

- (void)mergeSort:(int[])a to:(int[])b start:(int)start end:(int)end{
    if (start >= end) {
        return;
    }
    
    //分成两部分
    int middle = start + (end - start) / 2;
    
    // 递归前半部分拆分
    [self mergeSort:a to:b start:start end:middle];
    
    // 递归后半部分查分
    [self mergeSort:a to:b start:middle + 1 end:end];
    
    // 开始出栈  已经分到最小数组 开始排序合并 现在栈中存储的是一系列 start end middle 值 从栈顶出
    
    int bIndex = start;
    int preIndex = start;
    int sufIndex = middle + 1;
    
    while (preIndex != middle && sufIndex != end +1) {
        if (a[preIndex] > a[sufIndex]) {
            b[bIndex++] = a[sufIndex++];
        } else {
            b[bIndex++] = a[preIndex++];
        }
    }
    
    if (preIndex != middle) {
        b[bIndex++] = a[preIndex++];
    }
    
    if (sufIndex != middle) {
        b[bIndex++] = a[sufIndex++];
    }
    
    // 此时b 中为有序数组 a 中是带排序数组
    int j = start;
    while (j< end + 1) {
        a[j] = b[j];
        j++;
    }
}

三、堆排序
20140317163501125.gif
/*
 堆排序
 */

- (void)heapSort:(int[])a length:(int)length {
    [self creatHeap:a length:length];
    for (int i = length - 1; i >= 0; i--) {
        [self swap:&a[0] andB:&a[I]];
        [self ajustHeap:a head:0 length:i];
    }
}

// 建堆

- (void)creatHeap:(int[])a length:(int)length {
    // 从最后一个父节点 开始向下调整建堆
    int n = length / 2 - 1;
    for (int i = n; i >= 0; i--) {
        [self ajustHeap:a head:i length:length];
    }
}

// 向下调整

- (void)ajustHeap:(int[])a head:(int)head length:(int)length {
    
    // 初始化 左节点
    int leftChild = 2 *head + 1;
    
    // 记录最大的节点
    int bigger = leftChild;
    
    if (bigger >= length) { //只有一个点
        return;
    }
    // 比较左右节点  把较大index赋值给bigger
    int rightChild = 2 *head +2;
    if (rightChild < length) {
        if (a[rightChild] > a[bigger]) {
            bigger = rightChild;
        }
    }
    
    // 和根节点比较 如果大于根节点则 交换两个节点 并递归继续向下调整
    if (a[bigger] > a[head]) {
        [self swap:&a[bigger] andB:&a[head]];
        [self ajustHeap:a head:bigger length:length];
    }
}

四、 二分查找

/*
二分查找
*/

- (int)binarySearch:(int[])a length:(int)length key:(int)key {
    int low = 0;
    int high = length - 1;
    while (low <= high) {
        int mid = low + ((high - low) >>1);
        if (a[mid] > key) {
            low = mid + 1;
        } else if (a[mid < key]) {
            high = mid -1;
        } else {
            return mid;
        }
    }
    return -1;
}
五、 冒泡排序

/*
OC 冒泡排序及优化
*/

- (NSArray *)bubbleSort:(NSArray *)sortArray {
    NSMutableArray *sort = [NSMutableArray arrayWithArray:sortArray];
    BOOL isOrdered = NO; // 跳出循环标识
    NSInteger length = sortArray.count;
    
    NSInteger count1 = 0;// 外层循环次数
    NSInteger count2 = 0;//内层循环次数

    for (int i = 0; i < length; i ++) {
        isOrdered = NO;
        count1 ++;
        for (int j = 0; j < length - i - 1; j ++) { // 一趟排序过后,最大值确定在最后边  所以排序范围递减
            count2 ++;
            if ([sort[j] integerValue] > [sort[j +1] integerValue]) {
                [sort exchangeObjectAtIndex:j withObjectAtIndex:j+1];
                isOrdered = YES;
            }
        }
        if (!isOrdered) {
            break;// 一趟排序如果已经有序  则跳出循环
        }
    }
    
    NSLog(@"count1 : %ld\n count2 :%ld\n sort: %@",(long)count1,(long)count2,sort);
    return [sort copy];
}


NSArray *arr = @[@34,@54,@12,@78,@3,@45,@9];
NSArray *arr1 = [self bubbleSort:arr];

count1 : 6
count2 :21
sort: (
    3,
    9,
    12,
    34,
    45,
    54,
    78
)

/*
排序过程
*/

20160609181236390.gif
I = 0;              

34 54  12  78 3  45  9  

34 12  54  78 3  45  9  

34 12  54 3 78  45  9  

34 12  54 3 45  78  9  

34 12  54 3 45 9  78  


I = 1;

12 34  54 3 45 9  78  

12 34  3 54 45 9  78  

12 34  3 45 54 9  78  

12 34  3 45 9 54  78  

I = 2;

12 3  34 45 9 54  78  

12 3  34 9 45 54  78  


I = 3;

3 12  34 9 45 54  78  

3 12  9 34 45 54  78  


I = 4;

3 9  12 34 45 54  78  

六、 选择排序

/*
选择排序
*/

- (NSArray *)selectedSort:(NSArray *)sortArray {
    NSMutableArray *sort = [NSMutableArray arrayWithArray:sortArray];
    NSInteger length = sortArray.count;
    
    NSInteger count1 = 0;// 外层循环次数
    NSInteger count2 = 0;//内层循环次数
    
    NSInteger curentIndex = 0;
    NSInteger minIndex = 0;
    
    for (int i = 0; i < length - 1; i ++) {
        count1 ++;
        curentIndex = i;
        minIndex = i;
        for (int j = i + 1; j < length; j ++) {
            count2 ++;
            if ([sort[minIndex] integerValue] > [sort[j] integerValue]) {
                minIndex = j;
            }
        }
        
        if (curentIndex != minIndex) {
            [sort exchangeObjectAtIndex:curentIndex withObjectAtIndex:minIndex];
        }
    }
    
    NSLog(@"count1 : %ld\n count2 :%ld\n sort: %@",(long)count1,(long)count2,sort);
    return [sort copy];
}

 NSArray *arr = @[@34,@54,@12,@78,@3,@45,@9];
 NSArray *arr1 = [self selectedSort:arr];
 count1 : 6
 count2 :21
 sort: (
    3,
    9,
    12,
    34,
    45,
    54,
    78
)

/*
排序过程
*/

选择排序

原始数据

34 54  12  78 3  45  9  

I = 0;

minIndex = 0;
minIndex = 2;
minIndex = 4;

3  54  12  78 34  45  9  

I = 1;

minIndex = 1;
minIndex = 2;
minIndex = 6;

3  9  12  78 34  45  54 

I = 2;

minIndex = 2;


I = 3;

minIndex = 3;
minIndex = 4;

3  9  12 34  78  45  54 


I = 4;

minIndex = 4;
minIndex = 5;

3  9  12 34  45  78  54 


I = 5;

minIndex = 5;
minIndex = 6;

3  9  12 34  45 54  78 

相关文章

  • java实现快速排序、归并排序、希尔排序、基数排序算法...

    快速排序算法 归并排序算法 希尔排序算法 基数排序算法

  • web开发需要知道的几个算法

    算法分类 快速排序算法 深度优先算法 广度优先算法 堆排序算法 归并排序算法

  • 算法学习(1)-排序算法

    八大排序算法九大排序算法再总结[经典排序算法][集锦][直观学习排序算法] 视觉直观感受若干常用排序算法 快速排序...

  • 经典排序算法总结

    经典排序算法集锦 冒泡法 排序算法入门之冒泡排序 排序算法入门之冒泡排序优化

  • 前端算法学习-第一篇

    冒泡排序算法 冒泡排序算法是最慢的排序算法之一,也是最容易实现的排序算法。之所以叫冒泡排序是因为使用这种算法排序时...

  • 七大排序算法之冒泡排序

    七大排序算法之冒泡排序 @(算法笔记)[排序算法, 冒泡排序, C++实现] 冒泡排序介绍 冒泡排序是七大排序算法...

  • 算法-选择排序

    算 法:选择排序算法时间复杂度: 选择排序算法概述 选择排序伪代码 选择排序实现 选择排序算法概述 排序算法有许...

  • 浅谈排序算法

    排序算法有很多种,今天先谈谈一些简单的排序算法。包括桶排序、冒泡排序和快速排序算法。后期总结各种排序算法。 桶排序...

  • 线性排序

    桶排序、计数排序、基数排序 一、线性排序算法介绍 1.线性排序算法包括桶排序、计数排序、基数排序。2.线性排序算法...

  • 算法4:插入排序和选择排序算法的比较

    排序算法列表电梯: 选择排序算法:详见 《算法4》2.1 - 选择排序算法(Selection Sort), Py...

网友评论

      本文标题:排序算法

      本文链接:https://www.haomeiwen.com/subject/vaiuzxtx.html