排序之快速排序

Posted 路过你的全世界

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序之快速排序相关的知识,希望对你有一定的参考价值。

快速排序思想

快速排序简称“快排”,快速排序采用的思想是分治思想。

快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。之后递归快速排序基准值的两侧,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。

所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。

快速排序是最常用的一种排序算法,速度快,效率高。就像名字一样,快速排序是最优秀的一种排序算法。

快速排序代码

private static void performSort(int[] array, int startIndex, int endIndex) 
        if (startIndex < endIndex) 
            int low = startIndex;
            int high = endIndex;
            //默认将第一个元素当成“基准值”
            int temp = array[startIndex];

            while (low != high) 
                while (low < high && array[high] > temp) --high;
                if (low < high) 
                    array[low] = array[high];
                    ++low;
                
                while (low < high && array[low] < temp) ++low;
                if (low < high) 
                    array[high] = array[low];
                    --high;
                
            
            array[low] = temp;
            //递归左右两侧的序列,进行快速排序
            performSort(array, startIndex, low - 1);
            performSort(array, low + 1, endIndex);
        
    

时间复杂度分析

快速排序的时间主要耗费在划分操作上,对长度为k的区间进行划分,共需k-1次关键字的比较。

最坏情况

每次划分选取的基准都是当前无序区中关键字最小(或最大)的记录,划分的结果就是基准左边或者右边有一侧为空,另外一侧为剩余所有记录。如果在递归过程中,所选取的下一个基准还是上述的情况,那么每次需要全部记录比较一次。时间复杂度为O(n*n)。

上述情况发生的具体情境:

  • 该序列是递增序列或者是递减序列(已经有序),这样的情况下快速排序退化为O(n*n);
  • 序列的记录完全相同(上述情况的极端实例),时间复杂度为O(n*n);

最好情况

每次划分所取的基准都是当前无序区的”中值”记录,划分的结果是基准的左、右两个无序子区间的长度大致相等。总的关键字比较次数:O(nlgn)

总结

尽管快速排序的最坏时间为O(n*n),但就平均性能而言,它是基于关键字比较的内部排序算法中速度最快者,快速排序亦因此而得名。它的平均时间复杂度为O(nlgn)。快速排序是一种不稳定排序算法。

以上是关于排序之快速排序的主要内容,如果未能解决你的问题,请参考以下文章

排序算法之快速排序

算法-排序系列04之快速排序

排序之快速排序(quickSort)

Python算法之快速排序

排序算法之快速排序

算法学习——递归之快速排序