一、Arrays.sort() 四种重载方法
1.1 Arrays.sort(T[] a)
对一个数组a中全部元素按升序排序
1.2 Arrays.sort(T[] a, int fromIndex, int toIndex)
对一个数组a中下标为 fromIndex 到 toIndex - 1的元素升序排序。
1.3 Arrays.sort(T[] a, Comparator<? super T> c)
//降序
Integer[] arr = {....};
//写法一
Arrays.sort(arr, new Comarator<Integer>() {
public int compare(Integer a, Integer b) {
return b - a;
}
});
//写法二
Arrays.sort(arr, (a, b) -> b - a);
注意:自定义排序内是相减,int边界上的值相加减不一定在int范围内
根据指定比较器产生的顺序对指定对象数组的指定对象数组进行排序。
场景:给定两个数组,int A[],int B[]。排序按A升序,相同则按B升序。
var ids = new Integer[n];
for (int i = 0; i < n; i++)
ids[i] = i;
Arrays.sort(ids, (i, j) -> A[i] != B[j]? A[i] - A[j]: B[i] - B[j]);
ids内元素为A数组对应的元素值排序结果。
1.4 Arrays.sort(T[] a, int formIndex, int toIndex, Comparator<? supre T> c)
根据指定比较器产生的顺序对指定对象数组的指定对象数组进行排序。
二、Arrays.sort() 方法中的排序算法
主要涉及三种排序算法:双轴快速排序(DualPivotQuicksort)、归并排序(MergeSort)、TimSort,同时也包含一些非基于比较的排序算法:例如基数排序。
具体使用哪种排序算法需要根据类型、输入长度来动态抉择。
2.1 基础数据类型
采用 双轴快速排序、基数排序
public static void sort(int[] a) {
DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
}
2.2 包装类型
采用归并排序或TimSort,默认采用TimSort
public static void sort(Object[] a) {
if (LegacyMergeSort.userRequested)
legacyMergeSort(a);
else
ComparableTimSort.sort(a, 0, a.length, null, 0, 0);
}
public static <T> void sort(T[] a, Comparator<? super T> c) {
if (c == null) {
sort(a);
} else {
if (LegacyMergeSort.userRequested)
legacyMergeSort(a, c);
else
TimSort.sort(a, 0, a.length, c, null, 0, 0);
}
}
/** To be removed in a future release. */
private static <T> void legacyMergeSort(T[] a, Comparator<? super T> c) {
T[] aux = a.clone();
if (c==null)
mergeSort(aux, a, 0, a.length, 0);
else
mergeSort(aux, a, 0, a.length, 0, c);
}