快速排序(Quick Sort)

2018-12-05  本文已影响13人  有毒的程序猿
1. 算法描述

快速排序的基本思想:通过一趟排序确定关键值(keyIndex一般选择序列第一个)的准确位置,既关键值左边的数都比关键值小,关键值右边的数都比关键值大.然后对两边分别进行快速排序。

2. 过程演示
Quick Sort.gif
快速排序

原始数据

34 54  12  78 3  45  9  


l   低位
h  高位
k   关键值位置

34 54  12  78 3  45  9   (l = 0, h = 6, k = 0)

9 54  12  78 3  45  34   (l = 0, h = 6, k = 6)

9  34  12  78 3  45 54   (l = 1, h = 6, k = 1)

9  3  12  78  34  45 54   (l = 1, h = 4, k = 4)

9  3  12 34  78  45 54  (l = 3, h = 4, k = 3)

一趟快排得到结果: 9  3  12 34  78  45 54 
3. 代码实现
/*
 * 快速排序
 */
- (void)quickSort:(NSMutableArray *)sortArray
            start:(NSInteger)start
              end:(NSInteger)end {
    if (start >= end) {
        return;
    }
    
    NSInteger low = start;
    NSInteger high = end;
    NSInteger keyIndex = start;
    self.count1 ++;
    while (low < high) {
        while ([sortArray[high] integerValue]>= [sortArray[keyIndex] integerValue] && high > keyIndex) {
            high --;
            self.count2 ++;
        }
        
        if ([sortArray[high] integerValue] < [sortArray[keyIndex] integerValue]) {
            [sortArray exchangeObjectAtIndex:high withObjectAtIndex:keyIndex];
            keyIndex = high;
        }
        
        while ([sortArray[low] integerValue] <= [sortArray[keyIndex] integerValue] && low < keyIndex) {
            low ++;
            self.count2 ++;
        }
        
        if ([sortArray[low] integerValue] > [sortArray[keyIndex] integerValue]) {
            [sortArray exchangeObjectAtIndex:low withObjectAtIndex:keyIndex];
            keyIndex = low;
        }
    }
    
    if (low == high) {
        [self quickSort:sortArray start:start end:keyIndex -1];
        [self quickSort:sortArray start:keyIndex + 1 end:end];
    }
}

4. 验证
 NSArray *arr = [self pakageNumber:1000];    
 NSMutableArray *sortArray = [NSMutableArray arrayWithArray:arr];
 [self quickSort:sortArray start:0 end:sortArray.count -1];
count1  :688                        // 外层循环
count2 :10982                      // 内层循环

一万条数据所用时间
time:0.019154s;
上一篇 下一篇

猜你喜欢

热点阅读