编程基础篇 · 查找与排序
排序:冒泡和快排的赛跑
上一课说了,二分查找的门票是「先排好序」。那排序本身贵不贵?看你用什么套路。今天安排一场公开赛:同一组乱序数据,冒泡排序和快速排序同时开跑,谁先把柱子从矮到高排整齐谁赢。先看小数据,再上 60 根柱子——差距会让你印象深刻。
同场赛跑 · 冒泡 vs 快排
规则:两条泳道、同一组随机柱子、同样的动画节奏(每一步耗时相同),公平竞赛。留意三件事:①黄色 = 正在比较的柱子 ②紫色 = 快排选中的「基准」③绿色 = 已就位。先用 10 根感受节奏,再点 60 根看差距。
柱子数量
两道用同一组数据,点「开跑」发令
🫧 冒泡排序
相邻两根比较,大的慢慢往右冒 · O(n²) 0次比较⚡️ 快速排序
选个基准劈两半,各自再劈 · 平均 O(n log n) 0次比较怎么看这场比赛:冒泡永远只跟隔壁比、一格一格挪;快排每选一次基准,就把问题劈成两个更小的问题。10 根柱子时两边差不多,60 根时快排的比较次数只有冒泡的零头。
两种思想 · 各是什么套路
🫧 冒泡:蛮力逐个换 O(n²)
每一轮从头到尾扫一遍,相邻两个只要前面比后面大就交换——一轮下来,最大的那个必然「冒」到最右边。简单、直观、绝对不会写错,但 n 个数要扫 n 轮,总账就是 n²。上上课那条红色曲线,就是它的命。
⚡️ 快排:分而治之 O(n log n)
随手指定一根「基准」,比它矮的甩左边、比它高的甩右边——一趟下来基准就位,剩下两堆各自重复这个动作。「劈两半」是不是很眼熟?就是二分的亲戚。这个套路叫分治,下下课讲递归时它还会登场。
🪪 说句实话:没人手写排序
真实工程里,排序就是一行 list.sort(),语言内置的实现比你我手写的都好。那学这个干嘛?为了两种手感:一是看懂「为什么有的代码要跑一晚上」——多半是有人在百万级数据上用了 O(n²) 的套路;二是亲身体会 O(n²) 和 O(n log n) 到底差多少——上面那场赛跑,就是上上课两条曲线的真人版。尺子有了、手感有了,验收 AI 写的代码就有底气了。
下一课预告:排序在 AI 时代还有一个隐藏身份。RAG 检索回来一堆候选段落,谁排前面谁进上下文——这个「打分 + 重排」的过程叫 Rerank,是排序思想在大模型工程里的真身。下一课亲手当一次 Rerank 模型。
✅ 这一课想和你分享的
- 排序思想两大流派:蛮力逐个换(冒泡)vs 分而治之(快排)
- 「劈两半」再次立功:快排是二分思想的亲戚,分治套路后面讲递归还会见
- 数据量大时算法选择是生死线:60 根柱子已经肉眼可见,百万条就是「跑一晚上」和「一秒出结果」
- 不用手写,但要看得懂:一行 .sort() 背后的快慢账,是验收代码的基本功