希尔排序,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回答

liuyubobobo

2020-03-30

因为我们的 h 是这么算出来的:while (h < n/3) h = 3*h + 1;


倒推回去,不断地除以 3,最终结果肯定是 1。


继续加油!:)

0
5
liuyubobobo
回复
诺巴蒂
如果你确认你的实现没有问题的话,就是语言解析的差异。继续加油!:)
2020-03-31
共5条回复

算法与数据结构(C++版) 面试/评级的算法复习技能包

课程专为:短时间内应对面试、升职测评等艰巨任务打造

11187 学习 · 1614 问题

查看课程