← 返回首頁

🔄 插入排序法

Insertion Sort - 可視化演示與詳細解釋

什麼是插入排序法?

插入排序法是一種簡單的排序演算法,透過將未排序的元素插入到已排序部分的正確位置來完成排序。

演算法特點

  • 簡單直觀:類似整理撲克牌的過程
  • 穩定排序:相等元素的相對位置不改變
  • 原地排序:不需要額外的記憶體空間
  • 適應性強:對於部分有序的陣列效率較高

排序原理

將陣列分為已排序和未排序兩部分,每次從未排序部分取出第一個元素,插入到已排序部分的正確位置。

互動演示

比較次數:0

交換次數:0

當前步驟:就緒

時間與空間複雜度

情景 時間複雜度 說明
最好情況 O(n) 陣列已排序,只需一次掃描
平均情況 O(n²) 隨機排列的陣列
最壞情況 O(n²) 陣列反向排序,需要最多比較
空間複雜度 O(1) 原地排序,僅需常數額外空間

詳細步驟

  1. 將陣列的第一個元素視為已排序部分
  2. 從第二個元素開始,取出當前元素
  3. 將當前元素與已排序部分的元素從右向左比較
  4. 如果當前元素小於已排序元素,將已排序元素向右移動
  5. 重複比較直到找到正確位置或到達陣列開頭
  6. 將當前元素插入到正確位置
  7. 重複步驟 2-6 直到所有元素排序完成

虛擬碼與實際程式碼對照

這裡展示 Insertion Sort 的主要邏輯,讓虛擬碼與 JavaScript 程式碼一一對應。

虛擬碼

function insertionSort(arr):
    for i in 1..length(arr)-1:
        key = arr[i]
        j = i - 1
        while j >= 0 and arr[j] > key:
            arr[j+1] = arr[j]
            j = j - 1
        arr[j+1] = key

JavaScript 對照

async function insertionSort() {
    const n = array.length;
    for (let i = 1; i < n; i++) {
        if (!isSorting) return;
        const key = array[i];
        let j = i - 1;
        while (j >= 0 && array[j] > key) {
            array[j + 1] = array[j];
            j--;
            render([], [j + 1], Array.from({ length: i }, (_, idx) => idx));
            await sleep(getDelay());
        }
        array[j + 1] = key;
    }
}

程式碼與動畫對應

const n = array.length;                    -> 取得資料長度,設定動畫資料範圍
const key = array[i];                       -> 選取目前待插入的長條,顯示高亮狀態
while (j >= 0 && array[j] > key) {         -> 比較待插入元素與已排序區域的元素
array[j + 1] = array[j];                    -> 向右移動已排序元素,動畫模擬元素後移
render(...);                                -> 更新畫面,顯示目前比較、移動與排序區域
array[j + 1] = key;                         -> 將待插入元素放回正確位置,顯示插入動畫

邊界條件(Boundary Conditions)

d:\zpj\workspace\sort_report\insertion_sort.html