【问题标题】:Why java.util.Arrays uses Two Sorting Algorithms? [duplicate]为什么 java.util.Arrays 使用两种排序算法? [复制]
【发布时间】:2015-11-09 09:32:48
【问题描述】:

java.util.Arrays 对基本类型(例如 int)使用快速排序(实际上是最新版本中的双轴快速排序),对实现 Comparable 或使用 Comparator 的对象使用合并排序。 为什么有区别? 为什么不选择一个并将其用于所有情况?

【问题讨论】:

    标签: java arrays sorting quicksort comparator


    【解决方案1】:

    很好的解释here:-

    快速排序在这两种情况下都更快。合并排序在这两种情况下都是稳定的。 但是对于原始类型,快速排序也很稳定!那是因为 Java中的原始类型就像量子中的基本粒子 力学。你无法区分一个 7 和另一个 7。 他们的价值就是定义他们的一切。对数组进行排序,例如 [7, 6, 6, 7, 6, 5, 4, 6, 0] 变成 [0, 4, 5, 6, 6, 6, 6, 7, 7]。你不仅不 关心哪个 6 最终处于哪个位置。这是一个毫无意义的问题。 数组位置不保存指向对象的指针。他们持有 对象的实际值。我们不妨说所有 原始值被丢弃并替换为新值。或不。 这根本不重要。没有办法告诉你 稳定排序和不稳定排序的输出之间的差异 当所有排序的都是原始类型时的算法。稳定性是 与 Java 中的原始类型无关。

    【讨论】:

    • 合并排序比快速排序执行更多移动,但比较次数更少。如果比较开销比移动开销大得多,那么归并排序会更快。对于具有 16 个通用寄存器的处理器,例如 64 位模式下的 X86 / X64,4 路归并排序与快速排序一样快,但我怀疑 Java 是否使用 4 路归并排序。
    【解决方案2】:

    我认为原因是稳定性。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-28
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      相关资源
      最近更新 更多