插入排序模擬整理撲克牌:將未排序元素插入已排序區間適當位置。對近乎有序資料極其高效,是混合排序(如 Timsort、Introsort)的核心組件。本文提供過程圖解、標準實作與複雜度分析。
初始: 10 3 8 0 6 9 2 取 3: 3 10 | 8 0 6 9 2 取 8: 3 8 10 | 0 6 9 2 取 0: 0 3 8 10 | 6 9 2 取 6: 0 3 6 8 10 | 9 2 取 9: 0 3 6 8 9 10 | 2 取 2: 0 2 3 6 8 9 10
#include <iostream>
using namespace std;
void InsertSort(int arr[], int len) {
for (int i = 1; i < len; ++i) {
int key = arr[i];
int j = i - 1;
while (j >= 0 && key < arr[j]) {
arr[j + 1] = arr[j]; // 向右平移
--j;
}
arr[j + 1] = key; // 插入空位
}
}
int main() {
int arr[] = {9, 2, 8, 2, 3, 2, 4, 10, 34, 5};
InsertSort(arr, 10);
for (int v : arr) cout << v << ' '; // 2 2 2 3 4 5 8 9 10 34
}
| 指標 | 數值 | 說明 |
|---|---|---|
| 時間複雜度 | O(N²) | 最好 O(N)(已有序),最壞 O(N²)(逆序),平均 O(N²) |
| 空間複雜度 | O(1) | 原地排序 |
| 穩定性 | 穩定 | 相等元素不交換順序(key < arr[j] 而非 <=) |
| 線上演算法 | 是 | 可邊讀取邊排序,適合串流資料 |
binary_search 找插入位置 O(log N),但移動元素仍需 O(N),總體仍 O(N²),僅減少比較次數。插入排序雖屬 O(N²) 類,但其適應性極強:最好 O(N)、穩定、原地、線上、小資料快、近乎有序極快。現代高效排序庫無一不內建插入排序作為小區間/近乎有序資料的底層引擎。