Sorting Algorithms Summary

Time/space/stability cheatsheet and selection guidance

#resource / algorithm #type / concept #status / growing #algo / sort

[!info] related notes 算法面试题型 MOC 分治 递归算法

排序算法总结

稳定性(Stability)

稳定排序:相等元素的相对顺序在排序后保持不变。

例:按成绩排序学生,(Alice, 90)(Bob, 90),稳定排序保证 Alice 仍在 Bob 前面。

不稳定排序(选择排序、快排、堆排)可能交换相等元素的顺序。需要稳定时可添加辅助 key(如原始下标)。

速查表

排序算法时间复杂度额外空间稳定
选择排序$O(n^2)$$O(1)$
冒泡排序$O(n^2)$$O(1)$
插入排序$O(n^2)$$O(1)$
归并排序$O(n \log n)$$O(n)$
快速排序平均 $O(n \log n)$,最坏 $O(n^2)$$O(\log n)$ 栈
堆排序$O(n \log n)$$O(1)$
计数排序$O(n + m)$$O(m)$
基数排序(LSD)$O(n \times d)$$O(n + \text{base})$

关键排序可视化

归并排序

[38, 27, 43, 3, 9, 82, 10]
         拆分
[38,27,43,3] [9,82,10]
[38,27] [43,3] [9,82] [10]
[38][27] [43][3] [9][82] [10]
         合并(有序合并)
[27,38] [3,43] [9,82] [10]
[3,27,38,43] [9,10,82]
[3,9,10,27,38,43,82]

核心:合并两个已排序子数组,每步比较首元素,$O(n)$ 完成合并。

快速排序

[3, 6, 8, 10, 1, 2, 1]
选 pivot = 6
分区:[3,1,2,1] [6] [8,10]
递归排序左右两部分
[1,1,2,3] [6] [8,10]
→ [1,1,2,3,6,8,10]

核心:partition 操作将数组分为 < pivot> pivot 两部分。

堆排序

建大顶堆:O(n)
依次取堆顶(最大值)放到末尾,调整堆:O(n log n)

选择建议

  • 小数组(n < 50):插入排序,常数因子小,实际最快。
  • 通用场景、不需稳定:随机化快排,缓存友好,平均最快。
  • 需要稳定、可承受额外空间:归并排序。
  • 需要 $O(1)$ 额外空间、不需稳定:堆排序。
  • 整数 key 且范围可控:计数排序 / 基数排序,突破 $O(n \log n)$ 下界。

面试要点

  1. 手写快排:partition 的写法(Lomuto vs Hoare),边界处理。
  2. 归并排序应用:逆序对计数、区间统计等在 merge 阶段附加操作的变体。
  3. 堆排序:理解 heapify 的 $O(n)$ 建堆过程。
  4. 稳定性:能举例说明哪些排序稳定、哪些不稳定,以及何时需要稳定。
  5. 比较排序下界:$O(n \log n)$,基于决策树模型证明。

相关笔记

创建于 2026/3/16 更新于 2026/5/27