根据Wikipedia:
“在Java中,Arrays.sort()方法使用合并排序或调整 quicksort取决于数据类型和实现效率 当少于七个数组元素时切换到插入排序 正在排序“
但为什么呢?合并排序和快速排序都是 O(n log n)。
答案 0 :(得分:10)
算法不同的地方是典型案例行为,这就是插入排序是最糟糕的行为之一。另一方面,对于非常小的集合(n≈n 2 ),插入排序的简单性获胜。
Java的算法选择规则首先选择QuickSort,并且由于特定限制而仅返回其他内容。 QuickSort,即不稳定排序,因此仅适用于基元的排序。对于参考类型,TimSort从OpenJDK 7(以前的MergeSort)开始使用。
答案 1 :(得分:1)
这不是特别的:
Arrays.java的sort方法使用quicksort表示基元数组,并对对象数组进行合并排序。
Why does Java's Arrays.sort method use two different sorting algorithms for different types?
另外,根据文档:
例如,sort(Object [])使用的算法不必是mergesort,但它必须是稳定的。
来自javadoc的另一个引用:
这种保证是稳定的:相同的元素不会 由于排序而重新排序。
实施说明:此实施是稳定的,适应性的, 迭代合并,需要远远少于n lg(n)的比较 当输入数组部分排序时,同时提供 输入数组时传统mergesort的性能 随机排序。如果输入数组几乎排序,那么 实施需要大约n次比较。临时存储 要求从几乎排序的输入数组的小常量变化 对于随机排序的输入数组的n / 2个对象引用。
实施同样有利于升序和降序 在其输入数组中排序,并可以利用升序和 在同一输入数组的不同部分中降序排列。它是 非常适合合并两个或多个排序数组:简单地连接 数组并对结果数组进行排序。
该实现改编自Tim Peters的Python列表 (TimSort)。
答案 2 :(得分:1)
Quicksort和mergesort在平均性能中都是O(n log n)。在最坏的情况下,快速排序是O(n ^ 2)。
答案 3 :(得分:0)
他们转向调整合并排序因为发现统计上对于实际部分排序的数据集这种方法可能比快速排序快一点。
答案 4 :(得分:0)
Java 7使用Timsort - Merge和插入的混合体。事实上,它被广泛使用 - android,Octave,python也使用它。 http://en.wikipedia.org/wiki/Timsort