(在归并排序中对小数组采用插入排序)虽然归并排序的最坏情况运行时间为θ(nlgn),而插入排序的最坏运行时间为θ(),但是插入排序中的常量因子可能使得它在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的子表,则对于每个子表排序的最坏运行时间为θ(),由于总共要排序的子表个数为n/k,则总运行时间应当为θ(
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值。