排序之快速排序
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)。快速排序是一种不稳定排序算法。
以上是关于排序之快速排序的主要内容,如果未能解决你的问题,请参考以下文章