da10.docx

上传人:b****4 文档编号:5002511 上传时间:2022-12-12 格式:DOCX 页数:38 大小:199.21KB
下载 相关 举报
da10.docx_第1页
第1页 / 共38页
da10.docx_第2页
第2页 / 共38页
da10.docx_第3页
第3页 / 共38页
da10.docx_第4页
第4页 / 共38页
da10.docx_第5页
第5页 / 共38页
点击查看更多>>
下载资源
资源描述

da10.docx

《da10.docx》由会员分享,可在线阅读,更多相关《da10.docx(38页珍藏版)》请在冰豆网上搜索。

da10.docx

da10

第10章排序(参考答案)

一、选择题

1.D

2.D

3.D

4.B

5.B

6.B

7.C,E

8.A

9.C

10.C,D,F

11.1D,C11.2A,D,F

11.3B11.4(A,C,F)(B,D,E)

12.C,D

13.A

14.B,D

15.D

16.D

17.C

18.A

19.A

20.C

21.C

22.B

23.C

24.C

25.A

26.C

27.D

28.C

29.B

30.C,B

31.D

32.D

33.A

34.D

35.A

36.A

37.A

38.C

39.B

40.C

41.C

42.B

43.A

44.B

45.A

46.C

47.B,D

48.D

49.D

50.D

51.C

52.E,G

53.B

54.C

55.C

56.B

57.B

58.A

59.1C59.2A59.3D59.4B59.5G

60.1B60.2C60.3A

61.1B61.2D61.3B61.4C61.5F

62.A

63.A

64.B

65.A

66.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)/2

8.题中p指向无序区第一个记录,q指向最小值结点,一趟排序结束,p和q所指结点值交换,同时向后移p指针。

(1)!

=null

(2)p->next(3)r!

=null(4)r->datadata(5)r->next(6)p->next

9.题中为操作方便,先增加头结点(最后删除),p指向无序区的前一记录,r指向最小值结点的前驱,一趟排序结束,无序区第一个记录与r所指结点的后继交换指针。

(1)q->link!

=NULL

(2)r!

=p(3)p->link(4)p->link=s(5)p=p->link

10.

(1)i

(2)j<=n-i+1(3)r[j].key

=i(5)max==i(6)r[max]<-->r[n-i+1]

11.

(1)N

(2)0(3)N-1(4)1(5)R[P].KEY

(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].key>r[j+1].key(3)true(4)r[j](5)2*i

19.

(1)2*i

(2)j<=r(3)j←j+1(4)x.key>heap[j].key(5)i←j(6)j←2*i(7)x

20.

(1)j:

=2*i

(2)finished:

=false(3)(r[j].key>r[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)m

=a[m](7)a[m]:

=t

26.程序(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)flag

27.(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/m

31.

(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)

稳定

折半插入排序

O(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进行比较。

设a>b,c>d(ad,则有序a>b>d;若bd>b,此时已进行了3次比较。

再把另外两个元素按折半插入排序方法,插入到上述某个序列中共需4次比较,从而共需7次比较。

5.本题答案之一请参见第9章的“四、应用题”第70题,这里用分治法求解再给出另一参考答案。

对于两个数x和y,经一次比较可得到最大值和最小值;对于三个数x,y,z,最多经3次比较可得最大值和最小值;对于n(n>3)个数,将分成长为n-2和2的前后两部分A和B,分别找出最大者和最小者:

MaxA、MinA、MaxB、MinB,最后Max={MaxA,MaxB}和Min={MinA,MinB}。

对A使用同样的方法求出最大值和最小值,直到元素个数不超过3。

设C(n)是所需的最多比较次数,根据上述原则,当n>3时有如下关系式:

C(n)=

通过逐步递推,可以得到:

C(n)=3n/2-2。

显然,当n>=3时,2n-3>3n/2-2。

事实上,3n/2-2是解决这一问题的比较次数的下限。

6.假定待排序的记录有n个。

由于含n个记录的序列可能出现的状态有n!

个,则描述n个记录排序过程的判定树必须有n!

个叶子结点。

因为若少一个叶子,则说明尚有两种状态没有分辨出来。

我们知道,若二叉树高度是h,则叶子结点个数最多为2h-1;反之,若有u个叶子结点,则二叉树的高度至少为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<=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。

若不等概率,则平均移动个数为=

11.从节省存储空间考虑:

先选堆排序,再选快速排序,最后选择归并排序;

从排序结果的稳定性考虑:

选择归并排序。

堆排序和快速排序都是不稳定排序;

从平均情况下排序最快考虑:

先选择快速排序。

12.

(1)堆排序,快速排序,归并排序

(2)归并排序(3)快速排序(4)堆排序

13.平均比较次数最少:

快速排序;占用空间最多:

归并排序;不稳定排序算法:

快速排序、堆排序、希尔排序。

14.求前k个最大元素选堆排序较好。

因为在建含n个元素的堆时,总共进行的关键字的比较次数不超过4n,调整建新堆时的比较次数不超过2log2n次。

在n个元素中求前k个最大元素,在堆排序情况下比较次数最多不超过4n+2klog2n。

稳定分类是指,若排序序列中存在两个关键字值相同的记录Ri与Rj(Ki=Kj,i≠j)且Ri领先于Rj,若排序后Ri与Rj的相对次序保持不变,则称这类分类是稳定分类(排序),否则为不稳定分类。

A,C和E是稳定分类(排序),B和D是不稳定分类(排序)。

15.

 

16.

(1)此为直接插入排序算法,该算法稳定。

(2)r[O]的作用是监视哨,免去每次检测文件是否到尾,提高了排序效率。

采用x.key<=r[j].key描述算法后,算法变为不稳定排序,但能正常工作。

17.

(1)横线内容:

①m②1③0④1

(2)flag起标志作用。

若未发生交换,表明待排序列已有序,无需进行下趟排序。

(3)最大比较次数n(n-1)/2,最大移动次数3n(n-1)/2(4)稳定

18.

(1)①499②A[j]>A[j+1]③b:

=true

(2)冒泡排序(3)499次比较,0次交换

(4)n(n-1)/2次比较,n(n-1)/2次交换(相当3n(n-1)/2次移动),本题中n=500,故有124750次比较和交换(相当373250次移动)。

19.答:

此排序为双向起泡排序:

从前向后一趟排序下来得到一个最大值,若其中发生交换,则再从后向前一趟排序,得到一个最小值。

一趟:

12,23,35,16,25,36,19,21,16,47

二趟:

12,16,23,35,16,25,36,19,21,47三趟:

12,16,23,16,25,35,19,21,36,47

四趟:

12,16,16,23,19,25,35,21,36,47五趟:

12,16,16,19,23,25,21,35,36,47

六趟:

12,16,16,19,21,23,25,35,36,47七趟:

12,16,16,19,21,23,25,35,36,47

20.对冒泡算法而言,初始序列为反序时交换次数最多。

若要求从大到小排序,则表现为初始是上升序。

21.证明:

起泡排序思想是相邻两个记录的关键字比较,若反序则交换,一趟排序完成得到一个极值。

由题假设知Rj在Ri之前且Kj>Ri,即说明Rj和Ri是反序;设对于Ri之前全部记录1—Ri-1(其中包括Kj)中关键字最大为Kmax,则Kmax≥Kj,故经过起泡排序前i-2次后,Ri-1的关键字一定为Kmax,又因Kmax≥Kj>Ri,故Ri-1和Ri为反序,由此可知Ri-1和Ri必定交换,证毕。

22.采用直接插入排序算法,因为记录序列已基本有序,直接插入排序比较次数少,且由于少量次序不对的记录与正确位置不远,使直接插入排序记录移动次数也相对较少,故选直接插入排序算法。

23.各带标号语句的频度:

(1)n

(2)n-1(3)(n+2)(n-1)/2(4)n(n-1)/2(5)n-1

时间复杂度O(n²),属于直接选择排序。

24.6,13,28,39,41,72,85,20

i=1↑m=4↑r=7↑

20<39i=1↑m=2↑r=3↑

20>13i=3r=3m=3

20<28r=2i=3

将r+1(即第3个)后的元素向后移动,并将20放入r+1处,结果为6,13,20,28,39,41,72,85。

(1)使用二分法插入排序所要进行的比较次数,与待排序的记录的初始状态无关。

不论待排序序列是否有序,已形成的部分子序列是有序的。

二分法插入首先查找插入位置,插入位置是判定树查找失败的位置。

失败位置只能在判定树的最下两层上。

(2)一些特殊情况下,二分法插入排序要比直接插入排序要执行更多的比较。

例如,在待排序序列已有序的情况下就是如此。

25.

(1)直接插入排序

第一趟(3)[8,3],2,5,9,1,6第二趟

(2)[8,3,2],5,9,1,6第三趟(5)[8,5,3,2],9,1,6

第四趟(9)[9,8,5,3,2],1,6第五趟

(1)[9,8,5,3,2,1],6第六趟(6)[9,8,6,5,3,2,1]

(2)直接选择排序(第六趟后仅剩一个元素,是最小的,直接选择排序结束)

第一趟(9)[9],3,2,5,8,1,6第二趟(8)[9,8],2,5,3,1,6第三趟(6)[9,8,6],5,3,1,2

第四趟(5)[9,8,6,5],3,1,2第五趟(3)[9,8,6,5,3],1,2第六趟

(2)[9,8,6,5,3,2],1

(3)直接插入排序是稳定排序,直接选择排序是不稳定排序。

26.这种看法不对。

本题的叙述与稳定性的定义无关,不能据此来判断排序中的稳定性。

例如5,4,1,2,3在第一趟冒泡排序后得到4,1,2,3,5。

其中4向前移动,与其最终位置相反。

但冒泡排序是稳定排序。

快速排序中无这种现象。

27.125,11,22,34,15,44,76,66,100,8,14,20,2,5,1

设D=7

 

1,11,8,14,15,2,5,66,100,22,34,20,44,76,125

D=3

1,11,2,5,15,8,14,34,20,22,66,100,44,76,125

D=11,2,5,8,11,14,15,20,22,34,44,66,76,100,125

28.设待排序记录的个数为n,则快速排序的最小递归深度为log2n+1,最大递归深度n。

29.平均性能最佳的排序方法是快速排序,该排序方法不稳定。

初始序列:

50,10,50,40,45,85,80

一趟排序:

[45,10,50,40]50[85,80]二趟排序:

[40,10]45[50]50[80]85

三趟排序:

10,40,45,50,50,80,85

30.快速排序。

31.

(1)在最好情况下,假设每次划分能得到两个长度相等的子文件,文件的长度n=2k-1,那么第一遍划分得到两个长度均为n/2的子文件,第二遍划分得到4个长度均为n/4的子文件,以此类推,总共进行k=log2(n+1)遍划分,各子文件的长度均为1,排序完毕。

当n=7时,k=3,在最好情况下,第一遍需比较6次,第二遍分别对两个子文件(长度均为3,k=2)进行排序,各需2次,共10次即可。

(2)在最好情况下快速排序的原始序列实例:

4,1,3,2,6,5,7。

(3)在最坏情况下,若每次用来划分的记录的关键字具有最大值(或最小值),那么只能得到左(或右)子文件,其长度比原长度少1。

因此,若原文件中的记录按关键字递减次序排列,而要求排序后按递增次序排列时,快速排序的效率与冒泡排序相同,其时间复杂度为O(n2)。

所以当n=7时,最坏情况下的比较次数为21次。

(4)在最坏情况下快速排序的初始序列实例:

7,6,5,4,3,2,1,要求按递增排序。

32.该排序方法为快速排序。

33.不是。

因为当序列已有序时,快速排序将退化成冒泡排序,时间复杂度为O(n2)。

当待排序序列无序,使每次划分完成后,枢轴两侧子文件长度相当,此时快速排序性能最好。

34.初始序列:

[28],07,39,10,65,14,61,17,50,2121移动:

21,07,39,10,65,14,61,17,50,[]

39移动:

21,07,[],10,65,14,61,17,50,3917移动:

21,07,17,10,65,14,61,[],50,39

65移动:

21,07,17,10,[],14,61,65,50,3914移动:

21,07,17,10,14,[28],61,65,50,39

类似本题的另外叙述题的解答:

(1):

快速排序思想:

首先将待排序记录序列中的所有记录作为当前待排序区域,以第一个记录的关键字作为枢轴(或支点)(pivot),凡其关键字不大于枢轴的记录均移动至该记录之前,凡关键字不小于枢轴的记录均移动至该记录之后。

致使一趟排序之后,记录的无序序列R[s..t]将分割成两部分:

R[s..i-1]和R[i+1..t],且R[j].key≤R[i].key≤R[k].key(s≤j

快速排序在记录有序时蜕变为冒泡排序,可用“三者取中”法改善其性能,避免最坏情况的出现。

具体排序实例不再解答。

35.

(1)不可以,若m+1到n之间关键字都大于m的关键字时,<=k可将j定位到m上,若为

(2)不稳定,例如2,1,2´,(m=1,n=3)对2,1,2´排序,完成会变成1,2´,2。

(3)各次调用qsort1的结果如下:

一次调用m=1,n=1011,3,16,4,18,22,58,60,40,30j=6

二次调用m=7,n=1011,3,16,4,18,22,40,30,58,60j=9(右部)

三次调用m=10,n=10不变,返回m=7,n=811,3,16,4,18,22,30,40,58,60j=8

四次调用m=9,n=8不变,返回m=7,n=7返回m=1,n=54,3,11,16,18,22,30,40,58,60j=3(左部)

五次调用m=1,n=23,4,11,16,18,22,30,40,58,60j=2

六次调用m=1,n=1不变,返回m=3,n=2返回m=4,n=53,4,11,16,18,22,30,40,58,60j=4

七次调用m=4,n=3不变,返回(注:

一次划分后,左、右两部分调用算两次)

(4)最大栈空间用量为O(logn)。

36.在具有n个元素的集合中找第k(1≤k≤n)个最小元素,应使用快速排序方法。

其基本思想如下:

设n个元素的集合用一维数组表示,其第一个元素的下标为1,最后一个元素下标为n。

以第一个元素为“枢轴”,经过快速排序的一次划分,找到“枢轴”的位置i,若i=k,则该位置的元素即为所求;若i>k,则在1至i-1间继续进行快速排序的划分;若i

这种划分一直进行到i=k为止,第i位置上的元素就是第k(1≤k≤n)个最小元素。

37.快速排序各次调用结果:

一次调用:

18,36,77,42,23,65,84,10,59,37,61,98

二次调用:

10,18,77,42,23,65,84,36,59,37,61,98

三次调用:

10,18,61,42,23,65,37,36,59,77,84,98

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1