Java.util.ArrayList.sort()排序算法

sul*_*ing 12 java algorithm math

我正在查看grepcode上java.util.ArrayListsort()方法的源代码.他们似乎在小型数组(大小<7)上使用插入排序,并在大型数组上进行合并排序.我只是想知道这是否会产生很大的不同,因为它们只对大小<7的数组使用插入排序.在现代机器上,运行时间的差异几乎不可察觉.

我在Cormen读过这篇文章:

尽管合并排序在O(n*logn)最坏情况下运行,插入排序在O(n*n)最坏情况下运行,但插入排序中的常数因素可以使其在实际中对于许多机器上的小问题大小更快.因此,当子问题变得足够小时,通过在合并排序中使用插入排序来粗化递归的叶子是有意义的.

如果我会为我需要的某个组件设计排序算法,那么在合并排序与运行时间的差异变得明显之前,我会考虑使用insert-sort来获得更大的大小(可能达到<100).

我的问题是,达到<7的大小背后的分析是什么?

NPE*_*NPE 15

在现代机器上,运行时间的差异几乎不可察觉.

当您意识到整个排序算法是递归的时,对小数组进行排序所需的时间变得非常重要,而小数组排序实际上是该递归的基本情况.

关于如何选择七号,我没有任何内幕消息.但是,如果不是因为在小型阵列上对竞争算法进行基准测试,并且基于此选择最佳算法和阈值,那么我会感到非常惊讶.

PS值得指出的是Java7 默认使用Timsort.