【问题标题】:Why use two different algorithm for sorting arrays?为什么使用两种不同的算法对数组进行排序?
【发布时间】:2011-07-21 15:39:58
【问题描述】:

在 Arrays 类中,快速排序用于对基元进行排序,但用于对对象进行排序,它是归并排序。

不知道为什么会这样?

【问题讨论】:

  • 你能提供一个链接到你所说的 Java 实现吗?这不是 JLS 强制要求的。
  • @templatetypedef 它不是强制性的,而是“实施说明”,在 sun 的实施中就是这种情况。 Arrays 的 javadoc 清除了这一点。
  • @Bozho- 我同意...我的问题主要是这是在 Sun 的实现中,还是在 OpenJDK 等中,所以我可以自己提取源代码。

标签: java arrays algorithm sorting


【解决方案1】:

使用归并排序的原因是他们想要一个稳定的算法——例如其中相等的对象(compareTo()compare())与以前的相对顺序相同。

对于原语,相等意味着“不可区分的能力”。将{5, 3, 5} 排序为{3, 5, 5} 时,之前的第一个是哪一个并不重要。 所以我们可以在这里使用更快(且不稳定)的快速排序算法。

【讨论】:

    【解决方案2】:

    只是一个猜测,但在最坏的情况下快速排序是 O(n^2),而归并排序是稳定的(保证 O(n log n))。

    快速排序的最坏情况是由相等的值触发的。相等的原语是相同的,而“相等”的对象可能不是。

    【讨论】:

    • 稳定(保证 O(n log n)) - 稳定与悲观复杂度无关。稳定的排序算法保持被认为相等的项目的顺序。
    • 你是对的。放屁,抱歉 :) 但是,合并排序比快速排序返回更多可预测的执行时间,快速排序可以从 O(n log n) 到 O(n^2) 变化。这就是我的意思,我不应该在谈论排序算法时使用稳定这个词^^
    • 而且你必须仔细设计你的输入数据(尽管这可能是一个问题..对于 DDOS 来说是一种非常有趣的方式)才能接近 O(n^2) 以便快速排序通常比归并排序更快,因为井常数很重要。不,原因只是没有有效的快速排序实现是稳定的,这是 java 库的一个条件。
    猜你喜欢
    • 2011-04-12
    • 1970-01-01
    • 2011-11-27
    • 2022-01-12
    • 2022-06-13
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多