请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

希尔排序,3h + 1

 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 12:09:12

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


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


继续加油!:)

0 回复 有任何疑惑可以回复我~
  • 提问者 诺巴蒂 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2020-03-30 13:46:11
  • 提问者 诺巴蒂 #2
    还有我用 js 写这章节的代码,得出的时间好像不是 n^2,这个误差是和语言本身有关吗
    回复 有任何疑惑可以回复我~ 2020-03-30 13:47:55
  • liuyubobobo 回复 提问者 诺巴蒂 #3
    希尔排序本身的时间复杂度不是 n^2 的,是近似于 n*sqrt(n) 的。如果你的测试结果比插入或者选择排序要快,是正常的。
    回复 有任何疑惑可以回复我~ 2020-03-30 14:44:06
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信