public static void sort(Object[] a) {
if (LegacyMergeSort.userRequested)
legacyMergeSort(a);
else
ComparableTimSort.sort(a);
}
if语句中的没看懂,这里就只说排序问题。
legacyMergeSort
方法将参数a
的克隆对象作为src,本身作为dest,调用mergeSort
方法,
Object[] aux = a.clone();
mergeSort(aux, a, 0, a.length, 0);
mergeSort
方法中,java定义了一个优化参数INSERTIONSORT_THRESHOLD=7
(不知道为啥是7)。对于长度小于7的数组,直接使用插入排序
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;
}
,而对于长度大于7的数组,使用归并排序,思路:
将数组分成两部分
对每一部分递归排序
int destLow = low;
int destHigh = high;
low += off;
high += off;
int mid = (low + high) >>> 1;
mergeSort(dest, src, low, mid, -off);
mergeSort(dest, src, mid, high, -off);
- 合并两个数组
for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
if (q >= high || p < mid && ((Comparable)src[p]).compareTo(src[q])<=0)
dest[i] = src[p++];
else
dest[i] = src[q++];
}
比较容易的情况是,如果第二步进行完以后得到的已经是一个有序数组,那么直接复制数组
if (((Comparable)src[mid-1]).compareTo(src[mid]) <= 0) {
System.arraycopy(src, low, dest, destLow, length);
return;
}
集合工具类Collections的sort方法就是使用了Arrays类的这个方法。
Object[] a = list.toArray();
Arrays.sort(a);