希尔排序由 Donald Shell 于 1959 年提出,是对直接插入排序的改进。其核心思路:
增量序列常见选择:经典 $d = n/2, n/4, \dots, 1$;Hibbard $1,3,7,15,\dots,2^k-1$;Sedgewick $1,5,19,41,109,\dots$
void ShellSort(int A[], int n) {
int i, j, d, temp;
for (d = n / 2; d >= 1; d /= 2) { // 初始增量 n/2,每次减半
for (i = d; i < n; i++) {
if (A[i] < A[i - d]) {
temp = A[i];
for (j = i - d; j >= 0 && A[j] > temp; j -= d)
A[j + d] = A[j]; // 子序列内后移(步长 d)
A[j + d] = temp;
}
}
}
}
对 {49, 38, 65, 97, 76, 13, 27, 49*},初始 $d = 8/2 = 4$:
4 个子序列:{49,76}、{38,13}、{65,27}、{97,49*},分别插入排序 → 49, 13, 27, 49*, 76, 38, 65, 97
2 个子序列:{49,27,76,65}、{13,49*,38,97} → 27, 13, 49, 38, 65, 49*, 76, 97
整体插入排序 → 13, 27, 38, 49, 49*, 65, 76, 97
| 情况 | 时间复杂度 | 说明 |
|---|---|---|
| 最坏 | $O(n^2)$ | 希尔增量 $n/2,n/4,\dots,1$ |
| 一般 | $O(n^{1.3})$ | 希尔增量序列 |
| Sedgewick | $O(n^{4/3})$ | Sedgewick 增量 |
| 空间 | $O(1)$ | 原地排序 |
{3, 1, 3*, 2}。(暂无关联知识点)