程式設計基礎篇 · 查詢與排序
排序:冒泡和快排的賽跑
上一課說了,二分查詢的門票是「先排好序」。那排序本身貴不貴?看你用什麼套路。今天安排一場公開賽:同一組亂序資料,氣泡排序和快速排序同時開跑,誰先把柱子從矮到高排整齊誰贏。先看小資料,再上 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() 背後的快慢帳,是驗收程式碼的基本功