快速排序算法
本文会从 快排的概述、适用场景、最坏、最好、平均时间复杂度,是否是原地算法,为什么比归并排序好这几个方面进行阐述。
快速排序(Quick Sort)算法是由英国计算机科学家 Tony Hoare 在 1959年发明的。“Quick Sort” 的名字来源于这样一个事实:快速排序速度比任何常见排序算法都要快得多(快两到三倍)。 它是最有效的排序算法之一。它将需要排序的数组分割(splitting)成更小的数组,并且基于与选定的“枢轴”(pivot)元素的比较(comparison)交换元素。 因此,快速排序也被称为“划分交换”(Partition Exchange)排序。 与归并排序一样,快速排序也属于分治方法。
适用实际场景
在深入研究任何算法之前,我们非常有必要了解它在现实世界中的应用。快速排序提供了一种快速且有条理的(methodical)方法来对任何事物的列表(lists of things)进行排序。以下是一些使用快速排序的应用程序。
- 商业计算(Commercial computing):用于各种政府和私人机构,用于对各种数据进行排序,如按姓名或任何给定ID对账户/简介进行排序,按时间或地点对交易进行排序,按名称或创建日期对文件进行排序等。
- 信息搜索(Information search):排序算法有助于更好地搜索信息,还有什么比使用快速排序更快的方法呢?
时间复杂度分析
-
最好情况:最好的情况发生在划分(partitions)尽可能均衡的情况下,即它们在枢轴两边的个数要么相等,要么相差1。
- 情况1:当数组具有奇数个元素并且分区后枢轴正好位于中间时,会出现枢轴任一侧的子列表元素个数相等的情况。每个子数组将有 (n-1)/2 个元素。
- 情况2:如果数组的元素个数是偶数 n,主元两边的两个子数组之间的大小差值为1。 一个分区有 n/2 个元素,另一个分区有 (n/2)-1 个元素。
在这两种情况下,每个分区最多有n/2个元素,子问题大小的树表示如下:

快速排序算法的最佳情况复杂度是O(n logn) 。
- 最坏情况:当我们遇到最不平衡的分区时会发生这种情况,那么第一次调用需要 n 时间,对 n-1 个 元素的递归调用将需要 n-1时间,对 n-2 元素的递归调用将需要 n -2)时间等等。快速排序的最坏情况时间复杂度为 O ( n 2 ) O(n^{2}) O(n2)。

- 平均时间复杂度:



空间复杂度分析
空间复杂度是根据递归堆栈中使用的空间来计算的。 最坏情况下使用的空间是O(n)。 所使用的平均情况空间的阶为O(log n)。最坏情况空间的复杂性为O(n),当算法遇到最坏情况时,即为了获得一个排序列表,我们需要进行n次递归调用。
常见问题
- 快排是原地(inplace)算法吗?
快速排序是一种原地算法。所有元素的排序都是在原本的数组中完成的。
-
什么是随机化快排?为什么要随机化
- 有时候,返回的枢轴可能总是最右边的元素(想升序,但是原本是降序序列)可能会导致最坏的情况。
- 在这种情况下,在每一步中选择一个随机元素作为枢轴将降低触发最坏情况行为的概率。 我们更有可能选择靠近数组中心的支点,当这种情况发生时,递归分支更均匀,因此算法终止得更快。
- 运行时复杂度预计为O(n log n),因为所选的随机点应该避免最坏情况的行为。
-
为什么快排比归并(merge sort)排序好?
- 辅助空间(Auxiliary Space):快速排序是一种就地排序算法,而归并排序使用额外的空间。就地排序意味着不使用额外的存储空间来执行排序(递归堆栈除外)。归并排序需要一个新的临时数组来合并已排序的数组,从而使快速排序成为更好的选择。
- 最坏情况:快速排序的最坏情况运行时是 O ( n 2 ) O(n^{2}) O(n2),可以通过使用随机快速排序来避免,如前所述。 通过选择随机枢轴来获得平均情况的行为可以提高性能。
- 缓存友好(Cache Friendly):快速排序也是一种缓存友好的排序算法,因为它在使用数组时具有良好的引用局部性(good locality of reference)。
86万+

被折叠的 条评论
为什么被折叠?



