使用插入排序的修改版本的合并排序

时间:2016-05-11 17:34:21

标签: algorithm sorting mergesort

在使用合并排序分割数组之后,直到数组长度为k,我应该在k长度数组上使用插入排序,然后继续合并。什么应该是k的最佳值?

另外,我发现这些问题与我的相似,但没有找到明确的答案 Choosing minimum length k of array for merge sort where use of insertion sort to sort the subarrays is more optimal than standard merge sort Modification to merge sort to implement merge sort with insertion sort Java

2 个答案:

答案 0 :(得分:0)

只是测量。

最佳阈值取决于您的编程语言,数据类型,数据集值分布,计算机硬件,合并排序和插入排序实现细节等。

通常这个值在10-200范围内,最佳值的增益不是很显着。

答案 1 :(得分:0)

对于我的问题http://atekihcan.github.io/CLRS/P02-01/,我觉得这是一个更恰当的答案,在这里引用它,

要使修改后的算法具有与标准合并排序相同的渐近运行时间,

Θ(nk+nlg(n/k))=Θ(nk+nlgn−nlgk)

必须与

相同
Θ(nlgn).

为了满足这个条件,k不能渐渐增长得快于lg⁡n(如果k增长得快于lg⁡n,因为nk项,算法将运行在比Θ(nlgn)更差的渐近时间。但就这样我们必须检查

是不够的
k=Θ(lgn), 

要求是否成立。

如果我们假设,

k=Θ(lgn),

Θ(nk+nlg(n/k))=Θ(nk+nlgn−nlgk)=Θ(nlgn+nlgn−nlg(lgn))=Θ(2nlgn−nlg(lgn))†=Θ(nlgn)
对于足够大的n值,

†lg(lgn)与lgn相比非常小。