Java6的Arrays.sort方法对基元数组使用快速排序,对对象数组使用合并排序。我相信在大多数情况下,快速排序比合并排序更快,而且占用的内存更少。我的实验支持这一点,尽管这两个算法都是O(n log(n))。那么为什么不同的类型使用不同的算法呢?
发布于 2010-09-14 16:33:19
最可能的原因是:快速排序不稳定,即相等的条目在排序过程中可能会改变它们的相对位置;此外,这意味着如果您对已经排序的数组进行排序,它可能不会保持不变。
由于原语类型没有标识(无法区分具有相同值的两个int),因此这对它们无关紧要。但是对于引用类型,这可能会给某些应用程序带来问题。因此,对这些数据使用稳定的合并排序。
OTOH,不对原始类型使用(保证n*log(n))稳定合并排序的一个原因可能是它需要克隆数组。对于引用类型,引用的对象通常比引用数组占用更多的内存,这通常无关紧要。但是对于原语类型,直接克隆数组会使内存使用量加倍。
发布于 2015-05-08 13:48:26
根据this answer中引用的Java7API文档,用于对象阵列的Arrays#Sort()现在使用TimSort,它是MergeSort和InsertionSort的混合体。另一方面,原语数组的Arrays#sort()现在使用Dual-Pivot QuickSort。这些更改是从Java SE 7开始实现的。
发布于 2010-09-14 16:33:36
我能想到的一个原因是,快速排序的最坏情况时间复杂度为O(n^2),而合并排序的最坏情况时间复杂度为O(n log n)。对于对象数组,有一个合理的预期是会有多个重复的对象引用,这是快速排序效果最差的一种情况。
有一个不错的visual comparison of various algorithms,特别要注意最右边的图,用于不同的算法。
https://stackoverflow.com/questions/3707190
复制相似问题