Arrays.sort()有很多重载方法,这里以sort(int[] a)方法为例解析其中的排序算法。
public static void sort(int[] a) {
DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
}
DualPivotQuicksort翻译过来就是双轴快排,进入里面的sort方法
// Use Quicksort on small arrays
if (right - left < QUICKSORT_THRESHOLD) {
sort(a, left, right, true);
return;
}
首先判断数组的长度是否小于QUICKSORT_THRESHOLD,这个值为286,假设小于286,继续进入里面的sort方法
private static void sort(int[] a, int left, int right, boolean leftmost) {
int length = right - left + 1;
// Use insertion sort on tiny arrays
if (length < INSERTION_SORT_THRESHOLD) {
...
}
...
}
这里继续判断数组长度如果小于INSERTION_SORT_THRESHOLD,这个值为47,意味着如果数组长度小于47就使用插入排序。
小结:如果数组长度小于47,使用插入排序算法,如果大于47并且小于286,使用双轴快排算法。
若数组长度大于286,我们继续往下看
// Check if the array is nearly sorted
for (int k = left; k < right; run[count] = k) {
if (a[k] < a[k + 1]) { // ascending
while (++k <= right && a[k - 1] <= a[k]);
} else if (a[k] > a[k + 1]) { // descending
while (++k <= right && a[k - 1] >= a[k]);
for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
int t = a[lo]; a[lo] = a[hi]; a[hi] = t;
}
} else { // equal
for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
if (--m == 0) {
sort(a, left, right, true);
return;
}
}
}
/*
* The array is not highly structured,
* use Quicksort instead of merge sort.
*/
if (++count == MAX_RUN_COUNT) {
sort(a, left, right, true);
return;
}
}
// Check if the array is nearly sorted 判断数组的排序紧密性(连续性)
// use Quicksort instead of merge sort 如果排序紧密性(连续性)不好就使用归并排序
结论:
1,如果数组长度小于47,使用插入排序算法
2,如果数组长度大于47并且小于286,使用双轴快排算法。
3,如果数组长度大于286,排序的紧密性(连续性)不好,使用双轴快排
4,如果数组长度大于286,排序的紧密性(连续性)很好,使用归并排序
参考博客:https://my.oschina.net/u/1174461/blog/1916638