【问题标题】:Arrays.sort() -- two different strategies for primitive & complex data types to be sortedArrays.sort() -- 两种不同的原始和复杂数据类型排序策略
【发布时间】:2014-08-02 02:32:49
【问题描述】:

Arrays 正在使用DualPivotQuicksort 方法对原始数据类型进行排序, 和复杂类型分开 - 使用合并排序。 (如果输入大小很小,则插入排序)。

DualPivotQuicksort 仍在对较大的输入大小使用合并排序,但是,它在一系列较小的输入大小上使用双快速排序。

我想知道的是——为什么在排序原始类型和非原始类型的策略上有这种差异?

算法的性能很大程度上取决于输入大小,而不是数据类型。 调用compareTo() 而不是对基元(>、

为什么Arrays.sort() 方法对原始数据类型使用不同的排序策略, 对于复杂的数据类型?

TIA。

【问题讨论】:

  • 对象比较最终可能比原始比较昂贵得多的事实可能起到了作用。我对 Timsort 和双轴快速排序都不熟悉,所以我不能肯定。 javadoc 确实提到了 Timsort 的许多比较优势,但鉴于其他类型没有这样的东西,我无法得出任何结论。

标签: java arrays sorting data-structures


【解决方案1】:

因为排序引用类型保证是stable,而排序原语不需要是(所以可以使用快速排序,一种不稳定的排序算法;另一方面,归并排序实际上是稳定的)。另请注意quicksort is generally more optimal than mergesort(也请参阅this),这解释了为什么在对原语进行排序时会利用它。

来自Arrays.sort

这种排序保证稳定:相同的元素不会因为排序而重新排序。

【讨论】:

  • +1。比我脑海中的混乱更简单的解释。
猜你喜欢
  • 2011-04-12
  • 2010-09-15
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多