美文网首页
Vickate_快排

Vickate_快排

作者: Vickate | 来源:发表于2018-05-24 16:33 被阅读0次

快排思想

如下的三步用于描述快排的流程:

  • 在数组中随机取一个值作为标兵
  • 对标兵左、右的区间进行划分(将比标兵大的数放在标兵的右面,比标兵小的数放在标兵的左面,如果倒序就反过来)
  • 重复如上两个过程,直到选取了所有的标兵并划分(此时每个标兵决定的区间中只有一个值,故有序)
- (void)quickSortArray:(NSMutableArray *)array leftIndex:(NSInteger)leftIndex rightIndex:(NSInteger)rightIndex {
    
    if (leftIndex >= rightIndex) {
        return;
    }
    
    NSInteger i = leftIndex;
    NSInteger j = rightIndex;
    NSInteger key = [array[i] integerValue];
    
    while (i < j) {
        while (i < j && [array[j] integerValue] >= key) {
            j--;
        }
        array[i] = array[j];
        
        while (i < j && [array[i] integerValue] <= key) {
            i++;
        }
        array[j] = array[i];
    }
    array[i] = @(key);
    
    [self quickSortArray:array leftIndex:leftIndex rightIndex:i - 1];
    [self quickSortArray:array leftIndex:i + 1 rightIndex:rightIndex];
}

在最好的情况下,每次 partition 都会把数组一分为二,所以时间复杂度 T(n) = 2T(n/2) + O(n)

解为 T(n) = O(nlog(n))

在最坏的情况下,数组刚好和想要的结果顺序相同,每次 partition 到的都是当前无序区中最小(或最大)的记录,因此只得到一个比上一次划分少一个记录的子序列。T(n) = O(n) + T(n-1)

解为 T(n) = O(n²)

在平均的情况下,快排的时间复杂度是 O(nlog(n))

相关文章

  • Vickate_快排

    快排思想 如下的三步用于描述快排的流程: 在数组中随机取一个值作为标兵 对标兵左、右的区间进行划分(将比标兵大的数...

  • 快排

    快排代码

  • 快排

  • 快排

    昨天晚上睡觉前兴起准备十分钟写出快排,结果纠结了两个小时愣是没有搞出来,很郁闷地睡觉去。今天地铁上跟LG又重新缕了...

  • 快排

    基本思想: 先从数列中取出一个数作为基准数。 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的...

  • 快排

  • 快排

    python实现 java实现:

  • 快排

    快速排序: 基本思想:1、先从数列中取出一个数作为基数。2、分区,将比此基数大的数放到它右边,小的数放到它左边。3...

  • 快排

    package sort;import java.util.Arrays;public class Quickso...

  • 快排

网友评论

      本文标题:Vickate_快排

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