首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Java的Arrays.sort方法对不同的类型使用两种不同的排序算法?

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

Stack Overflow用户
提问于 2010-09-14 16:23:48
回答 6查看 53.7K关注 0票数 140

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-09-14 16:33:19

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

由于原语类型没有标识(无法区分具有相同值的两个int),因此这对它们无关紧要。但是对于引用类型,这可能会给某些应用程序带来问题。因此,对这些数据使用稳定的合并排序。

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

票数 236
EN

Stack Overflow用户

发布于 2015-05-08 13:48:26

根据this answer中引用的Java7API文档,用于对象阵列的Arrays#Sort()现在使用TimSort,它是MergeSort和InsertionSort的混合体。另一方面,原语数组的Arrays#sort()现在使用Dual-Pivot QuickSort。这些更改是从Java SE 7开始实现的。

票数 34
EN

Stack Overflow用户

发布于 2010-09-14 16:33:36

我能想到的一个原因是,快速排序的最坏情况时间复杂度为O(n^2),而合并排序的最坏情况时间复杂度为O(n log n)。对于对象数组,有一个合理的预期是会有多个重复的对象引用,这是快速排序效果最差的一种情况。

有一个不错的visual comparison of various algorithms,特别要注意最右边的图,用于不同的算法。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3707190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档