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

Java 在集合排序方法中内部使用哪种排序算法?,java,collections,Java,Collections,在collections类中,有一个方法sort()用于对集合元素进行排序,但我有一个疑问,在内部,使用哪个排序算法对元素进行排序。我用谷歌搜索了一下,但没有得到正确的答案。请帮帮我。根据(我的重点): 实现说明:此实现是一种稳定、自适应、迭代的mergesort 答案取决于您正在谈论的Java实现,以及您正在排序的数据结构类型 例如,集合的javadoc(在Java 6中)说明: 只要遵守规范本身,实现者应该可以随意替换其他算法(例如,sort使用的算法不必是mergesort,但必须是稳定的

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

根据(我的重点):

实现说明:此实现是一种稳定、自适应、迭代的mergesort


答案取决于您正在谈论的Java实现,以及您正在排序的数据结构类型

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

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

话虽如此,不同版本的javadocs对
Collections::sort
方法的描述如下:

Java 6:

排序算法是一种改进的mergesort(其中,如果低位子列表中的最高元素小于高位子列表中的最低元素,则忽略合并)。该算法提供有保证的n log(n)性能。此实现将指定的列表转储到数组中,对数组进行排序,并在列表上迭代,从数组中的相应位置重置每个元素。这避免了因尝试对链接列表进行适当排序而导致的n2日志(n)性能

对于“本机数组”(例如:ints)的排序,它使用“快速排序”,默认为小数据块/数组大小的插入排序

Java 7:

实现说明:此实现是一种稳定、自适应、迭代的mergesort,当输入数组部分排序时,需要的比较远远少于n lg(n),而当输入数组随机排序时,它提供了传统mergesort的性能。如果输入数组几乎已排序,则实现需要大约n次比较。临时存储要求从几乎排序的输入数组的小常量到随机排序的输入数组的n/2对象引用

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

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

此实现将指定的列表转储到数组中,对数组进行排序,并在列表上迭代,从数组中的相应位置重置每个元素。这避免了因尝试对链接列表进行适当排序而导致的n2日志(n)性能

对于“本机数组”(例如:ints)的排序,它使用“双枢轴快速排序”

Java 8:

Collections
javadoc遵从List::sort,这与上面引用的java7文本的内容相同。显然,Java8的“双枢轴快速排序”有一些小缺点

Java 9:

不变

Java 10:

对双枢轴快速排序进行了更多增强


还要注意,对于其他
sort
api,情况可能有所不同;e、 g.
数组
类中为基元数组定制的那些。例如,Java 9/
Arrays::sort(int[])
表示:

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

并行排序
方法又不同了



底线是,如果您想确定使用了哪种算法,请查看您正在使用的Java版本的源代码。

开放JDK源代码可以在线获得。尝试搜索“openjdk collections.sort”。在源代码之后,将重定向到使用Arrays.sort的List.sort,并带有“实现说明:此实现是一种稳定、自适应、迭代的mergesort,当输入数组部分排序时,需要的比较远远少于n lg(n)”让人好奇的是,“mergeSort”将“在未来的版本中删除”,而且“Timsort是一种混合稳定排序算法,源于合并排序和插入排序,设计用于处理多种真实数据。”-这是未来的impl。我不确定这个变化是什么时候发生的,但是来源。。好吧,你知道:有趣的是,所有对基本数字类型数组进行操作的
数组.sort
方法都使用双枢轴快速排序,而不是Timsort。我很好奇其中的区别——只涉及不属于较大对象一部分的数字的排序是否更可能涉及更随机的分布,而不太可能被部分排序?@AnilNivargi In Java 8u40 Timsort-我想人们可以说“mergesortish”?-是默认值,具体取决于“java.util.Arrays.useLegacyMergeSort”选项。不再调用实际的“mergeSort”方法。我不完全确定这是什么时候改变的,也没有特别的动力去回顾过去。而且,它也是特定于JVM的..感谢您澄清疑问@user2864740