4

有人可以解释以下代码吗?

来源:Arrays.class,

public static <T> void sort(T[] a, Comparator<? super T> c) {
T[] aux = (T[])a.clone();
    if (c==null)
        mergeSort(aux, a, 0, a.length, 0);
    else
        mergeSort(aux, a, 0, a.length, 0, c);
}
  1. 为什么要创建辅助?
  2. 如果代码排序辅助,排序如何工作?
  3. 在排序之前克隆数组不是浪费资源吗?
4

3 回答 3

2

1:为什么要创建辅助?

因为该mergeSort方法需要一个源和目标数组。

2:如果代码排序辅助,排序如何工作?

因为mergeSort方法排序 aux a

3:在排序之前克隆数组不是很浪费资源吗?

不,它不是......使用mergeSort. 现在如果sort返回一个排序数组,做一个克隆(而不是创建一个空数组)将是浪费。但是 API 要求它进行就地排序,这意味着它a必须是“目的地”。因此,需要将元素复制到一个临时数组,该数组将成为“源”。

如果您看一下该mergeSort方法,您会发现它递归地对要排序的数组进行分区,在其源数组和目标数组之间向后和向前合并。为此,您需要两个数组。据推测,Sun / Oracle 已经确定该算法为典型的 Java 排序用例提供了良好的性能。

于 2010-11-16T01:30:08.250 回答
2

阅读mergeSort源代码

src这是具有两个参数(和dest)的非就地排序。
它对参数进行排序dest并使用src参数作为参考。

于 2010-11-16T01:22:24.513 回答
0

在该源文件中向下滚动并查看递归合并排序是如何工作的。我认为尝试在此处的帖子中进行解释有点过于复杂,因此这是一个很好的参考:

http://en.wikipedia.org/wiki/Merge_sort

于 2010-11-16T01:30:56.067 回答