算法导论 2-1 在归并排序中引入插入排序

(在归并排序中对小数组采用插入排序)虽然归并排序的最坏情况运行时间为θ(nlgn),而插入排序的最坏运行时间为θ({\color{Red} n^{2}}),但是插入排序中的常量因子可能使得它在n较小时,在许多机器上实际运行得更快。因此,在归并排序中当子问题变得足够小时,采用插入排序来使递归的叶变粗是有意义的。考虑对归并排序的一种修改,其中使用插入排序来排序长度为k的n/k个子表,然后使用标准的合并机制来合并这些子表,这里k是一个待定的值。

a. 证明:插入排序最坏情况可以在θ(nk)时间内排序每个长度为k的n/k个子表。

b. 表明在最坏情况下如何在θ(nlg(n/k))时间内合并这些子表。

c. 假定修改后的算法的最坏情况运行时间为θ(nk+nlg(n/k)),要使修改后的算法与标准的归并排序具有相同的运行时间,作为n的一个函数,借助θ记号,k的最大值是什么?

d. 在实践中,我们应该如何选择k?

a 解答:

如果用插入排序来排序每个长度为k的子表,则对于每个子表排序的最坏运行时间为θ(k^{2}),由于总共要排序的子表个数为n/k,则总运行时间应当为θ(k^{2}n/k),由于k^{2}n/k = nk,可知排序长度为k的n/k个子表最坏运行时间为θ(nk) 。

b 解答:

在归并排序的过程中,由于对于每一个长度为p的子表,都存在n/p个子表需要进行归并,对于这n/p个子表的归并时间为θ(pn/p) = θ(n) 。由于对长度小于和等于k的子表采用的是插入排序,故对这部分子表不需要进行合并。我们把每一份长度相同的子表归类为一层,则归并的层数总共为lg(n/k)层,可知总最坏运行时间为θ(nlg(n/k)) 。

c解答:

无论k的最大值有多大,借助θ记号,因为k是常量,θ(nk+nlg(n/k))的运行时间依然为θ(nlgn) 。

d解答:

在实践中,最有效的方案是选择一个规模足够大的数组A,k从1开始进行叠加测试引入插入排序后的时间开销,从中选出时间最优的k值。

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值