《让子弹飞》之"插入排序办公室"风云

先看视频,更好理解: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) !但你别管,站着把钱挣了,就是优雅!"


后记:中心思想总结

插入排序就像张麻子整编鹅城保安队------

  1. 抓一个出来(key = datas[i]
  2. 前面块头大的统统后退(movebackward 循环)
  3. 按个头插到该站的位置(placekey
  4. 前面队伍永远有序,后面逐个加入

核心口诀:抽、退、插,三步走,前面有序后面凑!