为什么Arrays.sort是快速排序算法,为什么不是另一种排序算法?
为什么?它是更快还是更有效?
对于具有一个内核的系统,我们可以使用快速排序。在具有两个核心、四个核心或八个核心的系统上,我们应该使用什么?
为什么?它是更快还是更有效?
对于具有一个内核的系统,我们可以使用快速排序。在具有两个核心、四个核心或八个核心的系统上,我们应该使用什么?
快速排序的优点是完全到位,因此它不需要任何额外的存储,而mergesort(实际上用于对象数组)和其他(所有?)保证的O(n *log n)算法至少需要一个数组的完整副本。对于对非常大的基元数组进行排序的程序,这意味着可能会使整体内存使用量增加一倍。Arrays.sort()
答案在Jon L. Bentley和M. Douglas McIlroy的“Engineering a Sort Function”中,排序函数引用了该功能。
为了寻找更好的 qsort,我们发现 1983 年在伯克利编写的 qsort 会在包含重复多次的几个元素的数组上消耗二次时间,尤其是随机零和 1 的数组。事实上,在十几个不同的Unix库中,我们发现没有qsort不能轻易地被驱动为二次行为;所有这些都来自第七版或1983年的伯克利函数。
由于找不到足够好的 qsort,我们开始构建一个更好的 qsort。该算法应避免在合理输入上出现极度减速,并且在“随机”输入上应快速。它还应该在数据空间和代码空间中高效。排序不必是稳定的;它的规范不承诺保持相等元素的顺序。
替代方案是堆排序和合并排序,因为Java是在1990年代初创建的。合并排序不太理想,因为它需要额外的存储空间。堆排序具有更好的最坏情况性能(与 相比),但在实践中执行得更慢。因此,如果您可以通过良好的启发式方法控制最坏情况的性能,那么调整的快速排序就是要走的路。O(n log n)
O(n^2)
Java 7正在切换到Timsort,它发明于1993年(2002年在Python中实现),并且具有最坏的情况,并且是一种稳定的类型。O(n log n)