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