Arrays.sort(Object [] a) - 它是如何实现的?

时间:2010-02-07 19:45:16

标签: java algorithm mergesort

是否有关于如何实现Arrays.sort(Object [] a)使用的mergeSort的资源?虽然它记录得非常好,但我很难理解它(特别是为什么在递归调用mergeSort()时会切换src和dest。)

2 个答案:

答案 0 :(得分:11)

java.util.Arrays

Here is the source

实际上,您在JDK中拥有该源代码 - 只需在IDE中打开java.util.Arrays,即可显示源代码+注释。如果您没有IDE,请查看JDK_HOME\src.zip

然后,将它放在IDE中并跟踪其工作原理。

  • 放置断点(并以调试模式运行程序)
  • 使用System.out.println(..)
  • 更改部分内容以了解它们的反映方式。
  • 阅读wikipedia article about merge sort
  • 注意此评论:// 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是结果数组。