一尘不染

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

algorithm

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


阅读 294

收藏
2020-07-28

共1个答案

一尘不染

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

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

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

2020-07-28