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]]
相关页面
- [[数据结构与算法]]
- [[排序算法]]
- [[堆]]