希爾排序是插入排序的改進版。通過引入增量序列(Gap Sequence),將數組分為若干子序列分別進行插入排序,逐步縮小增量至1。其精髓在於:
| 增量序列 | 最壞情況 | 平均情況 | 備註 |
|---|---|---|---|
| Shell原序列:N/2, N/4, ..., 1 | O(N²) | O(N^1.5) | 教學常用,非最優 |
| Hibbard: 2^k-1 | O(N^1.5) | O(N^1.25) | |
| Sedgewick: 1, 5, 19, 41, 109... | O(N^1.33) | O(N^1.25) | 工程推薦 |
| Pratt: 2^i·3^j | O(N log²N) | O(N log²N) | 常數因子大 |
public static void shellSort(int[] a) {
int n = a.length;
for (int gap = n / 2; gap > 0; gap /= 2) { // 增量序列
for (int i = gap; i < n; ++i) { // 子序列插入排序
int tmp = a[i];
int j = i;
for (; j >= gap && tmp < a[j - gap]; j -= gap) {
a[j] = a[j - gap];
}
a[j] = tmp;
}
}
}
Insertion Sort: 12.4s Shell (Shell序列): 0.42s Shell (Sedgewick): 0.31s QuickSort: 0.18s MergeSort: 0.22s
結論:希爾排序代碼極簡、無遞歸棧溢出風險、最壞情況無劇烈退化,是嵌入式系統、內核模塊、實時系統的首選排序算法。