將陣列分為 **已排序區** 與 **未排序區**,每次從未排序區取首元素,在已排序區中 **從右向左** 找到插入位置,向右移動元素騰出空位,插入該元素。
#include <stdio.h>
#define N 10
void insertion_sort_desc(int a[], int n) {
for (int i = 1; i < n; i++) {
int key = a[i];
int j = i - 1;
// 已排序區 a[0..i-1] 為降序,找第一個 >= key 的位置
while (j >= 0 && a[j] < key) {
a[j + 1] = a[j]; // 向右移動
j--;
}
a[j + 1] = key; // 插入
}
}
int main() {
int a[N];
printf("請輸入 %d 個整數:", N);
for (int i = 0; i < N; i++) scanf("%d", &a[i]);
insertion_sort_desc(a, N);
printf("降序結果:");
for (int i = 0; i < N; i++) printf("%d ", a[i]);
putchar('\n');
return 0;
}
i=1: [5] 2 → [5, 2]
i=2: [5, 2] 9 → [9, 5, 2]
i=3: [9, 5, 2] 1 → [9, 5, 2, 1]
i=4: [9, 5, 2, 1] 5 → [9, 5, 5, 2, 1]
i=5: [9, 5, 5, 2, 1] 6 → [9, 6, 5, 5, 2, 1]
...
最終: [9, 8, 7, 6, 5, 5, 4, 3, 2, 1]
| 指標 | 數值 | 說明 |
|---|---|---|
| 時間複雜度 | O(n²) | 最好 O(n) (已排序),最壞 O(n²) (逆序) |
| 空間複雜度 | O(1) | 原地排序 |
| 穩定性 | 穩定 | 相等元素相對順序不變 |
| 適應性 | 強 | 近乎有序數據極快 |
O(n) 查找降為 O(log n),**移動元素仍 O(n)**,總體仍 O(n²) 但常數因子降低。