Java的默认排序算法。。
JDK 中 Arrays.sort() 对于原始数据类型,目前使用的是所谓双轴快速排序(Dual-Pivot QuickSort),是一种改进的快速排序算法,早期版本是相对传统的快速排序。
而对于对象数据类型,目前则是使用TimSort,思想上也是一种归并和二分插入排序(binarySort)结合的优化排序算法。TimSort 并不是 Java 的独创,简单说它的思路是查找数据集中已经排好序的分区,然后合并这些分区来达到排序的目的。
双轴快速排序(Dual-Pivot QuickSort)源码
// 调优变量
private static final int INSERTIONSORT_THRESHOLD = 7;
// off 偏移量,默认传0,不用管了。。
@SuppressWarnings({"unchecked", "rawtypes"})
private static void mergeSort(Object[] src,
Object[] dest,
int low,
int high,
int off) {
int length = high - low;
// 数组长度小于调优变量值时,用插入排序
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;
}
// 开始递归调用
int destLow = low;
int destHigh = high;
low += off;
high += off;
int mid = (low + high) >>> 1;
// src 复制给 dest,dest 复制给 src,来回复制
mergeSort(dest, src, low, mid, -off);
mergeSort(dest, src, mid, high, -off);
// 如果 list 有序,把 src 复制到 dest。
if (((Comparable)src[mid-1]).compareTo(src[mid]) <= 0) {
System.arraycopy(src, low, dest, destLow, length);
return;
}
// 左右两部分都是有序的了,归并两部分,在两边开始遍历,选小的一个放到目标数组。
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++];
}
}
// 交换
private static void swap(Object[] x, int a, int b) {
Object t = x[a];
x[a] = x[b];
x[b] = t;
}