题目内容
(请给出正确答案)
[主观题]
二路归并算法merge()中的循环体,虽然形式上简洁,但流程控制逻辑却较为复杂。a)试分情况验证并解释该算法的正确性;b)基于以上理解,该循环体可以如何简化?c)如果从代码可维护性及运行效率的角度出发,该算法应该如何实现?
查看答案
如果结果不匹配,请 联系老师 获取答案
A.{B,F,C,J,A,E,D,I,C,H}
B.{C,B,D,A,E,F,I,C,J,H}
C.{B,F,C,E,A,I,D,C,H,J}
D.{A,B,D,C,E,F,I,J,C,H}
A、锦标赛排序
B、快速排序
C、基数排序
D、归并排序
的结果,并说明做了多少次排序码比较,注意,后一个16附带一个“*”表明这是一个与前面某一个元素具有相同排序码值(16)的元素。
(1)直接插入排序
(2)希尔排序(增量为5,2,1)
(3)起泡排序
(4)快速排序
(5)简单选择排序
(6)锦标赛排序
(7)堆排序
(8)二路归并排序
(9)基数排序
以下将ah,…am,和am+1…an,两个有序序列(它们相应的关键字值满足Kh≤Km,Km+1≤…Kn,)合并成一个有序序列Rh,…,Rn,(使其关键字值满足Kh,'≤…≤Kn,')。请分析算法,并在______上填充适当的语句。
void merge(list a,list R,int h,int m,int n)
{i=h;k=h;j=m+1;
while((i<m)&&(j<=n))
{ if(a[i].key<=a[i].key){R[k]=______;______;}
else{R[k]=______;______;}
k++;
}
while(i<=______){R[k]=a[i];i++;k++;)
while(j<=______){R[k]=a[j];j++;k++;}
}
此算法的执行时间为______。
(1)可以建立多少个初始归并段?每个初始归并段有多少个记录?存放于多少个块中?
(2)应采用几路归并?请写出归并过程及每趟需要读写磁盘的块数。