简单排序(冒泡 / 选择 / 插入)
冒泡(Bubble)、选择(Selection)、插入(Insertion) 是三种最基础的比较型排序,平均复杂度都是 O(n²),但实现极简、常数小、空间 O(1),是学习排序的入门必修,也是工程里小数据量场景的实际选择(很多语言内建排序在 n 小时切回插入排序)。三者都基于「原数组上反复扫描 + 比较 + 交换/搬移」的朴素思路,区别只在每一轮做什么:冒泡相邻比较交换把大值「浮」到末尾,选择每轮选最小放到已排序前段,插入逐个把元素插进已排序区。
三者看似等价(都是 O(n²)),实则特性迥异:冒泡最直观、交换次数多但稳定(相等元素不交换),可加「本轮无交换则提前终止」优化;选择交换次数最少(每轮至多一次,共 O(n) 次),但不稳定(跨距离交换会打乱相等元素的相对顺序);插入在近乎有序或 n 很小时最快(最好 O(n)),是三者中工程价值最高的——Java Arrays.sort、Python Timsort、V8 Array.sort 在 n ≤ 32~64 时都退化为插入排序。掌握它们的关键是理解比较次数与交换次数的区别、稳定性这两个概念,并知道何时该用插入排序。
评价
冒泡排序
- 优点:实现最直观;稳定(相等元素不交换);原数组上可加「本轮无交换即提前终止」优化,近乎有序时最好 O(n);缓存局部性好(只比较相邻元素)
- 缺点:交换次数最多(每次只搬一格,最坏 O(n²) 次交换);常数因子偏大,实际是最慢的 O(n²) 排序之一
选择排序
- 优点:交换次数最少(每轮至多交换一次,总共 O(n) 次),适合「元素本身很大、交换代价高」的场景;比较次数固定 O(n²)(与数据是否有序无关)
- 缺点:不稳定(跨距离交换破坏相等元素的相对顺序);无论数据多有序都是 O(n²),无法像插入那样利用初始有序性
插入排序
- 优点:稳定;近乎有序时接近 O(n)(每轮只比较一次就定位);小数据量最快(常数最小);在线(来一个插一个,无需等全部到齐);是 Timsort/V8 排序等高级排序的小数组兜底
- 缺点:逆序时最坏 O(n²),且需大量搬移;不适合大数据量
本叶地图
- 入门 —— 三种 O(n²) 排序的定位、为什么还要学、比较与交换的区别、稳定性概念引入
- 三种算法详解与对比 —— 冒泡(相邻交换,可提前终止)、选择(选最小放前,交换最少)、插入(插有序区,近乎有序 O(n))的代码与对比表
- 优化与稳定性分析 —— 冒泡标志位/记录最后交换位置优化、选择为何不稳定(举例 4,4,2)、稳定性的正式定义与判定、插入排序的工程价值(Timsort)
- 参考 —— 复杂度表、代码模板、对比矩阵、易错点、权威链接