📚 由淺至深
第 03 章 入門 約 15 分鐘

氣泡排序:泡泡浮上來(附動畫)

第一個排序演算法。看到動畫你就懂為什麼叫「氣泡」。慢,但是好懂、好寫、考試常考。

建議先看過: 02-big-o

想像你在排撲克牌

桌上有一排牌:[5, 3, 8, 1, 4],你要從小到大排好。

氣泡排序的做法:從最左邊開始,兩兩比較,比較大的往右擠。 每跑完一輪,最大的那張就會浮到最右邊(像泡泡浮上水面)。

直接看動畫

準備好了
按「開始」播放動畫。粉紅色 = 正在比較。

按一下「開始」,看著大數字怎麼一步一步「冒泡」到右邊。

一輪一輪拆給你看

[5, 3, 8, 1, 4] 為例:

第 1 輪(最大的 8 要冒到最右邊):

動作陣列
比 5 和 3,5 大,換[3, 5, 8, 1, 4]
比 5 和 8,沒事[3, 5, 8, 1, 4]
比 8 和 1,8 大,換[3, 5, 1, 8, 4]
比 8 和 4,8 大,換[3, 5, 1, 4, 8]

最大的 8 已經到底了。✨

第 2 輪(5 要冒到倒數第二):

動作陣列
比 3 和 5,沒事[3, 5, 1, 4, 8]
比 5 和 1,5 大,換[3, 1, 5, 4, 8]
比 5 和 4,5 大,換[3, 1, 4, 5, 8]

5 到位了。

第 3 輪:[1, 3, 4, 5, 8] ← 排完了。

💡關鍵直覺

每跑完一輪,最右邊就多一個排好的。 所以 n 個元素最多跑 n-1 輪就排完。

寫成 Pseudocode

Algorithm BubbleSort(A, n):
for i ← 0 to n-2: // 跑幾輪
for j ← 0 to n-2-i: // 每輪兩兩比較
if A[j] > A[j+1]:
swap(A[j], A[j+1])

讀法:

  • 外層 i:跑第幾輪。
  • 內層 j:在這一輪裡兩兩比較。
  • n-2-i 的意思是:右邊已經排好的部分不用再比(節省時間)。

複雜度分析

外層 n 次,內層平均 n/2 次 → O(n²)

情境比較次數Big-O
最壞(完全反向)n(n-1)/2 ≈ n²/2O(n²)
平均也差不多 n²/2O(n²)
最好(已排好)n-1 次(加 early-stop 才行)O(n)
⚠️氣泡排序的真相

它非常慢。n=10000 就要跑一億次。 那為什麼還要學? 因為:

  1. 考試一定會考。
  2. 它是「雙層 for 迴圈排序」的代表,看懂它再看選擇/插入排序會很快。
  3. Code 短到可以背起來。

一個小優化:提早收工

如果某一輪都沒換過,代表已經排好了,可以直接結束:

Algorithm BubbleSort(A, n):
for i ← 0 to n-2:
swapped ← false
for j ← 0 to n-2-i:
if A[j] > A[j+1]:
swap(A[j], A[j+1])
swapped ← true
if not swapped: break

加了這個,已排序的陣列只跑一輪就結束,最佳情況變 O(n)。

📝考試會這樣考

題型一:給陣列,畫出每一輪的結果。

例:用 Bubble Sort 排 [4, 2, 7, 1, 3],列出每輪結束後的陣列。

怎麼下筆:畫表格,標清楚「第幾輪」。

輪次陣列狀態
初始[4, 2, 7, 1, 3]
第 1 輪後[2, 4, 1, 3, 7]
第 2 輪後[2, 1, 3, 4, 7]
第 3 輪後[1, 2, 3, 4, 7]
第 4 輪後[1, 2, 3, 4, 7]

注意:每輪「最後一個元素已就位」要標出來(粗體 / 底線都行),改卷老師看了會很開心。

題型二:問最壞情況做幾次比較。 n 個元素 → 比較次數 = n(n-1)/2 = (n²-n)/2。代入 n=5 就是 10 次。

題型三:問為什麼最好情況是 O(n)。 答:加了「沒換就停」優化後,已排序的陣列只跑一輪、做 n-1 次比較、零次交換就結束。

這章記住三件事

  1. Bubble Sort = 兩兩比較、大的往右擠,跑 n-1 輪。
  2. 時間複雜度 O(n²),慢但簡單,考試常考追蹤過程
  3. 加「sw apped 旗標」可以讓最好情況變 O(n)

下一章看插入排序——你打牌時整理手牌的方式。

學習進度只存在你的瀏覽器,不會上傳。