【发布时间】:2013-06-06 17:46:49
【问题描述】:
我对合并排序算法中的合并方法有疑问。我从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++];
}
}
【问题讨论】:
-
您可能对 timsort 感兴趣,这是一种改进的合并排序。它使用两种不同的合并函数来进行就地合并。我听说 Python 和 Java 现在都在他们的标准库中使用了 timsort。
标签: java algorithm sorting mergesort