集合排序方法内部使用哪种排序算法?

时间:2017-08-27 05:55:48

标签: java collections

在collections类中有一个方法sort()用于对集合元素进行排序,但我有一个疑问,在内部使用哪种排序算法对元素进行排序。我用Google搜索但没有得到正确答案。请帮帮我。

2 个答案:

答案 0 :(得分:5)

答案取决于您所讨论的Java的实现,以及您要排序的数据结构的类型。

例如,集合的javadoc(在Java 6中)声明:

  

只要遵守规范本身,实现者就可以随意替换其他算法。 (例如,sort使用的算法不一定是mergesort,但它必须是稳定的。)

话虽如此,不同版本的javadoc说明了Collections::sort方法:

Java 6:

  

排序算法是修改后的mergesort(如果低子列表中的最高元素小于高子列表中的最低元素,则省略合并)。该算法提供有保证的n log(n)性能。此实现将指定的列表转储到数组中,对数组进行排序,并迭代列表,从数组中的相应位置重置每个元素。这样可以避免尝试对链接列表进行排序所导致的n2 log(n)性能。

为了排序“原生数组”(例如:ints),它使用“quicksort”,默认为小块/数组大小的插入排序。

Java 7:

  

实现注意事项:此实现是一个稳定的,自适应的迭代合并输出,当输入数组被部分排序时,需要远远少于n lg(n)的比较,同时在输入数组随机排序时提供传统mergesort的性能。如果输入数组几乎已排序,则实现需要大约n次比较。临时存储要求从几乎排序的输入数组的小常量到随机排序的输入数组的n / 2个对象引用不等。

     

该实现在其输入数组中具有升序和降序的相同优势,并且可以利用同一输入数组的不同部分中的升序和降序。它非常适合合并两个或多个排序数组:只需连接数组并对结果数组进行排序。

     

该实现改编自Tim Peters的Python排序(TimSort)。它使用了Peter McIlroy的“乐观排序和信息理论复杂性”中的技术,参见“第四届年度ACM-SIAM离散算法研讨会论文集”,第467-474页,1993年1月。

     

此实现将指定的列表转储到数组中,对数组进行排序,并迭代列表,从数组中的相应位置重置每个元素。这样可以避免尝试对链接列表进行排序所导致的n2 log(n)性能。

为了排序“原生数组”(例如:ints),它使用了“双枢轴快速排序”。

Java 8:

Collections javadoc遵循List :: sort,它与上面引用的Java 7文本相同。 Java 8的“双枢轴快速排序”显然有一些轻微enhancements

Java 9:

没有变化

Java 10:

对于双枢轴快速排序,更多增强功能已proposed

另请注意,其他sort API可能会有所不同;例如Arrays类中为基元数组量身定制的那些。例如,Java 9 / Arrays::sort(int[])说:

  

实施说明:排序算法是Vladimir Yaroslavskiy,Jon Bentley和Joshua Bloch的双枢轴快速算法。该算法在许多数据集上提供O(n log(n))性能,导致其他快速排序降级为二次性能,并且通常比传统(单枢轴)Quicksort实现更快。

parallelSort方法再次不同。

最重要的是,如果您希望确定使用哪种算法,请查看源代码以了解您正在使用的Java版本

答案 1 :(得分:4)

根据documentation(强调我的):

  

实施说明:此实施是稳定的,自适应的,迭代的 mergesort ......