为什么java.util.Arrays使用两种排序算法?

时间:2015-11-09 09:32:49

标签: java arrays sorting quicksort comparator

java.util.Arrays使用quicksort(实际上是最新版本中的双透视快速排序)用于原始类型,例如int和mergesort,用于实现Comparable或使用Comparator的对象。 为什么不同? 为什么不选择一个并在所有情况下使用它?

2 个答案:

答案 0 :(得分:3)

一个很好的解释here: -

  

两种情况下Quicksort都更快。 Mergesort在两种情况下都很稳定。   但对于原始类型,quicksort也是稳定的!那是因为   Java中的原始类型就像量子中的基本粒子   力学。你不能分辨出7和7之间的区别。   它们的价值就是定义它们。排序数组[7,6,6,7,   6,5,4,6,0]分为[0,4,5,6,6,6,6,7,7]。你不仅没有   关心哪个6最终处于哪个位置。这是一个毫无意义的问题。   数组位置不包含指向对象的指针。他们持有   对象的实际值。我们不妨说所有的   原始值被丢弃并替换为新值。或不。   它根本没关系。你无从谈论   稳定和不稳定排序的输出之间的差异   所有排序的算法都是原始类型。稳定性是   与Java中的原始类型无关。

答案 1 :(得分:0)

我认为原因是稳定性。

基元没有标识,因此无法区分具有相同值的2个整数。这不是引用类型的情况,这可能会有问题,因为快速排序可能会改变它们的相对位置,这就是使用更稳定的合并排序的原因。

此外,不使用n * log n作为基元可能是因为它需要克隆数组。对于引用类型,它并不重要,因为它们的对象数组通常比相应的引用数组大。但是,对于原语,clonning使用双重内存。