先看视频,更好理解:https://www.douyin.com/video/7602545031836093731
第一幕:乱序入职
场景:鹅城政务大厅,一群五颜六色的大小圆圈正在排队办入职手续。
张麻子(rocket)拿着喇叭喊:"都给老子站好!从左边开始,小的站前面,大的站后面!"
结果现场一片混乱------红色的块头小却站在最左边,青色的体积最大却夹在C位,紫色的却委曲的蹲在最右边...
旁白:这就是你的 datas 向量,一群 Node 结构体,带着各自的 value(体重)和 sp( Sprite 造型),在 startX 坐标处傻站着。
第二幕:"关键先生"登场
张麻子(指着 ptr 粉色箭头):"你!从第二个开始,一个个往前审!"
马邦德(指着正在颤抖的橙圆圈):"大人,这橙圈在抖什么?"
张麻子:"tremble() 懂不懂?这叫'紧张'!它发现自己 value 可能不对,正在怀疑人生!"
这时候,橙圆圈被标记为 key ------关键先生临时出局,手里攥着自己的 value,心里嘀咕:"老子该站哪儿?"
💡 插入排序精髓第一步:先抽出来,别急着站队!
第三幕:往后挪!都给老子往后挪!
名场面复刻:
张麻子掏出枪(代码里的 while 循环),对着前面已经排好的队伍:
cpp
while(j>=0 && key->value < datas[j]->value){ movebackward(j); // 给我往后退! j--; }
橙圈往前一看:前面的红圈 value 比我大?
张麻子:"红圈!movebackward(0)!你,往后挪一位!"
红圈一脸懵逼地执行 go(newX, -50),骂骂咧咧地滑到了索引 1 的位置。
橙圈再往前看:前面没有了(j==0了)
于是橙圈兴高采列的滑到了索引为0的位置。
💡 插入排序精髓第二步:前面比咱大的,统统后移让位! 这不是谦让,是算法暴力!
第四幕:周而复始,鹅城太平
接下来,其它颜色的蓝圈、紫圈、粉圈依次被枪( ptr 箭头)指到,重复这套"抽出来→前面大的后退→插入正确位置"的流程。
汤师爷(看着最后排好的队伍):"县长,这算法为什么叫'插入'啊?"
张麻子(吐烟圈):"因为每个人都是插入到已经排好的队伍里,就像插秧!不是冒泡那种换来换去的笨办法,也不是快排那种分而治之的洋玩意儿。"
张麻子(指着代码):"看见没?for(int i=1; i<n; i++),从第二个开始,因为第一个默认就有序------一个人的队伍当然是有序的!"
大结局:ptr 退场,全体立正!
cpp
复制
cpp
ptr.hide(); // 粉色箭头功成身退 rocket.write("演示完毕!",42).done();
所有圆圈按 value 从小到大,红橙黄绿青蓝紫,像彩虹一样整齐。
汤师爷:"县长,这算法复杂度..."
张麻子:"最坏情况 O(n2) ,最好 O(n) !但你别管,站着把钱挣了,就是优雅!"
后记:中心思想总结
插入排序就像张麻子整编鹅城保安队------
- 抓一个出来(
key = datas[i])- 前面块头大的统统后退(
movebackward循环)- 按个头插到该站的位置(
placekey)- 前面队伍永远有序,后面逐个加入
核心口诀:抽、退、插,三步走,前面有序后面凑!