为什么Java的Arrays.sort方法对不同类型的使用两种不同的排序算法?

2022-08-31 07:46:58

Java 6的方法对基元数组使用Quicksort,对对象数组使用合并排序。我相信大多数时候,快速排序比合并排序更快,并且消耗更少的内存。我的实验支持这一点,尽管两种算法都是O(n log(n))。那么,为什么不同的算法用于不同的类型呢?Arrays.sort


答案 1

最可能的原因:快速排序不稳定,即相等的条目可以在排序过程中改变它们的相对位置;除此之外,这意味着如果对已排序的数组进行排序,它可能不会保持不变。

由于基元类型没有标识(无法区分具有相同值的两个整数),这对于它们无关紧要。但对于引用类型,它可能会导致某些应用程序出现问题。因此,这些使用稳定的合并排序。

OTOH,不对基元类型使用(保证的n*log(n))稳定合并排序的一个原因可能是它需要克隆数组。对于引用类型,引用对象通常比引用数组占用更多的内存,这通常无关紧要。但对于基元类型,直接克隆数组会使内存使用量增加一倍。


答案 2

根据本答案中引用的Java 7 API文档,对于对象数组,现在使用TimSort,它是MergeSort和InjectSort的混合体。另一方面,对于基元数组,现在使用双透视快速排序。这些更改是从 Java SE 7 开始实现的。Arrays#Sort()Arrays#sort()