希爾排序是插入排序的改進版:
gap=1 時為標準插入排序,此時數組已近乎有序,極快完成。| 序列名 | 公式 | 最壞情況 | 備註 |
|---|---|---|---|
| Shell 原版 | N/2, N/4, ..., 1 | O(n²) | 簡單但非最優 |
| Hibbard | 2^k - 1 (1, 3, 7, 15...) | O(n^{3/2}) | 較好 |
| Sedgewick | 9·4^k - 9·2^k + 1 或 4^k - 3·2^k + 1 | O(n^{4/3}) | 實踐中最快之一 |
| Pratt | 2^i·3^j (1, 2, 3, 4, 6, 8, 9, 12...) | O(n log² n) | 理論最優但常數大 |
| Ciura (經驗最優) | 1, 4, 10, 23, 57, 132, 301, 701, 1750... | 未知 | 預計算表,工程首選 |
void shell_sort(int a[], int n) {
// 生成最大間距 < n
int h = 1;
while (h < n / 3) h = 3 * h + 1; // 1, 4, 13, 40, 121...
for (; h >= 1; h /= 3) {
// 對每個間距為 h 的子序列插入排序
for (int i = h; i < n; ++i) {
int tmp = a[i];
int j = i;
while (j >= h && a[j - h] > tmp) {
a[j] = a[j - h];
j -= h;
}
a[j] = tmp;
}
}
}
若 gap=1 不在最後,後續更大間距會打亂已排序的局部順序。gap=1 保證最終全局有序。
| 指標 | 希爾排序 | 快速排序 | 歸併排序 |
|---|---|---|---|
| 平均時間 | ~O(n^{1.3}) | O(n log n) | O(n log n) |
| 最壞時間 | O(n²) / O(n log² n) | O(n²) | O(n log n) |
| 空間 | O(1) | O(log n) | O(n) |
| 穩定 | 否 | 否 | 是 |
| 適用場景 | 中等規模、嵌入式、禁用遞歸 | 通用、大數據 | 外部排序、需穩定 |
希爾排序是「最簡單的非 O(n²) 排序」,通過預排序思想大幅提升插入排序效能。選擇優秀間距序列(Ciura/Sedgewick)可使其在中小規模數據(< 10⁵)上媲美快排,且代碼極短、無遞歸、原地排序,極適合嵌入式與系統級開發。