(e)插入排序
看透插入排序:从直觉到代码实现,拆解比较-后移-插入机制,掌握复杂度与稳定性
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
(e)插入排序
看透插入排序:从直觉到代码实现,拆解比较-后移-插入机制,掌握复杂度与稳定性
经验
你摸牌时不会把整手牌打乱重排,而是把新牌直接插进手里已排好的序列——插入排序正是建立在这种“经验”之上。
新牌插入手中已排序的位置,而非把整手牌重新洗一遍
构思
你有没有过这种经验——手里攥着一把排好的牌,每抓一张新牌,就从右向左找位置插进去?这就是插入排序的朴素构思。
已排好的牌 = 已排序区;新抓的牌从右往左找位置插入
对比
前页用"整理扑克牌"理解了插入排序的核心动作。现在把它和选择、冒泡排序摆在一起——三者都是 O(n²),但干活姿势、稳定性和适用场景差别很大。这一页来做对比。
三种思路对应三种动作:插入直接落位、选择全局挑最小、冒泡和邻居反复换
实例
对比看完了,现在让它实际跑一次。拿一个具体数组,按时间顺序走完插入排序的每一轮,看每个元素是怎么找到自己位置的。
排好的左半边⇄已排序前缀;新书⇄当前待插元素;右半整体右挪⇄比它大的往后挪一位
实现
前面看到插入排序思路简单、且对小数组和近有序数据格外划算。这一页落到代码层——核心两件事:循环怎么走,移动怎么做。
摸到一张新牌,把比它大的牌依次往右挪一张让出空位再放下——不是反复两两交换
性能分析
实现写完了,但写完 ≠ 会用。性能分析就是搞清:它到底多快、最慢多慢、什么时候用才划算。
书越接近有序,插入移动越少;完全倒序时每本都要越过前面所有书
平均性能
上一页看到:已经有序的输入只要 O(n) 趟扫描,完全逆序则要 O(n²) 次交换。真实数据大多介于两者之间——那「中间地带」究竟有多贵?
一副牌洗乱后,平均每张牌要穿越约一半的错位牌才能就位
逆序对
上一页我们说插入排序平均需要 O(n²) 次操作——但其实可以数清楚。答案藏在「逆序对」这个概念里。它是分析插入排序时最锋利的一把刻刀。
前面高、后面矮就是「逆序」,调一次队形就消除一个
本节要点
- ✓插入排序体现「维护循环不变量」的算法思维
- ✓交换次数恰等于序列中的逆序对数
- ✓小规模、近有序、增量数据时仍是优选
- ✓平均与最坏同为O(n²),天花板由策略决定
- ✓突破O(n²)需改变思路:分治、堆或随机化
课后思考
先自己想,再看参考答案。每个问题都值得停留几分钟。
参考答案每交换一次只消除当前这对逆序对,且不会产生新对;零逆序对意味着数组已有序,排序提前结束。
参考答案小数组常数项小、缓存命中率高;近乎有序时内层循环很快 break,逆序对很少,两类场景都是它的优势。
参考答案可以——用平衡 BST 替线性查找插入位置,O(n log n),代价是 O(n) 空间与树的常数,这已是另一个问题。