Arrays
正在使用方法DualPivotQuicksort
对原始数据类型进行排序,
和复杂类型分开 - 使用merge-sort。 (如果输入大小很小,则插入排序)。
DualPivotQuicksort
仍然在大输入尺寸上使用merge-sort,但是,它在一系列较小的输入尺寸上使用双快速排序。
我想知道的是 - 为什么在对原始类型和非原语类型进行排序时的策略存在差异?
算法的性能很大程度上取决于输入大小 - 而不是数据类型。
在基元上调用compareTo()
而不是简单的幅度比较(>,<,==)不会
在内存中烧掉额外的空间(因此不会因为内存空间而减慢绝对时间性能),这在运行时会很大。
为什么Arrays.sort()
方法对原始数据类型使用不同的排序策略,
对于复杂的数据类型?
TIA。
答案 0 :(得分:9)
因为排序引用类型保证为stable,而排序原语不需要(如此快速排序,可以使用非稳定排序算法;另一方面合并排序实际上是稳定的)。另请注意quicksort is generally more optimal than mergesort(另请参阅this),这解释了在对基元进行排序时利用它的原因。
来自Arrays.sort
:
此类保证稳定:由于排序,相同的元素不会被重新排序。