排序.md 2.5 KB


title: 排序 tags:

  • module
  • data-structure-and-algorithm
  • sort
  • joplin type: module source_type: reconstructed created: 2026-04-22 updated: 2026-04-22 ---

排序

[!abstract] 这一模块处理最经典的一类算法问题。重点不是默写代码,而是比较不同排序的基本思想、复杂度、稳定性和适用输入特征。

模块结论

  • [[排序算法]] 可以从插入、交换、选择、归并、堆等思路分类理解。
  • 同样是 O(n^2) 的算法,执行思路和适用场景也不同。
  • 快速排序平均性能优秀,但最坏情况退化明显;堆排序与插入类排序则体现了不同的结构利用方式。

一、插入类排序

  • 直接插入排序
  • 折半插入排序
  • 希尔排序

核心思路

  • 把当前元素插入到前面已经基本有序的区间。
  • 数据越接近有序,插入类排序通常表现越好。

二、交换类排序

  • 冒泡排序
  • 快速排序

对比重点

  • 冒泡排序通过相邻交换逐步把大元素或小元素推到一侧。
  • 快速排序通过划分把序列分成两部分后递归处理。

三、选择与堆思想

  • 选择类排序的核心是每趟选出最值。
  • 堆排序利用 [[堆]] 快速维护当前最值或最大值。

四、比较维度

  • 时间复杂度:最好、平均、最坏。
  • 空间复杂度:是否需要额外辅助空间。
  • 稳定性:相等关键字相对顺序是否保留。
  • 适用输入:近乎有序、小规模、随机分布等。

五、为什么快速排序常见

  • 平均效率高。
  • 原地划分,额外空间开销相对小。
  • 工程实现优化空间大。

但也要记住

  • 枢轴选得差时会退化。
  • 递归深度和分区策略直接影响表现。

六、易错点

  • 不要只记“复杂度结论”,要能解释算法为什么达到这个复杂度。
  • 稳定性不是时间复杂度能替代的问题。
  • 希尔排序本质上仍属于插入排序思想的改进。

七、复习提问

  • 插入排序、冒泡排序、快速排序的核心动作分别是什么?
  • 为什么快排平均快,但最坏情况差?
  • 堆排序是如何利用堆结构完成排序的?
  • 稳定性在什么场景下重要?

来源

  • [[raw/Joplin/计算机专业基础/数据结构与算法/(C)840数据结构与算法/8.排序.md]]
  • [[raw/Joplin/计算机专业基础/数据结构与算法/(C)840数据结构与算法/3.堆--以最大堆为例.md]]

相关页面

  • [[数据结构与算法]]
  • [[排序算法]]
  • [[堆]]