中华IT学习网官方总站:圣才学习网官方总站:圣才学习网章排序(参考答案)一、选择题1.D2.D3.D4.B5.B6.B7.C,E8.A9.C10.C,D,F11.1D,C11.2A,D,F11.3B11.4(A,C,F)(B,D,E)12.C,D13.A14.B,D15.D16.D17.C18.A19.A20.C21.C22.B23.C24.C25.A26.C27.D28.C29.B30.C,B31.D32.D33.A34.D35.A36.A37.A38.C39.B40.C41.C42.B43.A44.B45.A46.C47.B,D48.D49.D50.D51.C52.E,G53.B54.C55.C56.B57.B58.A59.1C59.2A59.3D59.4B59.5G60.1B60.2C60.3A61.1B61.2D61.3B61.4C61.5F62.A63.A64.B65.A66.A部分答案解释如下:18.对于后三种排序方法两趟排序后,序列的首部或尾部的两个元素应是有序的两个极值,而给定的序列并不满足。20.本题为步长为3的一趟希尔排序。24.枢轴是73。49.小根堆中,关键字最大的记录只能在叶结点上,故不可能在小于等于n/2的结点上。64.因组与组之间已有序,故将n/k个组分别排序即可,基于比较的排序方法每组的时间下界为O(klog2k),全部时间下界为O(nlog2k)。二、判断题1.√2.×3.×4.×5.×6.×7.×8.×9.×10.×11.×12.×13.×14.√15.√16.×17.×18.×19.×20.×21.×22.×23.×24.×25.√26.×27.√28.×29.×30.×31.√部分答案解释如下:5.错误。例如冒泡排序是稳定排序,将4,3,2,1按冒泡排序排成升序序列,第一趟变成3,2,1,4,此时3就朝向最终位置的相反方向移动。12.错误。堆是n个元素的序列,可以看作是完全二叉树,但相对于根并无左小右大的要求,故其既不是二叉排序树,更不会是平衡二叉树。22.错误。待排序序列为正序时,简单插入排序比归并排序快。三、填空题1.比较,移动2.生成有序归并段(顺串),归并3.希尔排序、简单选择排序、快速排序、堆排序等4.冒泡,快速5.(1)简单选择排序(2)直接插入排序(最小的元素在最后时)6.免去查找过程中每一步都要检测整个表是否查找完毕,提高了查找效率。7.n(n-1)/28.题中p指向无序区第一个记录,q指向最小值结点,一趟排序结束,p和q所指结点值交换,同时向后移p指针。(1)!=null(2)p-next(3)r!=null(4)r-dataq-data(5)r-next(6)p-next9.题中为操作方便,先增加头结点(最后删除),p指向无序区的前一记录,r指向最小值结点的前驱,一趟排序结束,无序区第一个记录与r所指结点的后继交换指针。(1)q-link!=NULL(2)r!=p(3)p-link(4)p-link=s(5)p=p-link中华IT学习网官方总站:圣才学习网官方总站:圣才学习网(1)in-i+1(2)j=n-i+1(3)r[j].keyr[min].key(4)min!=i(5)max==i(6)r[max]--r[n-i+1]11.(1)N(2)0(3)N-1(4)1(5)R[P].KEYR[I].KEY(6)R[P].LINK(7)(N+2)(N-1)/2(8)N-1(9)0(10)O(1)(每个记录增加一个字段)(11)稳定(请注意I的步长为-1)12.3,(10,7,-9,0,47,23,1,8,98,36)13.快速14.(4,1,3,2,6,5,7)15.最好每次划分能得到两个长度相等的子文件。设文件长度n=2k-1,第一遍划分得到两个长度n/2的子文件,第二遍划分得到4个长度n/4的子文件,以此类推,总共进行k=log2(n+1)遍划分,各子文件长度均为1,排序结束。16.O(n2)17.O(nlog2n)18.(1)2*i(2)r[j].keyr[j+1].key(3)true(4)r[j](5)2*i19.(1)2*i(2)j=r(3)j←j+1(4)x.keyheap[j].key(5)i←j(6)j←2*i(7)x20.(1)j:=2*i(2)finished:=false(3)(r[j].keyr[j+1].key)(4)r[i]:=r[j](5)i:=j(6)j:=2*i(7)r[i]:=t;(8)sift(r,i,n)(9)r[1]:=r[i](10)sift(r,1,i-1)21.④是堆(1)选择(2)筛选法(3)O(nlog2n)(4)O(1)22.(1)选择(2)完全二叉树(3)O(Nlog2N)(4)O(1)(5)满足堆的性质23.(1)finish:=false(2)h[i]:=h[j];i:=j;j:=2*j;(3)h[i]:=x(4)h,k,n(5)sift(h,1,r-1)24.{D,Q,F,X,A,P,B,N,M,Y,C,W}25.(1)p[k]:=j(2)i:=i+1(3)k=0(4)m:=n(5)mn(6)a[i]:=a[m](7)a[m]:=t26.程序(a)(1)true(2)a[i]:=t(3)2TOnstep2(4)true(5)NOTflag程序(b)(1)1(2)a[i]=t(3)(i=2;i=n;i+=2)(4)1(5)flag27.(Q,A,C,S,Q,D,F,X,R,H,M,Y),(F,H,C,D,Q,A,M,Q,R,S,Y,X)28.初始归并段(顺串)29.初始归并段,初始归并段,减少外存信息读写次数(即减少归并趟数),增加归并路数和减少初始归并段个数。30.n/m31.(1)m,j-1(2)m:=j+1(3)j+1,n(4)n:=j-1最大栈空间用量为O(logn)。四、应用题1.假设含n个记录的序列为{R1,R2,…,Rn},其相应的关键字序列为{K1,K2,…,Kn},这些关键字相互之间可以进行比较,即在它们之间存在着这样一个关系Ks1≤Ks2≤…≤Ksn,按此固有关系将n个记录序列重新排列为{Rs1,Rs2,…,Rsn}。若整个排序过程都在内存中完成,则称此类排序问题为内部排序。2.排序方法平均时间最坏情况辅助空间稳定性不稳定排序举例直接插O(n2)O(n2)O(1)稳定中华IT学习网官方总站:圣才学习网官方总站:圣才学习网(n2)O(n2)O(1)稳定二路插入排序O(n2)O(n2)O(n)稳定表插入排序O(n2)O(n2)O(1)稳定起泡排序O(n2)O(n2)O(1)稳定直接选择排序O(n2)O(n2)O(1)不稳定2,2’,1希尔排序O(n1.3)O(n1.3)O(1)不稳定3,2,2’,1(d=2,d=1)快速排序O(nlog2n)O(n2)O(log2n)不稳定2,2’,1堆排序O(nlog2n)O(nlog2n)O(1)不稳定2,1,1’(极大堆)2-路归并排序O(nlog2n)O(nlog2n)O(n)稳定基数排序O(d*(rd+n))O(d*(rd+n))O(rd)稳定3.这种说法不对。因为排序的不稳定性是指两个关键字值相同的元素的相对次序在排序前、后发生了变化,而题中叙述和排序中稳定性的定义无关,所以此说法不对。对4,3,2,1起泡排序就可否定本题结论。4.可以做到。取a与b进行比较,c与d进行比较。设ab,cd(ab和cd情况类似),此时需2次比较,取b和d比较,若bd,则有序abd;若bd时则有序cdb,此时已进行了3次比较。再把另外两个元素按折半插入排序方法,插入到上述某个序列中共需4次比较,从而共需7次比较。5.本题答案之一请参见第9章的“四、应用题”第70题,这里用分治法求解再给出另一参考答案。对于两个数x和y,经一次比较可得到最大值和最小值;对于三个数x,y,z,最多经3次比较可得最大值和最小值;对于n(n3)个数,将分成长为n-2和2的前后两部分A和B,分别找出最大者和最小者:MaxA、MinA、MaxB、MinB,最后Max={MaxA,MaxB}和Min={MinA,MinB}。对A使用同样的方法求出最大值和最小值,直到元素个数不超过3。设C(n)是所需的最多比较次数,根据上述原则,当n3时有如下关系式:C(n)=33)2(3321nnCnn通过逐步递推,可以得到:C(n)=3n/2-2。显然,当n=3时,2n-33n/2-2。事实上,3n/2-2是解决这一问题的比较次数的下限。6.假定待排序的记录有n个。由于含n个记录的序列可能出现的状态有n!个,则描述n个记录排序过程的判定树必须有n!个叶子结点。因为若少一个叶子,则说明尚有两种状态没有分辨出来。我们知道,若二叉树高度是h,则叶子结点个数最多为2h-1;反之,若有u个中华IT学习网官方总站:圣才学习网官方总站:圣才学习网叶子结点,则二叉树的高度至少为log2u+1。这就是说,描述n个记录排序的判定树必定存在一条长度为log2(n!)的路径。即任何一个籍助“比较”进行排序的算法,在最坏情况下所需进行的比较次数至少是log2(n!)。根据斯特林公式,有log2(n!)=O(nlog2n)。即籍助于“比较”进行排序的算法在最坏情况下能达到的最好时间复杂度为O(nlog2n)。证毕。7.答:拓扑排序,是有向图的顶点依照弧的走向,找出一个全序集的过程,主要是根据与顶点连接的弧来确定顶点序列;冒泡排序是借助交换思想通过比较相邻结点关键字大小进行排序的算法。8.直接插入排序的基本思想是基于插入,开始假定第一个记录有序,然后从第二个记录开始,依次插入到前面有序的子文件中。即将记录R[i](2=i=n)插入到有序子序列R[1..i-1]中,使记录的有序序列从R[1..i-1]变为R[1..i],最终使整个文件有序。共进行n-1趟插入。最坏时间复杂度是0(n2),平均时间复杂度是0(n2),空间复杂度是O(1),是稳定排序。简单选择排序的基本思想是基于选择,开始有序序列长度为零,第i(1=in)趟简单选择排序是,从无序序列R[i..n]的n-i+1记录中选出关键字最小的记录,和第i个记录交换,使有序序列逐步扩大,最后整个文件有序。共进行n-1趟选择。最坏时间复杂度是0(n2),平均时间复杂度是0(n2),空间复杂度是O(1),是不稳定排序。二路并归排序的基本思想是基于归并,开始将具有n个待排序记录的序列看成是n个长度为1的有序序列,然后进行两两归并,得到n/2个长度为2的有序序列,再进行两两归并,得到n/4个长度为4的有序序列。如此重复,经过log2n趟归并,最终得到一个长度为n的有序序列。最坏时间复杂度和平均时间复杂度都是0(nlog2n),空间复杂度是O(n),是稳定排序。9.错误。快速排序,堆排序和希尔排序是时间性能较好的排序方法,但都是不稳定的排序方法。10.等概率(后插),插入位置0..n,则平均移动个数为n/2。若不等概率,则平均移动个数为10i)-(n*1)/2)(n*i)/(n-(nni=312n11.从节省存储空间考虑:先选堆排序,再选快速排序,最后选择归并