✅Arrays.sort是使用什么排序算法实现的?

典型回答

Arrays.sort是Java中提供的对数组进行排序的方法,根据参数类型不同,它提供了很多重载方法:

public static void sort(Object[] a) ;
public static void sort(byte[] a)
public static void sort(float[] a)
public static void sort(int[] a) 

而针对不同的参数类型,采用的算法也不尽相同,首先,对于比较常见的基本数据类型(如int、double、char等)的数组,就是采用JDK 1.7中引入的“双轴快速排序”(Dual-Pivot QuickSort)

    public static void sort(int[] a) {
        DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
    }

这里的DualPivotQuicksort.sort就是双轴快速排序的具体实现。

双轴快速排序是对传统快速排序的改进,它通过选择两个轴值来划分数组,并在每个划分区域中进行递归排序。这种算法通常比传统的快速排序更快,特别是在大量重复元素的情况下。双轴快速排序算法是在JDK7中引入的,并在后续版本中进行了优化和改进。

而针对另外一种类型,对于对象数组的排序,它支持两种排序方式,即归并排序和TimSort

// 1.7以前
public static void sort(Object[] a) {
    Object[] aux = (Object[])a.clone();
    mergeSort(aux, a, 0, a.length, 0);
}

// 1.7以后
public static void sort(Object[] a) {
    if (LegacyMergeSort.userRequested)
        legacyMergeSort(a);
    else
        ComparableTimSort.sort(a, 0, a.length, null, 0, 0);
}

/** To be removed in a future release. */
private static void legacyMergeSort(Object[] a) {
    Object[] aux = a.clone();
    mergeSort(aux, a, 0, a.length, 0);
}

这里面的MergeSort指的就是归并排序,这个算法是老版本中设计的,后续的版本中可能会被移除,新版本中主要采用TimSort算法。

TimSort 是一种混合排序算法,结合了归并排序(Merge Sort)和插入排序(Insertion Sort)的特点。

关于各种算法的原理和实现方式,因为不是我们八股文的重点,关于算法部分大家自行学习吧,这里就不展开了,大家想了解的可以自己去看一下相关算法的实现。

原文: https://www.yuque.com/hollis666/xkm7k3/zld6gp50xnp6p7vs