希尔排序,3h + 1
来源:2-7 更多关于O(n^2)排序算法的思考
诺巴蒂
2020-03-30
public static void sort(Comparable[] arr){
int n = arr.length;
// 计算 increment sequence: 1, 4, 13, 40, 121, 364, 1093...
int h = 1;
while (h < n/3) h = 3*h + 1;
while (h >= 1) {
// h-sort the array
for (int i = h; i < n; i++) {
// 对 arr[i], arr[i-h], arr[i-2*h], arr[i-3*h]... 使用插入排序
Comparable e = arr[i];
int j = i;
for ( ; j >= h && e.compareTo(arr[j-h]) < 0 ; j -= h)
arr[j] = arr[j-h];
arr[j] = e;
}
h /= 3;
}
}
为啥这么算出的增量序列,while 循环最后 h 一定是 1.x 而不会是 0.x
写回答
1回答
-
因为我们的 h 是这么算出来的:while (h < n/3) h = 3*h + 1;
倒推回去,不断地除以 3,最终结果肯定是 1。
继续加油!:)
052020-03-31
相似问题