4.7 快速排序
Posted 极夜编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4.7 快速排序相关的知识,希望对你有一定的参考价值。
4.7 快速排序
快速排序(Quick Sort)
快速排序之所以快,是因为它使用了分治法。快速排序在每一轮挑选一个基准(pivot)元素,并让其它比它小的元素移动到数列一边,比它大的元素移动到数列的另一边,从而把数列拆解成了两个部分。
选择基准元素最简单的方式是选择数列的第一个元素。这种选择在绝大多数情况下是没有问题的,但是如果对一个原本逆序的数列进行升序排序,整个数列并没有被分成一半,每一轮仅仅确定了基准元素的位置。这种情况下数列第一个元素要么是最小值,要么是最大值,根本无法发挥分治法的优势。在这种极端情况下,快速排序需要进行n轮,时间复杂度退化成了O(n2)。
如何避免这种极端情况呢?可以不选择数列的第一个元素,而是随机选择一个元素作为基准元素。这样一来,即使是在数列完全逆序的情况下,也可以有效地将数列分成两部分。当然,即使是随机选择,每一次也有极小的几率选到数列的最大值或最小值,同样会对分治造成一定影响。
确定了基准值后,如何实现将小于基准的元素都移动到基准值一边,大于基准值的都移动到另一边呢?
例如一个有8个数字组成的无序序列,进行升序排序。
选定基准元素pivot,设置两个指针left和right,指向数列的最左和最右两个元素。
从right指针开始,把指针所指向的元素和基准元素做比较。如果比pivot大,则right指针向左移动;如果比pivot小,则把right所指向的元素填入left指针所指向的位置,同时left向右移动一位。
接着,切换到left指针进行比较,把指针所指向的元素和基准元素做比较。如果小于pivot,则left指针向右移动;如果大于pivot,则把left所指向的元素填入right指针所指向的位置,同时right向左移动一位。
重复之前的步骤继续排序:
当left和right指针重合在同一位置的时候,把之前的pivot元素的值填入该重合的位置。此时数列左边的元素都小于基准元素,数列右边的元素都大于基准元素。
算法分析
快速排序是很重要的算法,与傅里叶变换等算法并称“二十世纪十大算法”。
分治法的思想下,原数列在每一轮被拆分成两部分,每一部分在下一轮又被拆分成两部分,直到不可再分为止。这样平均情况下需要log n轮,因此快速排序算法的平均时间复杂度是O(n*log n)。
【视频讲解】
以上是关于4.7 快速排序的主要内容,如果未能解决你的问题,请参考以下文章