【发布时间】:2015-11-09 09:32:48
【问题描述】:
java.util.Arrays 对基本类型(例如 int)使用快速排序(实际上是最新版本中的双轴快速排序),对实现 Comparable 或使用 Comparator 的对象使用合并排序。 为什么有区别? 为什么不选择一个并将其用于所有情况?
【问题讨论】:
标签: java arrays sorting quicksort comparator
java.util.Arrays 对基本类型(例如 int)使用快速排序(实际上是最新版本中的双轴快速排序),对实现 Comparable 或使用 Comparator 的对象使用合并排序。 为什么有区别? 为什么不选择一个并将其用于所有情况?
【问题讨论】:
标签: java arrays sorting quicksort comparator
很好的解释here:-
快速排序在这两种情况下都更快。合并排序在这两种情况下都是稳定的。 但是对于原始类型,快速排序也很稳定!那是因为 Java中的原始类型就像量子中的基本粒子 力学。你无法区分一个 7 和另一个 7。 他们的价值就是定义他们的一切。对数组进行排序,例如 [7, 6, 6, 7, 6, 5, 4, 6, 0] 变成 [0, 4, 5, 6, 6, 6, 6, 7, 7]。你不仅不 关心哪个 6 最终处于哪个位置。这是一个毫无意义的问题。 数组位置不保存指向对象的指针。他们持有 对象的实际值。我们不妨说所有 原始值被丢弃并替换为新值。或不。 这根本不重要。没有办法告诉你 稳定排序和不稳定排序的输出之间的差异 当所有排序的都是原始类型时的算法。稳定性是 与 Java 中的原始类型无关。
【讨论】:
我认为原因是稳定性。
基元没有标识,因此无法区分具有相同值的 2 个整数。这不是引用类型的情况,这可能会产生问题,因为快速排序可能会改变它们的相对位置,这就是使用更稳定的合并排序的原因。
另外,不使用 n*log n 作为原语可能是因为它需要一个数组的克隆。对于引用类型,这并不重要,因为它们的对象数组通常比相应的引用数组大。但是,对于基元,克隆会使用双倍内存。
【讨论】: