为什么我们以自下而上的Merge排序“n + n”?

时间:2014-08-16 18:57:17

标签: java mergesort

在内循环的自底向上合并排序中,为什么需要:i + = n + n?我+ + n不会工作得很好吗?

http://algs4.cs.princeton.edu/22mergesort/MergeBU.java.html

 public static void sort(Comparable[] a) {
        int N = a.length;
        Comparable[] aux = new Comparable[N];
        for (int n = 1; n < N; n = n+n) {
            for (int i = 0; i < N-n; i += n+n) {
                int lo = i;
                int m  = i+n-1;
                int hi = Math.min(i+n+n-1, N-1);
                merge(a, aux, lo, m, hi);
            }
        }
        assert isSorted(a);
    }

3 个答案:

答案 0 :(得分:1)

Mergesort在外部循环的n = 1, 2, 4, ..., N/2次迭代中合并长度为1st, 2nd, 3rd, ..., (lg(N))th的已排序子数组。由于 2 相应的子数组已合并,因此索引必须增加2*n = 2, 4, 8, ..., N才能跳过刚刚合并的 子数组的索引。

答案 1 :(得分:0)

自下而上合并排序是合并排序的非递归变体,其中数组按一系列过程排序。在每次通过期间,阵列被分成大小为m的块(最初,m = 1,)。每两个相邻的块被合并(如在正常的合并排序中),并且下一次传递使用两倍大的m值,有效地将我们先前排序的(较小的)块合并在一起。

价:

http://www.algorithmist.com/index.php/Merge_sort

答案 2 :(得分:0)

外环循环遍历数字1,2,4,8,16等。内部循环合并排序大小为1,2,4,8等的所有子对数组。

在对一对大小为n的子数组进行排序后,下一对从n(子数组1的大小)+ n(子数组2的大小)+ i(当前子数组对的开始)开始。