什么是Java的排序算法

java如何在内部对数据类型进行排序?为什么? 如果能够提到具体的算法,那就太好了

从版本7开始,Oracle的Java实现将Timsort用于大于10个元素的对象数组,对于具有少于该元素数量的数组使用Insertion排序 。 相同的注意事项适用于Arrays.sort()Collections.sort() 。 在旧版本的Java中,使用Merge sort而不是Timsort。

该语言的其他实现(除了Oracle之外)可能使用不同的排序算法,因为规范并未强制要求。 引用Collections的文档 :

此类中包含的多态算法的文档通常包括实现的简要描述。 这些描述应被视为实施说明,而不是规范的一部分。 只要遵守规范本身,实现者就可以随意替换其他算法。 (例如,sort使用的算法不必是mergesort,但它必须是稳定的。)

对于排序数字基元,JDK 7 使用 “双枢轴快速排序”。

Collections.sort()使用修改后的mergesort。 Arrays.sort()为基元使用quicksort的变体,为Object排序使用mergesort。

对于Java 7,请阅读@SebastianPaaskeTørholm的评论

好的,试图提出规范列表。 基本上合同是Collections.sort必须是一个“稳定”排序(即不会重新排列相同的元素),其中Arrays.sort (对于本机类型数组)可以重新排列它们,因为它们是相同的,因此它可以更自由地使用不同的(即更快的)算法。 这里给出了想要稳定合同的理由。 此外,假设比较对象(与本机)相比“更加昂贵”(通常是这样),因此Collections.sort的侧面目标是最小化比较次数并保持稳定。

对于所有版本, Collections.sort最初制作列表的副本(到数组),修改它,然后将已排序的元素复制回初始列表,以避免排序链表的O(n ^ 2)复杂性。 猜猜他们认为额外的副本不会太贵,因为它只是复制引用,而不是实际值(?)。

在JDK 6中:

本机类型的数组 : tuned quicksort

  * The sorting algorithm is a tuned quicksort, adapted from Jon * L. Bentley and M. Douglas McIlroy's "Engineering a Sort Function", * Software-Practice and Experience, Vol. 23(11) P. 1249-1265 (November * 1993). This algorithm offers n*log(n) performance on many data sets * that cause other quicksorts to degrade to quadratic performance. 

认为二次“最坏情况”O(n ^ 2)行为对于这种改进的快速排序不是问题 。

Quicksort本身被选中用于表现 。

对象列表 : 修改后的mergesort

  * The sorting algorithm is a modified mergesort (in which the merge is * omitted if the highest element in the low sublist is less than the * lowest element in the high sublist). This algorithm offers guaranteed * n log(n) performance. 

“这是一种相当快速稳定的排序,可以保证O(n log n)性能,并且需要额外的O(n)空间。”

它还默认为小数组的插入排序。

JDK 7:

本机类型的数组 : 双枢轴快速排序

  * ...The sorting algorithm is a Dual-Pivot Quicksort * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm * offers O(n log(n)) performance on many data sets that cause other * quicksorts to degrade to quadratic performance, and is typically * faster than traditional (one-pivot) Quicksort implementations. 

“新算法将平均掉期数减少了20%。”

还有一些阈值,如果大小“低于x”,它将只进行计数排序,插入排序或快速排序,而不是“双枢轴快速排序”。 (取决于正在排序的基元类型) https://stackoverflow.com/a/41129231/32453

对象列表 : Timsort是一种混合合并/插入排序。

“它是一个稳定的,自适应的,迭代的mergesort,在部分排序的数组上运行时需要远远少于n log(n)的比较,同时在随机数组上运行时提供与传统mergesort相当的性能。就像所有正确的mergesorts一样,timsort是稳定的在O(n log n)时间内运行(最坏情况)。在最坏的情况下,timsort需要临时存储空间用于n / 2个对象引用;在最好的情况下,它只需要很小的恒定空间量。当前实现,它总是需要额外的空间用于n个对象引用,并且仅在几乎排序的列表上击败n log n。“

“在高度有序的数据上,此代码的运行速度最高可达当前实现的25倍。”

“1) 保证 O(n * log(n))或更少与低常数的比较.2)正确排序(或转换)数据的n-1比较.3)稳定排序。”

您可以恢复使用带有环境的LegacyMergeSort。 设置。

JDK 8:

本机类型的数组 : 双枢轴快速排序 ,对jdk 7进行一些小的修改(什么?)。

物品清单:Timsort(同款)

并行排序:???

JDK 9:

本机类型的数组 : 双枢轴快速排序 ,至少有一些小的修改,因此如果数据“大部分是有序的”,它将只对它进行修改的合并排序。

物品清单 :Timsort(同款)

并行排序 :???

JDK 10:

本机类型的arrays: 双枢轴快速排序 ,已经提出了一些修改。

物品清单:Timsort(同款)

并行排序:???

这是一个社区维基,可以随意更新和/或详细说明。