我对合并排序算法中的合并方法有疑问。我从http://algs4.cs.princeton.edu/22mergesort/Merge.java.html复制了以下代码。我无法理解为什么我们需要复制正确的子数组。
这个说法
if (i > mid) index[k] = aux[j++];
将右子数组复制到右子数组上。所以它基本上会覆盖相同的值。我觉得如果我越过了中线
- 左子数组值是完全排序的。
- 右子数组也排序到 j。
- j(包括 j)之后的所有条目都已排序,并且辅助数组和原始数组(a)具有相同的条目。
所以看起来我们可以取消复制到右子数组的语句,如果我已经越过了中间。
或者,也许我错过了一个用例。如果你能弄清楚,请告诉我。
// code begins
private static void merge(Comparable[] a, int[] index, int[] aux, int lo, int mid, int hi) {
// copy to aux[]
for (int k = lo; k <= hi; k++) {
aux[k] = index[k];
}
// merge back to a[]
int i = lo, j = mid+1;
for (int k = lo; k <= hi; k++) {
if (i > mid) index[k] = aux[j++];
else if (j > hi) index[k] = aux[i++];
else if (less(a[aux[j]], a[aux[i]])) index[k] = aux[j++];
else index[k] = aux[i++];
}
}