是否有关于如何实现Arrays.sort(Object [] a)使用的mergeSort的资源?虽然它记录得非常好,但我很难理解它(特别是为什么在递归调用mergeSort()时会切换src和dest。)
答案 0 :(得分:11)
java.util.Arrays
的
实际上,您在JDK中拥有该源代码 - 只需在IDE中打开java.util.Arrays
,即可显示源代码+注释。如果您没有IDE,请查看JDK_HOME\src.zip
然后,将它放在IDE中并跟踪其工作原理。
System.out.println(..)
// Recursively sort halves of dest into src
答案 1 :(得分:0)
我和你有同样的困惑。根据我的理解,这种切换的原因非常简单 - 使合并后的步骤更容易。没有魔力。
private static void mergeSortWithoutSwitch(Object[] src, Object[] dest, int low, int high, int off) {
int length = high - low;
// Insertion sort on smallest arrays
if (length < INSERTIONSORT_THRESHOLD) {
for (int i = low; i < high; i++)
for (int j = i; j > low && ((Comparable) dest[j - 1]).compareTo(dest[j]) > 0; j--)
swap(dest, j, j - 1);
return;
}
// Recursively sort halves of dest into src
int destLow = low;
int destHigh = high;
low += off;
high += off;
int mid = (low + high) >>> 1;
mergeSortWithoutSwitch(src, dest, low, mid, off);
mergeSortWithoutSwitch(src, dest, mid, high, off);
// If list is already sorted, just copy from src to dest. This is an
// optimization that results in faster sorts for nearly ordered lists.
if (((Comparable) dest[mid - 1]).compareTo(dest[mid]) <= 0) {
return;
}
// Merge sorted halves (now in src) into dest
for (int i = destLow, p = low, q = mid; i < destHigh; i++) {
if (q >= high || p < mid && ((Comparable) dest[p]).compareTo(dest[q]) <= 0)
src[i] = dest[p++];
else
src[i] = dest[q++];
}
// copy back
for (int i = destLow; i < destHigh; i++) {
dest[i] = src[i];
}
}
上面是没有切换的实现,从代码中,你可以看到我们需要再合并一步 - 复制回来。我认为mergeSort中的参数命名有点混乱,因为src是辅助数组,仅用于合并步骤,最好用aux命名它(我们甚至可以从方法签名中删除它,并创建一个局部变量合并时)。而dest是结果数组。