mergesort中的小子数组的插入排序

时间:2014-01-15 10:38:40

标签: mergesort

我在解决“Cormen算法简介”中的问题时遇到困难,问题如下,

合并排序中的小数组中的插入排序

尽管合并排序在O(n logn)最坏情况下运行,插入排序在O(n ^ 2)中运行,但后者运行速度更快,适用于小问题。考虑对Merge Sort的修改,其中使用插入排序对长度为k的n / k子列表进行排序,然后使用标准合并机制进行合并。

要对k长度的这些n / k子列表进行排序,需要O(nk)并合并这些n / k子列表需要O(n lg(n / k))

因此修改后的算法需要O(nk)+ O(n lg(n / k)),

作为n函数的k的最大渐近(Θnotation)值是什么,修改后的算法与标准合并排序具有相同的渐近运行时间?

如何在实践中选择k?

这是我被卡住的两件事,感谢任何帮助,提前谢谢:)

2 个答案:

答案 0 :(得分:0)

第一个问题是,基本上,要求k可以大于或等于lg n,并且仍然具有Θ(n lg n)的渐近阶。如果它大于,我们知道两种排序算法的组合不如合并排序那么有效。所以我们假设k =Θ(lg n)。如果你插入lg n,其中k在你的递归关系中,那么T(nlgn + n lg(n / lg(n))并解决你将在Θnotation中得到你最大的渐近值。

至于如何选择K,k应该是插入排序比合并更快的最大输入大小。如果我们为nk和nlgn添加一些正整数,我们知道k取决于这两个正整数之间的比率。希望这有帮助!

ex xnk + ynlgn

x和y是正常数

所以k = x / y因为这会使上述表达式最小化。所以k不依赖于n。

答案 1 :(得分:0)

抱歉迟到了,但我想我可以补充一些关于你第二个问题的额外信息。 根据Robert Sedgewick和Kevin Wayne撰写的算法(第4版)一书

  

切换到小子阵列(长度为15或更小,比如说)的插入排序将改善运行>典型的mergesort实现时间为10%到15%。