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

氣泡排序 Bubble Sort

最好懂的排序法 —— 相鄰兩個兩個比,大的往後換,最大的像泡泡一樣浮到最後。

從頭掃到尾,相鄰兩個一組比大小,左邊比右邊大就交換。跑完一輪,最大的那個就「浮」到最右邊定位;再對剩下的重複,直到全部排好。

什麼時候用它?

老實說——實務上幾乎不用。它是 O(n²),資料一多就慢。但它是理解排序的最佳入門:邏輯超直覺,而且能讓你親眼看到「巢狀迴圈 = O(n²)」長什麼樣子。學會它,之後的合併排序、快速排序才知道「快在哪」。

核心邏輯(四步驟)

1. 從頭走到尾,把相鄰的兩個拿來比。

2. 左邊比右邊大 → 交換,讓大的往右移。

3. 一整輪跑完,這輪最大的一定被推到最右邊,定位完成。

4. 對「還沒定位」的部分重複,每輪範圍縮一格。優化:某一輪完全沒發生交換,代表已經排好,可以提早收工。

複雜度

O(n²)時間(平均/最壞) —— 雙層迴圈,n 個元素比大約 n×n 次。
O(n)時間(最好) —— 資料本來就排好,加優化版跑一輪沒交換就結束。
O(1)空間 —— 就地交換,不需要額外空間。
穩定排序:只有「嚴格大於」才交換,所以鍵相同的元素會保持原本的先後順序(這叫「穩定」,範例 9 有示範)。

用生活比喻它

🫧

水裡的泡泡

大泡泡浮得快,每一輪最大的先冒到頂端——名字就是這樣來的。

🧍

排隊比身高

相鄰兩人比高矮,順序不對就換位,一輪一輪把最高的擠到隊尾。

🃏

整理手上的牌

從左看到右,遇到左大右小就對調,反覆掃到不用再換為止。

🎮 排序動畫(一步步走或自動播放)

紫色是正在比較的一對、紅色代表剛剛發生交換、綠色是已排好定位的。按「下一步」慢慢看,或按「自動播放」讓它跑給你看。

為什麼是 O(n²)?

外層要跑大約 n 輪(每輪定位一個),內層每輪又要比大約 n 次。n 乘 n,就是 O(n²)。所以資料量變兩倍,工作量會變成大約四倍:

這就是為什麼真正要排大量資料時,會改用 O(n log n) 的合併排序或快速排序。

10 個程式碼範例(Python)

從最基本的版本,到優化、變形(雞尾酒排序、遞迴版),再到穩定性與效率分析。

顯示範例:

常見陷阱

❌ 內層範圍沒縮 —— 寫成 range(n - 1) 而不是 range(n - 1 - i),雖然結果對,但每輪都重比已排好的部分,白做工。

❌ 交換寫錯 —— Python 用 a, b = b, a 一行交換最安全;分兩行寫容易把值蓋掉。

❌ 以為它很快 —— 氣泡排序是教學用的,拿去排幾萬筆資料會慢到懷疑人生,實務請用內建 sorted()。

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

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