在Arrays工作类里有sort()方法可以用来排序,jdk对所有基本类型设置设置了不同入参sort方法进行支持。
从源码上看,基本类型的排序都是使用了了DualPivotQuicksort的排序方法(我看的是jdk8,)。DualPivotQuicksort是快排的一种优化,具体在这里不展开了。
当参数类型为对象数组时,在原来的版本使用的归并排序(以后将会删除 ),现在使用的timSort。
public static void sort(Object[] a) {
if (LegacyMergeSort.userRequested)
legacyMergeSort(a);
else
ComparableTimSort.sort(a);
}
//以后会抛弃,也不展开了,大家可以自己去看下归并排序
/** To be removed in a future release. */
private static void legacyMergeSort(Object[] a) {
Object[] aux = a.clone();
mergeSort(aux, a, 0, a.length, 0);
}
所以排序主要用了 ComparableTimSort.sort(Object[] a)。分为下面几个主要步骤:
数组个数小于32的情况
- 判断数组的大小,小于32使用二分插入排序
static void sort(Object[] a, int lo, int hi) {
//检查lo,hi的的准确性
rangeCheck(a.length, lo, hi);
int nRemaining = hi - lo;
//当长度为0或1时永远都是已经排序状态
if (nRemaining < 2)
return;
// 数组小的时候
if (nRemaining < MIN_MERGE) {
//找出连续升序的最大个数
int initRunLen = countRunAndMakeAscending(a, lo, hi);
//二分插入排序
binarySort(a, lo, hi, lo + initRunLen);
return;
}
//数组大于32的时
......
- 找出最大的递增或者递减的个数,如果递减,则此段数组严格反一下方向
private static int countRunAndMakeAscending(Object[] a, int lo, int hi) {