演算法系列 · 第 4 關 · 排序

快速排序 Quick Sort

實務上最常用的排序 —— 選一個基準,把小的丟左、大的丟右,再各自快排。

挑一個元素當基準(pivot),一趟掃過去,把比它小的通通丟到左邊、比它大的丟到右邊(這一步叫 partition)。基準因此落到它的最終位置,再對左右兩堆各自重複同樣的事。

核心觀念:partition(分割)

1. 選基準 —— 從這段挑一個元素當 pivot(可以是最後一個、中間、或隨機)。

2. 分兩堆 —— 掃一遍,比基準小的排到左邊、比基準大的排到右邊。

3. 基準歸位 —— 掃完後把基準放到中間,它左邊全比它小、右邊全比它大,這個位置就是它最終的家。

4. 各自再來 —— 對左堆、右堆分別遞迴做一樣的事,直到每堆只剩一個。

跟合併排序剛好相反:快排是「先做事(分堆)再遞迴」,合併是「先遞迴再做事(合併)」。快排的工在切之前,合併的工在合之後。

複雜度

O(n log n)時間(平均) —— 基準大致均勻分兩半時,跟合併排序一樣快。
O(n²)時間(最壞) —— 基準每次都選到最大/最小(例如資料已排序又總選第一個)。
O(log n)空間 —— 就地排序,只花遞迴堆疊,幾乎不用額外陣列。
為什麼實務愛用它?雖然最壞是 O(n²),但平均很快、常數小、又就地排序省記憶體。用隨機基準幾乎就能避開最壞情況(範例 4)。注意:它通常不穩定。

用生活比喻它

🍎

分蘋果

隨手挑一顆當標準,比它小的丟左籃、大的丟右籃,再對兩籃各自照做。

🧍

排隊分高矮

找一個人當基準,矮的站他左邊、高的站右邊,兩邊再各自分。

📚

整理書堆

抽一本當中間點,薄的一疊、厚的一疊,分完再各自整理。

🎮 partition 步進器(整個演算法的心臟)

示範一趟 partition:基準是最後一個(黃色)。指標 j 從左掃到右,紫色是正在看的,綠色是已經確定「比基準小」的左堆。按「下一步」走一遍,看基準最後怎麼歸位。

10 個程式碼範例(Python)

從最好懂的版本,到經典就地 partition、隨機化、選基準技巧、Quickselect 等應用。

顯示範例:

常見陷阱

❌ 對已排序資料又固定選第一個/最後一個當基準 —— 會退化成最壞的 O(n²)。解法:隨機基準或三數取中。

❌ 遞迴忘了縮小範圍 —— partition 回傳位置後,左邊要 p - 1、右邊要 p + 1,基準本身不用再排。

❌ 以為它穩定 —— 快速排序通常不穩定(相同鍵的原順序可能被打亂)。需要穩定就用合併排序。

🎯 換你了(先別急著查答案)

把答案打到對話裡,我幫你對。