排序Sorting
把元素按键或比较规则排成有序序列。选择时需要区分稳定性、额外空间、键的表示和输入是否已有序。
怎样选择#
- n 为元素数,k 为值域大小或单轮基数,d 为处理的位数。以下复杂度以一次比较或数位操作为 O(1) 为前提。
- 计数与基数排序利用键的表示,不受一般比较排序的 Ω(n log n) 下界约束;键范围和辅助存储仍会限制适用性。
- 多路有序归并处理的是已经排好序的多个输入;快速选择只求目标秩,不要求整个序列有序。它们作为独立条目呈现。
算法对照#
| 具体算法 | 问题与前提 | 时间复杂度 | 辅助空间 | 选择与取舍 |
|---|---|---|---|---|
| 插入排序 | 小数组或近乎有序的输入 | 最坏 ,最好 | 稳定、原地;常用于混合排序的短区间。 | |
| 归并排序 | 需要稳定排序或按顺序合并数据 | 数组归并 ,另有 递归栈 | 时间界稳定;典型数组实现需要 O(n) 辅助空间。 | |
| 快速排序 | 可随机访问、比较成本适中的内存数据 | 平均 ,最坏 | 普通递归期望 ,最坏 | 常见实现不稳定;枢轴、重复值和最坏情况保护需要一起考虑。 |
| 堆排序 | 额外空间有限且要求最坏时间保证 | 原地迭代实现 | 原地实现额外空间 O(1);通常不稳定。 | |
| 计数排序 | 整数键的值域 k 不大 | 稳定输出版 | 可稳定实现;大值域会使计数数组得不偿失。 | |
| 基数排序 | 键可拆成有限数位 | LSD 方案每轮须稳定;还需计入键编码和辅助存储。 | ||
| 选择排序 | 更关心交换次数的小规模输入 | 比较, 交换 | 常规实现原地但不稳定,大输入通常不选用。 | |
| 冒泡排序 | 理解相邻交换与提前终止 | 最坏 ,提前退出时最好 | 主要用于基础教学,通常不用于工程中的通用排序。 |
左右滑动查看完整对照。点击算法名称,查看原理、约束和实现。
工程中的应用#
SwarmKit 的调度决策树在叶子中使用 nodeMaxHeap,把候选节点整理为从优到劣的顺序。
附源码片段 · 调度与资源分配
Linux DRM 使用通用 list_sort 对显示模式链表排序;底层归并通过相等时优先取较早元素来保持稳定性。
附源码片段 · 索引与查找
CPython 的列表排序识别已有序段,补齐短段,再按 Powersort 策略稳定归并,兼顾局部有序输入与通用排序。
附源码片段 · 检索与计算