跳到主要内容

排序算法比较

把本部分算法放在同一张表里对照,便于复习与选型。

对照表(常见教材结论)

算法平均最坏空间稳定
直接插入O(n2)O(n^2)O(n2)O(n^2)O(1)O(1)
希尔依赖增量依赖增量O(1)O(1)
冒泡O(n2)O(n^2)O(n2)O(n^2)O(1)O(1)
快速O(nlogn)O(n \log n)O(n2)O(n^2)O(logn)O(\log n)
简单选择O(n2)O(n^2)O(n2)O(n^2)O(1)O(1)
堆排序O(nlogn)O(n \log n)O(nlogn)O(n \log n)O(1)O(1)
归并O(nlogn)O(n \log n)O(nlogn)O(n \log n)O(n)O(n)
基数O(d(n+r))O(d(n+r))同左O(n+r)O(n+r)

具体实现细节会导致细微差别;以你的代码与教材证明为准。

选型直觉

需求更合适
小数组 / 基本有序插入
平均性能、内存紧快排(注意最坏)
要最坏保证且原地堆排序
要稳定归并(或仔细实现的插入/冒泡)
特殊整数关键字考虑基数
工程默认std::sort;要稳定用 std::stable_sort

复习检查清单

  • 能默写插入、快排分区、归并合并
  • 能说明稳定性定义并各举一例
  • 能解释快排最坏与改进思路

小结

没有「永远最好」的排序。按规模、稳定性、空间与是否最坏敏感来选。

全部排序专题结束后,可回到 学习资源 扩展阅读。