希爾排序(Shell Sort)通過預設間隔分組插入排序,將元素大步長移動至大致位置,再縮小間隔逐步有序。本文提供標準 Java 實現與間隙序列選擇建議。
h(如 n/2, n/4, ..., 1)h=1 完成最終插入排序public static void shellSort(int[] arr) {
int n = arr.length;
for (int gap = n / 2; gap > 0; gap /= 2) { // 間隙序列:n/2, n/4, ...
for (int i = gap; i < n; i++) { // 插入排序起始位置
int temp = arr[i];
int j = i;
while (j >= gap && arr[j - gap] > temp) { // 組內插入排序
arr[j] = arr[j - gap];
j -= gap;
}
arr[j] = temp;
}
}
}
| 序列 | 公式 | 平均時間複雜度 | 備註 |
|---|---|---|---|
| Shell 原版 | n/2^k | O(n²) | 最差情況退化 |
| Hibbard | 2^k - 1 | O(n^1.5) | 較好 |
| Sedgewick | 4^k + 3·2^(k-1) + 1 | O(n^1.33) | 實踐推薦 |
| Knuth | (3^k - 1)/2 | O(n^1.5) | 教材常用 |