維護前 k-1 有序,插入第 k 個元素。兩種掃描方向:
≥ a[k],插前面。≤ a[k],插後面,元素右移。void InsertionSort(int a[], int n) {
for (int i = 1; i < n; i++) {
int tmp = a[i], j = i - 1;
while (j >= 0 && a[j] > tmp) {
a[j+1] = a[j];
j--;
}
a[j+1] = tmp;
}
}
分組插入排序,步長 gap = n/2, n/4, ..., 1。每組獨立插入排序,最後 gap=1 為全量插入排序。
void ShellSort(int a[], int n) {
for (int gap = n/2; gap > 0; gap /= 2) {
for (int k = 0; k < gap; k++) { // 每組
for (int i = k+gap; i < n; i += gap) {
int tmp = a[i], j = i - gap;
while (j >= 0 && a[j] > tmp) {
a[j+gap] = a[j];
j -= gap;
}
a[j+gap] = tmp;
}
}
}
}
| 算法 | 最好 | 平均 | 最壞 | 空間 | 穩定 |
|---|---|---|---|---|---|
| 插入排序 | O(N) | O(N²) | O(N²) | O(1) | ✅ |
| 希爾排序 | O(N log N) | O(N^1.25~1.5) | O(N²) | O(1) | ❌ |