2-1(在归并排序中对最小数组采用插入排序) 虽然归并排序的最坏情况运行时间为θ(nlgn),而插入排序的最坏情况运行时间为θ(n2n2),但是插入排序中的常量因子可能使得它在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个数进行插入排序 可以想一下
第1个数排序时长为1;
第二个数排序时长为2;
...
第k个数排序时长为k;
加起来的排序时长就是(k+1)*k/2
题目告诉我们有n/k个子表 所以总运行时长是(k+1)*k/2*(n/k)
约分k后得出总运行时长是(k+1)*n/2 所以θ(nk) 是关于nk的复杂度
b)子表的个数是n/k个 可以想象在树状归并图的底部 依次排列:
组1: 1 2 3...... k 组2: 1 2 3.....k ...... 组n/k 1 2 3......k
这样的结构的第二层就是
组1: 1 1 2 2 ...... k k 组2: 1 1 2 2 ...... k k 组n/k/2 1 1 2 2 ...... k k
第1层有n/k个组 每组k个元素
第2层有n/k/2个组 每组2k个元素
第3层有n/k/2^(层数-1)个组 每组有2^(层数-1)*k个元素
......
第lg(n/k)层最高层 有1个组 每组有n个元素
每一次合并 如果用标准的合并机制 则:
对于第lg(n/k)-1层 合并的复杂度为:
假设两个组 每组有m个元素 假如都是从大到小排序排好的 合并的时候 比较放在最前端的两个数 把较大的数拿出来组成新的组 在最坏的情况下要比较2m次
最终总的合并时间 是:
第一层: 2*k*(n/k)/2 = n(每次两两合并要2k时间 n/k组按照两两分组 有n/k/2个两两组合)
第二层: 2*2k*(n/2/k)/2 = n
...
最终 有lg(n/k)层 总共耗时n*lg(n/k)的时间
因此 总耗时的最大因素可以缩写为: θ(n*lg(n/k))
(c)
由题干θ(nlgn)标准二分法的运行时间是nlg(n)
本小题中算法的运行时间是nk+nlg(n/k)
即问什么情况下 能使 nk+nlg(n/k) = nlg(n)
过程如下:
左边提取公因式 = n*(k+lg(n/k))
左右都➗n 得到: k+lg(n/k) = lg(n)
k+lgn-lgk = lgn
k-lg(k) = 0
k不存在🤷♀️怀疑自己算错了欢迎指正...
(4) k怎么选?
就是问对于n个数,在一开始就要分组,那么每组排序的时候用插入法排序,合并时用归并法,怎么分配最快
如果对于一台运算很快的机器 在执行插入排序比细分到最小的归并排序快的话 这时选插入排序
这时就要计算 这个最小的n值在哪里 在n到达多少的时候 归并排序比插入排序快,这个n作为归并排序最低层的数字个数
比如对机器的运行速度的实验表明 对于32个数排序 插入排序比归并排序快,33个数就慢了
那么当要排序128个数的时候 k就应该是32 每组32个数 当这4组数在插入排序完成后 再进行归并排序 在第3层的时候运算完毕 这样是最快的.