排序之快速排序

来源:互联网 发布:数据标准是什么 编辑:程序博客网 时间:2024/06/04 17:46

快速排序思想

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

快速排序是找出一个元素(理论上可以随便找一个)作为基准(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)。快速排序是一种不稳定排序算法。

原创粉丝点击