在内循环的自底向上合并排序中,为什么需要: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);
}
答案 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值,有效地将我们先前排序的(较小的)块合并在一起。
价:
答案 2 :(得分:0)
外环循环遍历数字1,2,4,8,16等。内部循环合并排序大小为1,2,4,8等的所有子对数组。
在对一对大小为n的子数组进行排序后,下一对从n(子数组1的大小)+ n(子数组2的大小)+ i(当前子数组对的开始)开始。