【发布时间】:2013-04-13 08:41:23
【问题描述】:
我从昨天开始一直在阅读mergesort example(高效的),尽管查看了代码,但我仍然无法理解它是如何工作的:
private static void sort(int[] list) {
a = list;
int n = a.length;
// according to variant either/or:
b = new int[n];
b = new int[(n + 1) / 2];
mergesort(0, n - 1);
}
private static void mergesort(int first, int last) {
if (first < last) {
int mid = (first + last) / 2;
mergesort(first, mid);
mergesort(mid + 1, last);
merge(first, mid, last);
}
}
到目前为止,理解算法没有问题,但困惑在于以下方法:
private static void merge(int first, int mid, int last) {
int i, j, k;
i = 0;
j = first;
while (j <= mid)
b[i++] = a[j++]; // *j's value is now mid*
i = 0; // *i is reset to 0, nothing's been done to j*
k = first;
// *before entering the following while loop, j still carries mid's value*
while (k < j && j <= last)
if (b[i] <= a[j])
a[k++] = b[i++];
else
a[k++] = a[j++];
// copy back remaining elements of first half (if any)
while (k < j)
a[k++] = b[i++];
}
进入第二个while循环while (k < j && j <= last)是我不明白这种排序是如何工作的。据我了解,数组a的前半部分已经复制到辅助数组b,现在我们想通过比较a[j++](后半部分)和辅助数组@987654328来排列整个数组@ 这样我们就可以得到较小的数组元素,并将其放入数组a 中,对数组进行升序排序。
但为什么是while (k < j && j <= last)? k < j 听起来很合乎逻辑,因为我们需要从辅助数组中取回所有值,但为什么是 j <= last?为什么我们不能只做while (k <= last)?
另外,有人可以确认我对上述代码中 j 值的理解是正确的吗?
【问题讨论】:
-
可以从 URL 中删除 "。
标签: algorithm sorting merge while-loop mergesort