Skip to content

快速排序

Quicksort

围绕枢轴分区后递归排序子数组的比较排序算法。

条目类型
算法

形式陈述

快速排序是比较模型中的分治排序:选择枢轴,把数组原地划分为不大于与不小于枢轴的区域,再递归排序两侧。一次划分为 Θ(n)。若每次划分规模为 knk1,递推为

T(n)=T(k)+T(nk1)+Θ(n).

极端不平衡导致最坏 Θ(n2);枢轴均匀随机时,对任意固定输入的期望比较数为 Θ(nlogn)。常见原地实现只需递归栈,期望深度 O(logn),但最坏可为 O(n),且通常不稳定。

直觉

快速排序选择枢轴并原地分区,把枢轴放到最终相对位置,使较小元素位于一侧、较大元素位于另一侧,再递归处理两边。合并阶段几乎为空,效率取决于分区是否持续均衡;随机枢轴让任意固定输入上的期望分割良好,而不是保证每次恰好对半。它通常缓存友好且常数小,但标准实现不稳定。

三路划分与两侧递归
例子与边界

总选首元素处理已排序数组会不断产生 0n1 划分而平方退化;随机枢轴可消除输入顺序与坏划分的固定关联。大量重复键时,二路划分可能低效,三路划分把等于枢轴的元素集中处理。随机化结论是对算法随机性的期望,不等于每次运行保证 O(nlogn)

[4,1,3,2] 取枢轴 3,分区可得到 [1,2], 3, [4],递归后有序。若已排序数组总取首元素为枢轴,子问题规模依次为 n1,n2,,时间退化为 Θ(n2)、递归栈也可达 Θ(n)

Hoare 与 Lomuto 分区的返回语义不同,混用递归边界会死循环或漏元素。大量重复键时三路分区更稳健;“随机打乱”需使用足够均匀的随机源,不能只换一种确定输入顺序。

推论与应用

快速排序因原地分区、连续扫描和低常数常用于内存中的比较排序。工程实现常让很小的子数组转用插入排序,并用三数取中等办法改善普通输入上的枢轴质量;这些只调整常数和坏划分频率,不提供最坏界。随机枢轴给任意固定输入上的期望 Θ(nlogn) 比较,却仍有 Θ(n2) 单次最坏;加入深度上限形成 introsort,才由确定性后备算法恢复最坏 O(nlogn)。同一 partition 原语也用于 quickselect,但只递归一侧。

若键是一字整数,超越比较的整数排序可利用数位与字操作,问题已不受快速排序的比较决策树约束。数据驻留外存时,外存排序以块传输为成本,快速排序的原地局部性不自动达到最优 I/O 界;应把比较数、RAM 时间、递归栈和 I/O 分别报告。

参考资料
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,Ch. 7, quicksort, randomized analysis, and partitioning。
  • Donald E. Knuth, The Art of Computer Programming, Vol. 3: Sorting and Searching, 2nd ed., Addison-Wesley, 1998,Vol. 3, §5.2.2, sorting by exchanging。
关系图谱6 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系

使用的工具

实现的抽象