一. 简介
Arrays.sort()方法,是我们常用排序方法,所在包 java.util.Arrays; 该方法提供了对所有类型的排序方法,不同类型采用的排序策略也不尽相同。今天我们一起来讨论下关于Arrays.sort()对不同类型排序的支持和策略,和对不同类型的排序又做了哪些优化。
如下是JDK1.8的Arrays.sort()方法:
二. 源码解析
1.对Primitive的支持
在对原生类型的排序支持上,JDK使用的是一种叫做 双轴快速排序的排序方法:DualPivotQuicksort.sort,相信很多人和我一样,是第一次看到这个名词,我们结合Arrays.sort对int数组的排序好好了解下这个排序:
DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
* Sorts the specified array into ascending numerical order.
我们从这个注解可以看出,排序是默认按照升序排列的。
This algorithm * offers O(n log(n)) performance on many data sets that cause other * quicksorts to degrade to quadratic performance, and is typically * faster than traditional (one-pivot) Quicksort implementations.同样,从该注释中我们看出,该算法同样提供 O(nlog(n))复杂度,但是比普通的单轴快排性能更优。
点进去,可以看到,当传参数组小于一个Constant值的时候,会进行双轴快速排序 sort()
// Use Quicksort on small arrays if (right - left < QUICKSORT_THRESHOLD) { sort(a, left, right, true); return; }
这个值为
private static final int QUICKSORT_THRESHOLD = 286;使用sort()方法,点进去看,我们发现同样当需要排序的范围小于一个阈值时,会采用插入排序
if (length < INSERTION_SORT_THRESHOLD) {这个阈值为:
private static final int INSERTION_SORT_THRESHOLD = 47;我们知道插入排序不用去遍历整个数组,整个排序算法的核心性能消耗即是移位,当数组过大之后,会导致进行大量的移位操作,但是当数组较小的时候,插入排序的效果反倒会更好。
使用插入排序有值得提的地方即使,在调用sort()方法的时候,传入了一个布尔值leftmost,