排序Sorting

把元素按键或比较规则排成有序序列。选择时需要区分稳定性、额外空间、键的表示和输入是否已有序。

怎样选择#

  • n 为元素数,k 为值域大小或单轮基数,d 为处理的位数。以下复杂度以一次比较或数位操作为 O(1) 为前提。
  • 计数与基数排序利用键的表示,不受一般比较排序的 Ω(n log n) 下界约束;键范围和辅助存储仍会限制适用性。
  • 多路有序归并处理的是已经排好序的多个输入;快速选择只求目标秩,不要求整个序列有序。它们作为独立条目呈现。

算法对照#

具体算法问题与前提时间复杂度辅助空间选择与取舍
插入排序小数组或近乎有序的输入最坏 O(n2)O(n^{2}),最好 O(n)O(n)O(1)O(1)稳定、原地;常用于混合排序的短区间。
归并排序需要稳定排序或按顺序合并数据O(nlog⁡n)O(n \log n)数组归并 O(n)O(n),另有 O(log⁡n)O(\log n) 递归栈时间界稳定;典型数组实现需要 O(n) 辅助空间。
快速排序可随机访问、比较成本适中的内存数据平均 O(nlog⁡n)O(n \log n),最坏 O(n2)O(n^{2})普通递归期望 O(log⁡n)O(\log n),最坏 O(n)O(n)常见实现不稳定;枢轴、重复值和最坏情况保护需要一起考虑。
堆排序额外空间有限且要求最坏时间保证O(nlog⁡n)O(n \log n)原地迭代实现 O(1)O(1)原地实现额外空间 O(1);通常不稳定。
计数排序整数键的值域 k 不大O(n+k)O(n+k)稳定输出版 O(n+k)O(n+k)可稳定实现;大值域会使计数数组得不偿失。
基数排序键可拆成有限数位O(d(n+k))O(d(n+k))O(n+k)O(n+k)LSD 方案每轮须稳定;还需计入键编码和辅助存储。
选择排序更关心交换次数的小规模输入O(n2)O(n^{2}) 比较,O(n)O(n) 交换O(1)O(1)常规实现原地但不稳定,大输入通常不选用。
冒泡排序理解相邻交换与提前终止最坏 O(n2)O(n^{2}),提前退出时最好 O(n)O(n)O(1)O(1)主要用于基础教学,通常不用于工程中的通用排序。

左右滑动查看完整对照。点击算法名称,查看原理、约束和实现。

工程中的应用#

参考资料#

MIT 6.006 · Sorting

MIT 6.006 · Linear Sorting

Princeton Algorithms · Sorting summary

8 个概念