📚 由淺至深
第 04 章 入門 約 10 分鐘

插入排序:你打牌時做的事

拿一張新牌,往左邊已排好的牌堆裡塞——這就是插入排序。

建議先看過: 03-bubble-sort

你打牌時都這樣做

抽到 4,往左塞到對的位置手牌(已排序)257新牌4塞進 2 和 5 中間2457把 5、7 往右推一格,4 就有位置了。

抽到一張新牌,從手牌右邊往左掃,看到比它大的就把它往右推一格,找到對的位置塞進去。

插入排序就是這個動作的演算法版

動手看一遍

[5, 3, 8, 1, 4]

步驟已排序部分 (粗體)操作
初始[5, 3, 8, 1, 4]假設第 1 個自己排好了
拿 3[3, 5, 8, 1, 4]3 比 5 小,3 塞到 5 左邊
拿 8[3, 5, 8, 1, 4]8 比 5 大,不用動
拿 1[1, 3, 5, 8, 4]1 一路往左推到最前面
拿 4[1, 3, 4, 5, 8]4 插在 3 和 5 中間
💡關鍵直覺

左邊永遠是「已經排好」的,右邊是「還沒處理」的。 每次拿一張新牌,往左邊正確位置塞。

Pseudocode

Algorithm InsertionSort(A, n):
for i ← 1 to n-1:
key ← A[i] // 這次要插入的新牌
j ← i - 1
while j ≥ 0 and A[j] > key:
A[j+1] ← A[j] // 把大的往右推
j ← j - 1
A[j+1] ← key // 把 key 塞到正確位置

複雜度

情境Big-O為什麼
最壞(反向排序)O(n²)每張牌都要推到最左邊
平均O(n²)平均推一半
最好(已排序)O(n)每張牌一比就停
💡跟 Bubble Sort 比

Insertion Sort 在「幾乎已排序」時非常快——這是它比 Bubble Sort 強的地方。 所以實務上排「快接近排好」的資料,會選 Insertion Sort。

📝考試會這樣考

題型:給陣列,列出每一輪(每插入一張新牌後)的結果。

例:用 Insertion Sort 排 [6, 2, 5, 3, 9, 1],列出每輪結束後的狀態。

結束後
拿 2[2, 6, 5, 3, 9, 1]
拿 5[2, 5, 6, 3, 9, 1]
拿 3[2, 3, 5, 6, 9, 1]
拿 9[2, 3, 5, 6, 9, 1]
拿 1[1, 2, 3, 5, 6, 9]

陷阱:插入排序的「每一輪」是「插入新一張牌」,跟 Bubble Sort 的「每一輪冒泡」不一樣。 看清楚題目要的是哪種紀錄方式。

這章記住

  1. 左邊永遠排好的,新牌往左塞。
  2. 最壞 O(n²)、最好 O(n)(這點比 Bubble Sort 強)。
  3. 適合幾乎排好的資料。

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