文档库 最新最全的文档下载
当前位置:文档库 › 第10章_排序答案

第10章_排序答案

第10章_排序答案
第10章_排序答案

第10章排序(参考答案)

18. 对于后三种排序方法两趟排序后,序列的首部或尾部的两个元素应是有序的两个极值,而给定的序列并不满足。

20. 本题为步长为3的一趟希尔排序。 24.枢轴是73。

49. 小根堆中,关键字最大的记录只能在叶结点上,故不可能在小于等于n/2的结点上。

64. 因组与组之间已有序,故将n/k个组分别排序即可,基于比较的排序方法每组的时间下界为O(klog2k),全部时间下界为O(nlog2k)。

部分答案解释如下:

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

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

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

(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].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)s if t(r,i,n) (9)r[1]:=r[i]

(10)s if t(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)s if t(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

26. 程序(a)(1)true (2)a[i]:=t (3)2 TO n step 2 (4)true (5)NOT flag

程序(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, …,R n},其相应的关键字序列为{ K1, K2, …,K n},

这些关键字相互之间可以进行比较,即在它们之间存在着这样一个关系Ks1≤Ks2≤…≤Ks n,

按此固有关系将n个记录序列重新排列为{ Rs1, Rs2, …,Rs n }。若整个排序过程都在内存

中完成,则称此类排序问题为内部排序。

2.

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,分别找出最大者和最小者:Max A、Min A、Max B、Min B,最后Max={Max A,Max B}和Min={Min A,Min B}。对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个待排序记录的序列看成是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. 证明:起泡排序思想是相邻两个记录的关键字比较,若反序则交换,一趟排序完成得到

一个极值。由题假设知R j在R i之前且K j>R i,即说明R j和R i是反序;设对于R i之前全部记录1—R i-1(其中包括K j)中关键字最大为Kmax,则Kmax≥Kj,故经过起泡排序前i-2次后,R i-1

的关键字一定为Kmax,又因Kmax≥K j>R i,故R i-1和R i为反序,由此可知R i-1和R i必定交换,

证毕。

22.采用直接插入排序算法,因为记录序列已基本有序,直接插入排序比较次数少,且由于

少量次序不对的记录与正确位置不远,使直接插入排序记录移动次数也相对较少,故选直接

插入排序算法。

23. 各带标号语句的频度:(1)n (2)n-1 (3)(n+2)(n-1)/2 (4)n(n-1)/2 (5)n-1

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

24. 6, 13, 28, 39, 41, 72, 85, 20

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

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

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

20<28 r=2 i=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 向前移动,与其最终位置相反。但冒泡排序是稳定排序。快速排序中无这种现象。

设D=7

D=3

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

D=1 1,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,21 21移动:21,07,39,10,65,14,61,17,50,[]

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

65移动:21,07,17,10,[],14,61,65,50,39 14移动: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=10 11,3,16,4,18,22,58,60,40,30 j=6

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

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

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

六次调用m=1,n=1 不变,返回 m=3,n=2 返回m=4,n=5

3,4,11,16,18,22,30,40,58,60 j=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

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

归并排序各次调用结果:

一次调用36,98,42,77,23,65,10,84,37,59,18,61, (子文件长度为1,合并后子文件长度为2)

二次调用36,42,77,98,10,23,65,84,18,37,59,61 (子文件长度为2,合并后子文件长

度为4)

三次调用10,23,36,42,65,77,84,98,18,37,59,61 (第一子文件长度8,第二子文件长度为4)

38. 建立堆结构:97,87,26,61,70,12,3,45 (2)70,61,26,3,45,12,87,97

(4)45,12,26,3,61,70,87,97 (6)12,3,26,45,61,70,87,97 39. (1)是大堆; (2)是大堆;(4)是小堆;

(3)不是堆,调成大堆 100,98,66,85,80,60,40,77,82,10,20 类似叙述(1):不是堆 调成大顶堆 92,86,56,70,33,33,48,65,12

(2)①是堆 ②不是堆 调成堆 100,90,80,25,85,75,60,20,10,70,65,50 (3)①是堆 ②不是堆 调成大堆21,9,18,8,4,17,5,6(图略) (4):略 40. 在内部排序方法中,一趟排序后只有简单选择排序和冒泡排序可以选出一个最大(或最小)元素,并加入到已有的有序子序列中,但要比较n-1次。选次大元素要再比较n-2次,

其时间复杂度是O(n 2

)。从10000个元素中选10个元素不能使用这种方法。而快速排序、插入排序、归并排序、基数排序等时间性能好的排序,都要等到最后才能确定各元素位置。只有堆排序,在未结束全部排序前,可以有部分排序结果。建立堆后,堆顶元素就是最大(或最小,视大堆或小堆而定)元素,然后,调堆又选出次大(小)元素。凡要求在n 个元素中选出k(k<2)个最大(或最小)元素,一般均使用堆排序。因为堆排序建堆比较次数至多不超过4n,对深度为k 的堆,在调堆算法中进行的关键字的比较次数至多为2(k-1)次,且辅助空间为O(1)。

(2) 求次小值

42. 用堆排序方法,详见第40题的分析。从序列{59,11,26,34,14,91,25}得到{11,17,25}共用14次比较。其中建堆输出11比较8次,调堆输出17和25各需要比较4次和2次。

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

(1)堆排序,分析同前,共20+5+4+5=34 次比较。 43. 对具体例子的手工堆排序略。

堆与败者树的区别:堆是n 个元素的序列,在向量中存储,具有如下性质:

(i=1,2,…,?n/2?)

由于堆的这个性质中下标i 和2i 、2i+1的关系,恰好和完全二叉树中第i 个结点和其子树结点的序号间的关系一致,所以堆可以看作是n 个结点的完全二叉树。而败者树是由参加比赛的n 个元素作叶子结点而得到的完全二叉树。每个非叶(双亲)结点中存放的是两个子结点中的败者数据,而让胜者去参加更高一级的比赛。另外,还需增加一个结点,即结点0,存放比赛的全局获胜者。 44.(1)堆的存储是顺序的

(2)最大值元素一定是叶子结点,在最下两层上。

(3)在建含有n 个元素、深度为h 的堆时,其比较次数不超过4n ,推导如下:

由于第i 层上的结点数至多是2i-1

,以它为根的二叉树的深度为h-i+1,则调用?n/2?次筛选算法时总共进行的关键字比较次数不超过下式之值:

(2)树形选择排序基本思想:首先对n 个待排序记录的关键字进行两两比较,从中选出?n/2?个较小者再两两比较,直到选出关键字最小的记录为止,此为一趟排序。我们将一趟选出的关键字最小的记录称为“冠军”,而“亚军”是从与“冠军”比较失败的记录中找出,具体做法为:输出“冠军”后,将其叶子结点关键字改为“最大值”,然后从该叶子结点开始,和其左(或右)兄弟比较,修改从叶子结点到根结点路径上各结点的关键字,则根结点的关键字即为次小关键字。如此下去,可依次选出从小到大的全部关键字。

(3) 树形选择排序与直接选择排序相比较,其优点是从求第2个元素开始,从n-i+1个元素中不必进行n-i 次比较,只比较?log 2n ?次,比较次数远小于直接选择排序;其缺点是辅助储存空间大。

(4) 堆排序基本思想是:堆是n 个元素的序列,先建堆,即先选得一个关键字最大或最小的记录,然后与序列中最后一个记录交换,之后将序列中前n-1记录重新调整为堆(调堆的过程称为“筛选”),

再将堆顶记录和当前堆序列的最后一个记录交换,如此反复直至排序结束。优点是在时间性能与树形选择排序属同一量级的同时,堆排序只需要一个记录大小供

交换用的辅助空间,调堆时子女只和双亲比较。避免了过多的辅助存储空间及和最大值的比较,

46. K1到K n是堆,在K n+1加入后,将K1..K n+1调成堆。设c=n+1,f=?c/2?,若K f<=K c,则调整完

成。否则,K f与K c交换;之后,c=f,f=?c/2?,继续比较,直到K f<=K c,或f=0,即为根结点,调整结束。

47. (1)①child=child+1; ②child/2 (2)不能,调为大堆:92,86,56,70,33,33,48,65,12,24

48. (1)不需要。因为建堆后R[1]到R[n]是堆,将R[1]与R[n]交换后,R[2]到R[n-1]仍是堆,故对R[1]到R[n-1]只需从R[1]往下筛选即可。

(2) 堆是n个元素的序列,堆可以看作是n个结点的完全二叉树。而树型排序是n个元素作叶子结点的完全二叉树。因此堆占用的空间小。调堆时,利用堆本身就可以存放输出的有序数据,只需要一个记录大小供交换用的辅助空间。排序后,heap数组中的关键字序列与堆是大堆还是小堆有关,若利用大堆,则为升序;若利用小堆则为降序。

49. 最高位优先(MSD)法:先对最高位关键字K0进行排序,将序列分成若干子序列,每个子序列中的记录都具有相同的K0值,然后,分别就每个子序列对关键字K1进行排序,按K1值不同再分成若干更小的子序列,……,依次重复,直至最后对最低位关键字排序完成,将所有子序列依次连接在一起,成为一个有序子序列。

最低位优先(LSD)法:先对最低位关键字K d-1进行排序,然后对高一级关键字K d-2进行排序,依次重复,直至对最高位关键字K0排序后便成为一个有序序列。进行排序时,不必分成子序列,对每个关键字都是整个序列参加排序,但对K i (0<=i

50. (1)冒泡排序(H,C,Q,P,A,M,S,R,D,F,X,Y)

(2)初始步长为4的希尔排序(P,A,C,S,Q,D,F,X,R,H,M,Y)

(3)二路归并排序(H,Q,C,Y,A,P,M,S,D,R,F,X) (4)快速排序(F,H,C,D,P,A,M,Q,R,S,Y,X)

初始建堆:(A,D,C,R,F,Q,M,S,Y,P,H,X)

51. (1)一趟希尔排序: 12,2,10,20,6,18,4,16,30,8,28 ( D=5)

(2)一趟快速排序:6,2,10,4,8,12,28,30,20,16,18

(3)链式基数排序LSD [0][1][2][3][4][5][6][7][8][9]

↓↓↓↓↓

分配 30 12 4 16 8

↓↓↓↓

10 2 6 28

↓↓

20 18

收集:→30→10→20→12→2→4→16→6→8→28→18

52. (1)2路归并第一趟:18,29,25,47,12,58,10,51;第二趟:18,25,29,47,10,12,51,58;

第三趟:10,12,18,25,29,47,51,58

(2)快速排序第一趟:10,18,25,12,29,58,51,47;

第二趟:10,18,25,12,29,47,51,88;第三趟:10,12,18,25,29,47,51,88

(3)堆排序建大堆:58,47,51,29,18,12,25,10;

①51,47,25,29,18,12,10,58;②47,29,25,10,18,12,51,58;

③29,18,25,10,12,47,51,58;④25,18,12,10,29,47,51,58;

⑤18,10,12,25,29,47,51,58;⑥12,10,18,25,29,47,51,58;⑦10,12,18,25,29,47,51,58

类似叙述:(1) ①设按3路归并 I/O次数=2*wpl=202次

③④⑤略。

53. (1)当至多进行n-1趟起泡排序,或一趟起泡排序中未发生交换(即已有序)时,结束排序。

(2)希尔排序是对直接插入排序算法的改进,它从“记录个数少”和“基本有序”出发,将待排序的记录划分成几组(缩小增量分组),从而减少参与直接插入排序的数据量,当经过几次分组排序后,记录的排列已经基本有序,这个时候再对所有的记录实施直接插入排序。

(3)13,24,33,65,70,56,48,92,80,112

(4)采用树型锦标赛排序选出最小关键字至少要15次比较。再选出次小关键字比较4次。(两两比较8次选出8个优胜,再两两比较4次选出4个优胜,半决赛两场,决赛一场,共比较了15次。将冠军的叶子结点改为最大值,均与兄弟比较,共4次选出亚军。)

54. (1)按LSD法→321→156→57→46→28→7→331→33→34→63

分配 [0] [1] [2] [3] [4] [5] [6] [7] [8] [9]

321 33 34 156 57 28

331 63 46 7

收集→321→331→33→63→34→156→46→57→7→28

类似叙述(1) 略。

55. ①快速排序②冒泡排序③直接插入排序④堆排序

56. A.p[k]←j B.i←i+1 C.k=0 D.m←n E.m

57. 一趟快速排序:22,19,13,6,24,38,43,32

初始大堆:43,38,32,22,24,6,13,19

二路并归:第一趟:19,24,32,43,6,38,13,22

第二趟:19,24,32,43,6,13,22,38

第三趟:6,13,19,22,24,32,38,43

堆排序辅助空间最少,最坏情况下快速排序时间复杂度最差。

58. (1)排序结束条件为没有交换为止

第一趟奇数:35,70,33,65,21,24,33 第二趟偶数:35,33,70,21,65,24,33 第三趟奇数:33,35,21,70,24,65,33 第四趟偶数:33,21,35,24,70,33,65 第五趟奇数:21,33,24,35,33,70,65 第六趟偶数:21,24,33,33,35,65,70 第七趟奇数:21,24,33,33,35,65,70(无交换) 第八趟偶数:21,24,33,33,35,65,70(无交换) 结束

59. 设归并路数为k,归并趟数为s,则s=?log k100?,因?log k100?=3 ,所以k=5,即最少5

路归并。

60. 证明:由置换选择排序思想,第一个归并段中第一个元素是缓冲区中最小的元素,以后每选一个元素都不应小于前一个选出的元素,故当产生第一个归并段时(即初始归并段),缓冲区中m个元素中除最小元素之外,其他m-1个元素均大于第一个选出的元素,即当以后读入元素均小于输出元素时,初始归并段中也至少能有原有的m个元素。证毕。

61. 因

类似叙述

(1)加

62. 加5-(31-1)%(5-1)-1=2个虚段。

63. 内部排序中的归并排序是在内存中进行的归并排序,辅助空间为O(n)。外部归并排序是将外存中的多个有序子文件合并成一个有序子文件,将每个子文件中记录读入内存后的排序方法可采用多种内排序方法。外部排序的效率主要取决于读写外存的次数,即归并的趟数。因为归并的趟数s=?log k m?,其中,m是归并段个数,k是归并路数。增大k和减少m都可减少归并趟数。应用中通过败者树进行多(k)路平衡归并和置换-选择排序减少m,来提高外部排序的效率。

64. 初始败者树

始归并段: R 1:3,19,31,51,61,71,100,101

R 2:9,17,19,20,30,50,55

R 3:6

类似叙述题略。

65. (1)4台磁带机:平衡归并只能用2路平衡归并,需归并?log 2650?=10趟。多步归并进行3路归并,按3

阶广义斐波那契序列。F 11<650

+f 10=149+81=230 t 3=f 11=149 (2) 多步归并排序前五趟归并的情况如下:

1步 2步 3步 4步

5步

注:m p

表示p 个长为m 单位的归并段 1149

表示149个长为1个单位的归并段。

类似叙述题略

类似叙述题略。

67.外排序用k-路归并(k>2)是因为k越小,归并趟数越多,读写外存次数越多,时间效率越低,故,一般应大于最少的2路归并。若将k-路归并的败者树思想单纯用于内排序,因其由胜者树改进而来,且辅助空间大,完全可由堆排序取代,故将其用于内排序效率并不高。

68. R1:19,48,65,74,101 R2:3,17,20,21,21,33,53,99

五.算法设计题

1. void BubbleSort2(int a[],int n) //相邻两趟向相反方向起泡的冒泡排序算法

{ change=1;low=0;high=n-1; //冒泡的上下界

while(low

{ change=0; //设不发生交换

for(i=low;i

if(a[i]>a[i+1]){a[i]<-->a[i+1];change=1;} //有交换,修改标志change high--; //修改上界

for(i=high;i>low;i--) //从下向上起泡

if(a[i]a[i-1];change=1;}

low++; //修改下界

}//while

}//BubbleSort2

[算法讨论]题目中“向上移”理解为向序列的右端,而“向下移”按向序列的左端来处理。

2. typedef struct node

{ ElemType data;

struct node *prior,*next;

}node,*DLinkedList;

void TwoWayBubbleSort(DLinkedList la)

//对存储在带头结点的双向链表la中的元素进行双向起泡排序。

{int exchange=1; // 设标记

DLinkedList p,temp,tail;

head=la //双向链表头,算法过程中是向下起泡的开始结点

tail=null; //双向链表尾,算法过程中是向上起泡的开始结点

while (exchange)

{p=head->next; //p是工作指针,指向当前结点

exchange=0; //假定本趟无交换

while (p->next!=tail) // 向下(右)起泡,一趟有一最大元素沉底

if (p->data>p->next->data) //交换两结点指针,涉及6条链

{temp=p->next; exchange=1;//有交换

p->next=temp->next;temp->next->prior=p //先将结点从链表上摘下

temp->next=p; p->prior->next=temp; //将temp插到p结点前

temp->prior=p->prior; p->prior=temp;

}

else p=p->next; //无交换,指针后移

tail=p; //准备向上起泡

p=tail->prior;

while (exchange && p->prior!=head) //向上(左)起泡,一趟有一最小元素冒出

if (p->dataprior->data) //交换两结点指针,涉及6条链

{temp=p->prior; exchange=1; //有交换

p->prior=temp->prior;temp->prior->next=p; //先将temp结点从链表上摘下

temp->prior=p; p->next->prior=temp; //将temp插到p结点后(右)

temp->next=p->next; p->next=temp;

}

else p=p->prior; //无交换,指针前移

head=p; //准备向下起泡

}// while (exchange)

} //算法结束

3. PROCEDURE StraightInsertSort(VAR R:listtype;n:integer);

VAR i,j:integer;

BEGIN

FOR i:=2 TO n DO {假定第一个记录有序}

BEGIN

R[0]:=R[i]; j:=i-1; {将待排序记录放进监视哨}

WHILE R[0].key

R[j+1]:=R[0] {将待排序记录放到合适位置}

END {FOR}

END;

4. TYPE pointer=↑node;

node=RECORD key:integer; link:pointer; END;

PROCEDURE LINSORT(L:pointer);

VAR t,p,q,s:pointer;

BEGIN

p:=L↑.link↑.link; {链表至少一个结点,p初始指向链表中第二结点(若存在)}

L↑.link↑.link=NIL; {初始假定第一个记录有序}

WHILE p<>NIL DO

BEGIN q:=p↑.link; {q指向p的后继结点}

s=L;

WHILE (s↑.link<>NIL AND s↑.link↑.key

s:=s↑.link; {向后找插入位置}

p↑.link:=s↑.link; s↑.link=p;{插入结点}

p=q; {恢复p指向当前结点}

END {WHILE}

END; {LINSORT}

5. typedef struct

{ int num; float score; }RecType;

void SelectSort(RecType R[51],int n)

{ for(i=1; i

{ //选择第i大的记录,并交换到位

k=i; //假定第i个元素的关键字最大

for(j=i+1;j<=n;j++) //找最大元素的下标

if(R[j].score>R[k].score) k=j;

if(i!=k) R[i] <-->R[k]; //与第i个记录交换

}//for

for(i=1; i<=n; i++) //输出成绩

{ printf("%d,%f",R[i].num,R[i].score); if(i%10==0) printf("\n");} }//SelectSort

6. typedef struct

{ int key; datatype info}RecType

void CountSort(RecType a[],b[],int n) //计数排序算法,将a中记录排序放入b 中

{ for(i=0;i

{ for(j=0,cnt=0;j

if(a[j].key

}

}//Count_Sort

(3) 对于有n个记录的表,关键码比较n2次。

(4) 简单选择排序算法比本算法好。简单选择排序比较次数是n(n-1)/2,且只用一个交换记录的空间;而这种方法比较次数是n2,且需要另一数组空间。

[算法讨论]因题目要求“针对表中的每个记录,扫描待排序的表一趟”,所以比较次数是n2次。若限制“对任意两个记录之间应该只进行一次比较”,则可把以上算法中的比较语句改为:

for(i=0;i

for(i=0;i

for(j=i+1;j

if(a[i].key

7. [题目分析]保存划分的第一个元素。以平均值作为枢轴,进行普通的快速排序,最后枢轴的位置存入已保存的第一个元素,若此关键字小于平均值,则它属于左半部,否则属于右半部。

int partition (RecType r[],int l,h)

{ int i=l,j=h,avg=0;

for(;i<=h;i++) avg+=R[i].key;

i=l; avg=avg/(h-l+1);

while (i

{ while (i=avg) j--;

if (i

while (i

if (i

}

if(R[i].key<=avg) return i; else return i-1;

}

void quicksort (RecType R[],int S,T);

{if (S

{k=partition (R,S,T);

quicksart (R,S,k);

quicksart (R,k+1,T);}

}

8. int Partition(RecType R[],int l,int h)

//一趟快速排序算法,枢轴记录到位,并返回其所在位置,

{ int i=l; j=h; R[0] = R[i]; x = R[i].key;

while(i

{ while(i=x) j--;

if (i

while(i

if (i

}//while

R[i]=R[0];

return i;

}//Partition

9. [题目分析]以Kn为枢轴的一趟快速排序。将上题算法改为以最后一个为枢轴先从前向后

再从后向前。

int Partition(RecType K[],int l,int n)

{ //交换记录子序列K[l..n]中的记录,使枢轴记录到位,并返回其所在位置,//此时,在它之前(后)的记录均不大(小)于它

int i=l; j=n; K[0] = K[j]; x = K[j].key;

while(i

{ while(i

if (i

while(i=x) j--;

if (i

}//while

K[i]=K[0]; return i;

}//Partition

10. [题目分析]把待查记录看作枢轴,先由后向前依次比较,若小于枢轴,则从前向后,直到查找成功返回其位置或失败返回0为止。

int index (RecType R[],int l,h,datatype key)

{ int i=l,j=h;

while (i

{ while (i<=j && R[j].key>key) j--;

if (R[j].key==key) return j;

while (i<=j && R[i].key

if (R[i].key==key) return i;

}

printf(“Not find”) ; return 0;

}//index

11. (1) [题目分析]从第n个记录开始依次与其双亲(n/2)比较,若大于双亲则交换,继而与其双亲的双亲比较,以此类推直到根为止。

void s if t(RecType R[],int n)

{ //假设 R[1..n-1]是大堆,本算法把R[1..n]调成大堆

j=n; R[0]=R[j];

for (i=n/2;i>=1;i=i/2)

if (R[0].key>R[i].key){ R[j]=R[i];j=i;} else break;

R[j]=R[0];

}//s if t

(2)void HeapBuilder(RecType R[],int n)

{ for (i=2;i<=n;i++) s if t (R,i); }

12. void sort (RecType K[],int n)

{ for (i=1;i<=n;i++) T[i]=i;

for (i=1;i

for (j=1;j<=n-i;j++)

if (K[T[j]]>K[T[j+1]]) {t=T[j];T[j]=T[j+1];T[j+1]=t;}

}//sort

[算法讨论] 上述算法得到辅助地址表,T[i]的值是排序后K的第i个记录,要使序列K有序,则要按T再物理地重排K的各记录。算法如下:

void Rearrange(RecType K[],int T[],n)

//对有n个记录的序列K,按其辅助地址表T进行物理非递减排序

{for(i=1;i<=n;i++)

if (T[i]!=i)

{j=i; rc=K[i]; //暂存记录K[i]

while (T[j]!=i) //调整K[T[j]]到T[j]=i为止

{m=T[j]; K[j]=K[m]; T[j]=j; j=m;}

K[j]=rc; T[j]=j; //记录R[i]到位

}//if

}//Rearrange

13. (1) 堆排序是对树型选择排序的改进,克服了树型选择排序的缺点,其定义在前面已多次谈到,请参见上面“四、应用题”的43题和45题(4)。“筛选”是堆排序的基础算法。由于堆可以看作具有n个结点的完全二叉树,建堆过程是从待排序序列第一个非终端结点?n/2?开始,直到根结点,进行“筛选”的过程。堆建成后,即可选得一个关键字最大或最小的记录。然后堆顶元素与序列中最后一个元素交换,再将序列中前n-1记录重新调整为堆,可选得一个关键字次大或次小的记录。依次类推,则可得到元素的有序序列。

(2) void Sift(RecType R[],int i,int m)

{ //假设R[i+1..m]中各元素满足堆的定义,本算法调整R[i]使序列R[i..m]中各元素

满足堆的性质

R[0]=R[i];

for(j=2*i; j<=m; j*=2)

{ if(j

if(R[0].key

}//for

R[i]=R[0];

}//Sift

void HeapSort(RecType R[],int n)

{ //对记录序列R[1..n]进行堆排序。

for(i=n/2;i>0;i--) S if t(R,i,n);

for(i=n;i>1;i--){ R[1]<-->R[i]; S if t(R,1,i-1);}//for

}//HeapSort

(3)堆排序的时间主要由建堆和筛选两部分时间开销构成。对深度为h的堆,“筛选”所需进行的关键字比较的次数至多为2(h-1);对n个关键字,建成深度为h(=?log2n?+1)的堆,所需进行的关键字比较的次数至多C (n),它满足下式:

调整“堆顶”n-1次,总共进行的关键字比较的次数不超过:2(?log2(n-1)?+ ?log2(n-2)?+ …+log22)<2n(?log2n?)因此,堆排序的时间复杂度为O(nlog2n)。

14. PROC LinkedListSelectSort( head: pointer);

//本算法一趟找出一个关键字最小的结点,其数据和当前结点进行交换;若要交换指针,则须记下

//当前结点和最小结点的前驱指针

p:=head↑.next;

WHILE p<>NIL DO

[q:=p↑.next; r:=p; //设r是指向关键字最小的结点的指针

WHILE NIL DO

[IF q↑.data

q:=q↑.next;

]

IF r<>p THEN r↑.data<-->p↑.data

p:=p↑.next;

]

ENDP;

15. void QuickSort(rectype r[n+1]; int n)

// 对r[1..n]进行快速排序的非递归算法

{typedef struct

{ int low,high; }node

node s[n+1];//栈,容量足够大

int quickpass(rectype r[],int,int); // 函数声明

int top=1; s[top].low=1; s[top].high=n;

while (top>0)

{ss=s[top].low; tt=s[top].high; top--;

if (ss

{k=quickpass(r,ss,tt);

if (k-ss>1) {s[++top].low=ss; s[top].high=k-1;}

if (tt-k>1) {s[++top].low=k+1; s[top].high=tt;}

}

} // 算法结束

int quickpass(rectype r[];int s,t)

{i=s; j=t; rp=r[i]; x=r[i].key;

while(i

{while (i

if (i

while (i=r[j].key) i++;

if (i

]

r[i]=rp;

return (i);

} // 一次划分算法结束

[算法讨论]可对以上算法进行两点改进:一是在一次划分后,先处理较短部分,较长的子序列进栈;二是用“三者取中法”改善快速排序在最坏情况下的性能。下面是部分语句片段:

int top=1; s[top].low=1; s[top].high=n;

ss=s[top].low; tt=s[top].high; top--; flag=true;

while (flag || top>0)

{k=quickpass(r,ss,tt);

if (k-ss>tt-k) // 一趟排序后分割成左右两部分

{if (k-ss>1) // 左部子序列长度大于右部,左部进栈

{s[++top].low=ss; s[top].high=k-1; }

if (tt-k>1) ss=k+1; // 右部短的直接处理

else flag=false; // 右部处理完,需退栈

}

else if (tt-k>1) //右部子序列长度大于左部,右部进栈

{s[++top].low=k+1; s[top].high=tt; }

if (k-ss>1) tt=k-1 // 左部短的直接处理

else flag=false // 左部处理完,需退栈

}

if (!flag && top>0)

{ss=s[top].low; tt=s[top].high; top--; flag=true;}

数据结构第10章 习题答案

1.下列排序算法中,其中( D )是稳定的。 A. 堆排序,冒泡排序 B. 快速排序,堆排序 C. 直接选择排序,归并排序 D. 归并排序,冒泡排序 2.有一组数据(15,9,7,8,20,-1,7,4)用快速排序的划分方法进行一趟划分后数据的排序为 ( A )(按递增序)。 A.下面的B,C,D都不对。 B.9,7,8,4,-1,7,15,20 C.20,15,8,9,7,-1,4,7 D. 9,4,7,8,7,-1,15,20 3.下列排序算法中,在每一趟都能选出一个元素放到其最终位置上,并且其时间性能受数据初始特性影响的是:( B )。 A. 直接插入排序 B. 快速排序 C. 直接选择排序 D. 堆排序 4.如果只想得到1000个元素组成的序列中第5个最小元素之前的部分排序的序列,用( D )方法最快。 A.起泡排序 B.快速排列 C.Shell排序 D.堆排序 E.简单选择排序 5.从未排序序列中依次取出一个元素与已排序序列中的元素依次进行比较,然后将其放在已排序序列的合适位置,该排序方法称为( A )排序法。 A. 插入 B. 选择 C. 希尔 D. 二路归并 6. 在排序算法中,每次从未排序的记录中挑出最小(或最大)关键码字的记录,加入到已排序记录的末尾,该排序方法是( A )。 A. 选择 B. 冒泡 C. 插入 D. 堆 7. 若用冒泡排序方法对序列{10,14,26,29,41,52}从大到小排序,需进行( C )次比较。 A. 3 B. 10 C. 15 D. 25 8. 对序列{15,9,7,8,20,-1,4,} 用希尔排序方法排序,经一趟后序列变为{15,-l,4,8,20,9,7}则该次采用的增量是 ( B ) A. l B. 4 C. 3 D. 2 9. 堆排序是( E )类排序 A. 插入 B. 交换 C. 归并 D. 基数 E. 选择 10.排序方法有许多种,(1)法从未排序的序列中依次取出元素,与已排序序列(初始时为空)中的元素作比较,将其放入已排序序列的正确位置上;(2)法从未排序的序列中挑选元素,并将其依次放入已排序序列(初始时为空)的一端;交换排序方法是对序列中的元素进行一系列比较,当被比较的两元素逆序时,进行交换;(3)和(4)是基于这类方法的两种排序方法,而(4)是比(3)效率更高的方法;(5)法是基于选择排序的一种排序方法,是完全二叉树结构的一个重要应用。 (1)--(5): A.选择排序 B.快速排序 C.插入排序 D.起泡排序 E.归并排序 F.shell排序 G.堆排序 H.基数排序 10.1C 5 2A 3D 4B 5G 1.若不考虑基数排序,则在排序过程中,主要进行的两种基本操作是关键字的__ ____和记录的_____。比较,移动 2.分别采用堆排序,快速排序,冒泡排序和归并排序,对初态为有序的表,则最省时间的是_____算法,最费时间的是______算法。冒泡,快速 3. 设用希尔排序对数组{98,36,-9,0,47,23,1,8,10,7}进行排序,给出的步长(也称增量序列)依次是4,2,1则排序需__________趟,写出第一趟结束后,数组中数据的排列次序__________。3,(10,7,-9,0,47,23,1,8,98,36) 4.对给定文件(28,07,39,10,65,14,61,17,50,21)选择第一个元素28进行划分,写出其快速排序第一遍的排序过程。

第10章排序自测题答案

第9章排序自测卷姓名班级 一、填空题(每空1分,共24分) 1. 大多数排序算法都有两个基本的操作:比较和移动。 2. 在对一组记录(54,38,96,23,15,72,60,45,83)进行直接插入排序时,当把第7个记录60插 入到有序表时,为寻找插入位置至少需比较6 次。 3. 在插入和选择排序中,若初始数据基本正序,则选用插入;若初始数据基本反序,则选用 选择。 4. 在堆排序和快速排序中,若初始记录接近正序或反序,则选用堆排序;若初始记录基本 无序,则最好选用快速排序。 5. 对于n个记录的集合进行冒泡排序,在最坏的情况下所需要的时间是O(n2) 。若对其进行快速 排序,在最坏的情况下所需要的时间是O(n2)。 6. 对于n个记录的集合进行归并排序,所需要的平均时间是O(nlog2n),所需要的附加空间 是O(n) 。 7.对于n个记录的表进行2路归并排序,整个归并排序需进行┌log2n┐趟(遍)。 8. 设要将序列(Q, H, C, Y, P, A, M, S, R, D, F, X)中的关键码按字母序的升序重新排列,则: 冒泡排序一趟扫描的结果是H C Q P A M S R D F X Y; 初始步长为4的希尔(shell)排序一趟的结果是P A C S Q H F X R D M Y ; 二路归并排序一趟扫描的结果是H Q C Y A P M S D R F X; 快速排序一趟扫描的结果是 F H C D P A M Q R S Y X; 堆排序初始建堆的结果是A D C R F Q M S Y P H X。 9. 在堆排序、快速排序和归并排序中, 若只从存储空间考虑,则应首先选取方法,其次选取快速排序方法,最后选取归并排序方法; 若只从排序结果的稳定性考虑,则应选取归并排序方法; 若只从平均情况下最快考虑,则应选取堆排序、快速排序和归并排序方法; 若只从最坏情况下最快并且要节省内存考虑,则应选取堆排序方法。 二、单项选择题(每小题1分,共18分) ( C )1.将5个不同的数据进行排序,至多需要比较次。 A. 8 B. 9 C. 10 D. 25 (C)2.排序方法中,从未排序序列中依次取出元素与已排序序列(初始时为空)中的元素进行比较,将其放入已排序序列的正确位置上的方法,称为 A. 希尔排序B. 冒泡排序C. 插入排序D. 选择排序(D)3.从未排序序列中挑选元素,并将其依次插入已排序序列(初始时为空)的一端的方法,称为

第十章:内部排序练习题

第十章:内部排序练习题 一、选择题 1、下述几种排序方法中,平均查找长度最小的是()。 A、插入排序 B、选择排序 C、快速排序 D、归并排序 2、设关键字序列为(3,7,6,9,7,1,4,5,20),对其进行排序的最小交换次数为()。 A、6 B、7 C、8 D、20 3、下列排序算法中不稳定的有()。 A、直接选择排序 B、直接插入排序 C、冒泡排序 D、二叉排序 E、Shell排序 F、快速排序 G、归并排序 H、堆排序 I、基数排序 4、内部排序多个关键字的文件,最坏情况下最快的排序方法是(),相应的时间复杂度为(),该算法是()排序方法。 A、快速排序 B、插入排序 C、归并排序 D、简单选择排序 E、O(nlog2n) F、O(n2) G、O(n2log2n) H、O(n) I、稳定J、不稳定 5、对初始状态为递增的表按递增顺序排序,最省时间的是()算法,最费时间的算法是()。 A、堆排序 B、快速排序 C、插入排序 D、归并排序 6、下述几种排序方法中,要求内存量最大的是()。 A、插入排序 B、选择排序 C、快速排序 D、归并排序 7、在下面的排序方法中,关键字比较的次数与记录的初始排列次序无关的是()。 A、希尔排序 B、冒泡排序 C、插入排序 D、选择排序 8、下列排序中,排序速度与数据的初始排列状态没有关系的是()。 A、直接选择排序 B、基数排序 C、堆排序 D、直接插入排序 9、若需在O(nlog2n)的时间内完成对数组的排序,且要求排序是稳定的,则可选择的排序方法为()。 A、快速排序 B、堆排序 C、归并排序 D、直接插入排序 10、排序方法中,从未排序序列中依次取出元素与已排序序列(初始时为空)中的元素进行比较,将其放入已排序序列正确位置上的方法,称为()。 A、希尔排序 B、冒泡排序 C、插入排序 D、选择排序 11、每次把待排序的元素划分为左右两个子区间,其中左区间中元素的关键字均小于等于基准元素的关键字,右区间中元素的关键字均大于基准元素的关键字,则此排序方法为()。 A、堆排序 B、快速排序 C、冒泡排序 D、Shell排序 12、排序方法中,从未排序序列中挑选元素,并将其依次放入已排序序列(初始时为空)的一端的方法,称为()。 A、希尔排序 B、归并排序 C、插入排序 D、选择排序 13、n个记录的直接插入排序所需记录关键码的最大比较次数为()。 A、nlog2n B、n2/2 C、(n+2)(n-1)/2 D、n-1 14、n个记录的直接插入排序所需的记录最小移动次数为()。 A、2(n-1) B、n2/2 C、(n+3)(n-2)/2 D、2n 15、快速排序在()情况下最不利于发挥其长处,在()情况下最易发挥其长处。 A、被排序的数据量很大 B、被排序的数据已基本有序 C、被排序的数据完全有序 D、被排序的数据中最大与最小值相差不大 E、要排序的数据中含有多个相同值。

第10章排序练习题答案(可编辑修改word版)

第10 章排序练习题答案 一、填空题 1. 大多数排序算法都有两个基本的操作:比较和移动。 2. 在对一组记录(54,38,96,23,15,72,60,45,83)进行直接插入排序时,当把第7 个记录60 插 入到有序表时,为寻找插入位置至少需比较 3 次。 3.在插入和选择排序中,若初始数据基本正序,则选用插入;若初始数据基本反序,则选用 选择。 正序时两种方法移动次数均为0,但比较次数量级不同,插入法:n-1 即O(n),选择法:O(n2) 反序时两种方法比较次数量级相同,均为O(n2),但移动次数不同,插入法:O(n2),选择法:3(n-1)即O(n) 4.在堆排序和快速排序中,若初始记录接近正序或反序,则选用堆排序;若初始记录基本无 序,则最好选用快速排序。 5.对于n 个记录的集合进行冒泡排序,在最坏的情况下所需要的时间是O(n2) 。若对其进行快速 排序,在最坏的情况下所需要的时间是O(n2) 。 6.对于n 个记录的集合进行归并排序,所需要的平均时间是O(nlog2n) ,所需要的附加空间是O(n) 。 7.对于n 个记录的表进行2 路归并排序,整个归并排序需进行┌log2n┐趟(遍)。 8.设要将序列(Q, H, C, Y, P, A, M, S, R, D, F, X)中的关键码按字母序的升序重新排列,则: 冒泡排序一趟扫描的结果是 H C Q P A M S R D F X Y ; 二路归并排序一趟扫描的结果是H Q C Y A P M S D R F X; 快速排序一趟扫描的结果是 F H C D P A M Q R S Y X; 堆排序初始建堆的结果是Y S X R P C M H Q D F A 。(大根堆) 9.在堆排序、快速排序和归并排序中, 若只从存储空间考虑,则应首先选取堆排序方法,其次选取快速排序方法,最后选取归并排序方法;若只从排序结果的稳定性考虑,则应选取归并排序方法; 若只从平均情况下最快考虑,则应选取快速排序方法; 若只从最坏情况下最快并且要节省内存考虑,则应选取堆排序方法。 二、单项选择题 ( C )1.排序方法中,从未排序序列中依次取出元素与已排序序列(初始时为空)中的元素进行比较,将其放入已排序序列的正确位置上的方法,称为 A. 归并排序B. 冒泡排序C. 插入排序D. 选择排序 ( D )2.从未排序序列中挑选元素,并将其依次插入已排序序列(初始时为空)的一端的方法,称为A. 冒泡排序B. 归并排序C. 插入排序D. 选择排序 ( B )3.对n个不同的排序码进行冒泡排序,在下列哪种情况下比较的次数最多。 A. 从小到大排列好的B. 从大到小排列好的C. 元素无序D. 元素基本有序 ( D )4.对n个不同的排序码进行冒泡排序,在元素无序的情况下比较的次数为

中南大学数据结构与算法第10章内部排序课后作业答案

第10章内部排序习题练习答案 1.以关键字序列(265,301,751,129,937,863,742,694,076,438)为例,分别写出执行以下排序算法的各趟排序结束时,关键字序列的状态。 (1) 直接插入排序(2)希尔排序(3)冒泡排序(4)快速排序 (5) 直接选择排序(6) 堆排序(7) 归并排序(8)基数排序 上述方法中,哪些是稳定的排序?哪些是非稳定的排序?对不稳定的排序试举出一个不稳定的实例。 答: (1)直接插入排序:(方括号表示无序区) 初始态: 265[301 751 129 937 863 742 694 076 438] 第一趟:265 301[751 129 937 863 742 694 076 438] 第二趟:265 301 751[129 937 863 742 694 076 438] 第三趟:129 265 301 751[937 863 742 694 076 438] 第四趟:129 265 301 751 937[863 742 694 076 438] 第五趟:129 265 301 751 863 937[742 694 076 438] 第六趟:129 265 301 742 751 863 937[694 076 438] 第七趟:129 265 301 694 742 751 863 937[076 438] 第八趟:076 129 265 301 694 742 751 863 937[438] 第九趟:076 129 265 301 438 694 742 751 863 937

(2)希尔排序(增量为5,3,1) 初始态: 265 301 751 129 937 863 742 694 076 438 第一趟:265 301 694 076 438 863 742 751 129 937 第二趟:076 301 129 265 438 694 742 751 863 937 第三趟:076 129 265 301 438 694 742 751 863 937 (3)冒泡排序(方括号为无序区) 初始态[265 301 751 129 937 863 742 694 076 438] 第一趟:076 [265 301 751 129 937 863 742 694 438] 第二趟:076 129 [265 301 751 438 937 863 742 694] 第三趟:076 129 265 [301 438 694 751 937 863 742] 第四趟:076 129 265 301 [438 694 742 751 937 863] 第五趟:076 129 265 301 438 [694 742 751 863 937] 第六趟:076 129 265 301 438 694 742 751 863 937 (4)快速排序:(方括号表示无序区,层表示对应的递归树的层数)

排序习题参考标准答案

排序习题参考标准答案

————————————————————————————————作者:————————————————————————————————日期:

习题七参考答案 一、选择题 1.内部排序算法的稳定性是指( D )。 A.该排序算法不允许有相同的关键字记录 B.该排序算法允许有相同的关键字记录 C.平均时间为0(n log n)的排序方法 D.以上都不对 2.下面给出的四种排序算法中,( B )是不稳定的排序。 A.插入排序B.堆排序C.二路归并排序D.冒泡排序 3. 在下列排序算法中,哪一种算法的时间复杂度与初始排序序列无关(D )。 A.直接插入排序B.冒泡排序C.快速排序D.直接选择排序 4.关键字序列(8,9,10,4,5,6,20,1,2)只能是下列排序算法中( C )的两趟排序后的结果。 A.选择排序 B.冒泡排序 C.插入排序 D.堆排序 5.下列排序方法中,( D )所需的辅助空间最大。 A.选择排序B.希尔排序C.快速排序D.归并排序 6.一组记录的关键字为(46,79,56,38,40,84),则利用快速排序的方法,以第一个记录为支点得到的一次划分结果为(C )。 A.(38,40,46,56,79,84) B.(40,38,46,79,56,84) C.(40,38,46,56,79,84) D.(40,38,46,84,56,79) 7.在对一组关键字序列{70,55,100,15,33,65,50,40,95},进行直接插入排序时,把65插入,需要比较( A )次。 A. 2 B. 4 C. 6 D. 8 8.从待排序的序列中选出关键字值最大的记录放到有序序列中,该排序方法称为( B )。 A. 希尔排序 B. 直接选择排序 C. 冒泡排序 D. 快速排序 9.当待排序序列基本有序时,以下排序方法中,( B )最不利于其优势的发挥。 A. 直接选择排序 B. 快速排序 C.冒泡排序 D.直接插入排序 10.在待排序序列局部有序时,效率最高的排序算法是( B )。 A. 直接选择排序 B. 直接插入排序 C. 快速排序 D.归并排序 二、填空题 1.执行排序操作时,根据使用的存储器可将排序算法分为内排序和外排序。 2.在对一组记录序列{50,40,95,20,15,70,60,45,80}进行直接插入排序时,当把第7个记录60插入到有序表中时, 为寻找插入位置需比较 3 次。 3.在直接插入排序和直接选择排序中,若初始记录序列基本有序,则选用直接插入排序。 4.在对一组记录序列{50,40,95,20,15,70,60,45,80}进行直接选择排序时,第4次交换和选择后,未排序记录为 {50,70,60,95,80}。 5.n个记录的冒泡排序算法所需的最大移动次数为3n(n-1)/2 ,最小移动次数为0 。 6.对n个结点进行快速排序,最大的比较次数是n(n-1)/2 。 7.对于堆排序和快速排序,若待排序记录基本有序,则选用堆排序。 8.在归并排序中,若待排序记录的个数为20,则共需要进行5 趟归并。 9.若不考虑基数排序,则在排序过程中,主要进行的两种基本操作是关键字的比较和数据元素 的移动。 10.在插入排序、希尔排序、选择排序、快速排序、堆排序、归并排序和基数排序中,平均比较次数最少的是快速排序,需要内存容量最多的是基数排序。 三、算法设计题 1.试设计算法,用插入排序方法对单链表进行排序。 参考答案:

(完整word版)第10章习题(带答案)

1、对待排序的元素序列进行划分,将其分为左、右两个子序列,再对两个子序列施加同样的排序操作,直到子序列为空或只剩一个元素为止。这样的排序方法是 ( )。 A. 直接选择排序 B. 直接插入排序 C. 快速排序 D. 起泡排序 2、对5个不同的数据元素进行直接插入排序,最多需要进行 ( ) 次比较。 A. 8 B. 10 C. 15 D. 25 3、用快速排序法对n 个数据进行排序,在最好情况下的时间复杂度是 O(nlogn),在最坏情况下的时间复杂度是 O(n 2) ,在平均情况下的时间复杂度是 O(nlogn) 。 4、用归并排序法对n 个数据进行排序,在最好情况下的时间复杂度是 O(nlogn) ,在最坏情况下的时间复杂度是 O(nlogn) ,在平均情况下的时间复杂度是 O(nlogn) 。 5、在对n 个元素进行直接插入排序的过程中,共需要进行2n 趟。( 错 ) 快速排序在最坏情况下的时间复杂度为)(2n 。( 对 ) 6、若一组记录的关键字为(46,79,56,38,40,84),则利用快速排序的方法,以第一个记录为基准得到一次划分结构为( )。 A.40,38,46,84,56,79 B.40,38,46,56,79,84 C.40,38,46,79,56,84 D.38,40,46,56,79,84 7、下列四个序列中,哪一个是堆( )。 A. 75,65,30,15,25,45,20,10 B. 75,65,45,10,30,25,20,15 C. 75,45,65,30,15,25,20,10 D. 75,45,65,10,25,30,20,15 8、由无序序列{ 15,9,7,8,20,7}建立的初始小顶堆为 7,8,7,9,20,15_ 。 9、已知5个数据元素为(54,28,16,34,73),对该数列按从小到大排序,经过一趟冒泡排序后的序列为 28,16,34,54,73_ 。 10、若不考虑基数排序,则在排序过程中,主要进行的两种基本操作是关键字的__ 比较_____和记录的___移动__。 11、直接插入排序在最好情况下的时间复杂度为( )。

《数据结构》期末复习题及参考答案 - 第10章 排序【HSH2013级】给学生

《数据结构》期末复习题及参考答案- 第10章排序 一、选择题 1、n个记录进行直接插入排序时,记录最小的比较次数是( ) A.(n-1) B.0 C.(n+3)(n-2)/2 D.n2/2 2、对n个记录进行希尔排序,所需要的辅助存储空间为()。 A.O(1og2n) B.O(n) C.O(1) D.O(n2) 3、就平均性能而言,目前最好的内排序方法是( )排序法。 A.冒泡 B.希尔插入 C.交换 D.快速 4、直接插入排序在最好情况下的时间复杂度为() A.O(logn) B.O(n) C.O(n*logn) D.O(n2) 5、以下算法思路分别出自什么排序算法: 取当前最小的数,插入到已经排好序的数据末尾:(); 取当前要排序的数,插入到已经排好序的数据中适当位置:(); 相邻两个数比较,如果大小顺序颠倒就把两者交换过来:()。 6、设一组初始关键字记录关键字为(20,15,14,18,21,36,40,10),则以20为基准记录 的一趟快速排序结束后的结果为( )。 (A) 10,15,14,18,20,36,40,21 (B) 10,15,14,18,20,40,36,21 (C) 10,15,14,20,18,40,36,2l (D) 15,10,14,18,20,36,40,21 7、下列四种排序算法中,哪一个需要采用递归调用的方式实现 A、直接插入排序 B、快速排序 C、冒泡排序 D、折半插入排序 8、从未排序序列中依次取出一个元素与已排序序列中的元素依次进行比较,然后将其放在 已排序序列的合适位置,该排序方法称为( )排序法。 A.插入 B.选择 C.希尔 D.快速 9、快速排序方法在()情况下最不利于发挥其长处。 A.要排序的数据量太大 B.要排序的数据中含有多个相同值 C.要排序的数据个数为奇数 D.要排序的数据已基本有序 10、对一组数据(84,47,25,15,21)排序,数据的排列次序在排序的过程中的变化为 (1)84 47 25 15 21(2)15 47 25 84 21 (3)15 21 25 84 47 (4)15 21 25 47 84 则采用的排序是( )。 A. 选择 B. 冒泡 C. 快速 D. 插入 11、在希尔排序算法中,需要借助()实现

数据结构严蔚敏版第十章答案

第十章内部排序 10.23 void Insert_Sort1(SqList &L)//监视哨设在高下标端的插入排序算法 { k=L.length; for(i=k-1;i;--i) //从后向前逐个插入排序 if(L.r[i].key>L.r[i+1].key) { L.r[k+1].key=L.r[i].key; //监视哨 for(j=i+1;L.r[j].key>L.r[i].key;++j) L.r[j-1].key=L.r[j].key; //前移 L.r[j-1].key=L.r[k+1].key; //插入 } }//Insert_Sort1 10.24 void BiInsert_Sort(SqList &L)//二路插入排序的算法 { int d[MAXSIZE]; //辅助存储 x=L.r.key;d=x; first=1;final=1; for(i=2;i<=L.length;i++) { if(L.r[i].key>=x) //插入前部 { for(j=final;d[j]>L.r[i].key;j--) d[j+1]=d[j]; d[j+1]=L.r[i].key; final++; } else //插入后部 { for(j=first;d[j]

数据结构第九章排序习题及答案

习题九排序 一、单项选择题 1.下列内部排序算法中: A.快速排序 B.直接插入排序 C. 二路归并排序 D. 简单选择排序 E. 起泡排序 F. 堆排序 (1)其比较次数与序列初态无关的算法是() (2)不稳定的排序算法是() (3)在初始序列已基本有序(除去n个元素中的某k个元素后即呈有序,k<

第十章 排序

第十章排序 一、名词解释 1.排序 2.内部排序 3.外部排序 4.堆 5.堆排序 二、填空 1.若待排序的序列中存在多个记录具有相同的键值,经过排序,这些记录的相对次序仍然保持不变,则称这种排序方法是________的,否则称为 ________的。 2.按照排序过程涉及的存储设备的不同,排序可分为________排序和 ________排序。 3.按排序过程中依据的不同原则对内部排序方法进行分类,主要有: ________、________、________、 ________等四类。 4.在排序算法中,分析算法的时间复杂性时,通常以________和________为标准操作。评价排序的另一个主要标准是执行算法所需要的________。 5.常用的插入排序方法有________插入排序、________插入排序、________插入排序和________插入排序。 6.以下为直接插入排序的算法。请分析算法,并在________上填充适当的语句。 void straightsort(list r); {for(i=___________;i<=n;i++) {r[0]=r[i];j=i-1; while(r[0].key

数据结构第10章 内部排序习题

第10章内部排序 一、单项选择题 1.若要尽可能地完成对实数数组得排序,且要求排序是稳定的,则应选______。 A.快速排序 B.堆排序 C.归并排序 D.基数排序 2.如果只想得到1000个元素组成的序列中第5个最小元素之前的部分排序的序列,用______方法最快。 A.冒泡排序 B.快速排序 C.希尔排序 D.堆排序 E.简单选择排序 3.将两个各有N个元素的有序表归并成一个有序表,其最小的比较次数是______。 A.N B.2N-1 C.2N D.N-1 4.就平均性能而言,目前最好的内排序方法是______排序法。 A.冒泡排序 B.希尔排序 C.插入排序 D.快速排序 5.若需要在O(nlog2n)的时间内完成对数据的排序,且要求排序是稳定的,则可选择的排序方法是______。 A.快速排序 B.堆排序 C.归并排序 D.直接插入排序 6.下面给出的四种排序方法中,排序过程中的比较次数与排序方法无关的是______。 A.选择排序法 B.插入排序法 C.快速排序法 D.堆排序法 7.数据序列{8,9,10,4,5,6,20,1,2}只能是下列排序算法中的()的两趟排序后的结果。

A.选择排序 B.冒泡排序 C.插入排序 D.堆排序 8.对一组数据{84,47,25,15,21}排序,第一趟的排序结果为15,47,25,84,21;第二趟排序的结果为15,21,25,84,47;第三趟排序的结果为15,21,25,47,84,则采用排序的方法是______。 A.选择排序 B.冒泡排序 C.快速排序 D.插入排序 9.下列排序算法中______排序在一趟结束后不一定能选出一个元素放在其最终位置上。 A.选择排序 B.冒泡排序 C.归并排序 D.堆排序 10.在下面的排序方法中,辅助空间为O(n)的是______。 A.希尔排序 B.堆排序 C.选择排序 D.归并排序 11.直接插入排序在最好的情况下的时间复杂度为______。 A.O(log2n) B.O(n) C. O(nlog2n) D.O(n2) 12.若用冒泡排序方法对序列{10,14,26,29,41,52}从大到小排序,需进行______次比较。 A.3 B.10 C.15 D.25 13.对序列{15,9,7,8,20,-1,4}用希尔排序方法排序,经过一趟后序列变为{15,-1,4,8,20,9,7},则该次采用的增量是 ______。 A.1 B.4 C.3 D.2 14.对下列关键字序列用快速排序法进行排序,速度最快的情形是

第十章排序答案

第10章排序 一、选择题 1.某内排序方法的稳定性是指( D )。【南京理工大学 1997 一、10(2分)】 A.该排序算法不允许有相同的关键字记录 B.该排序算法允许有相同的关键字记录 C.平均时间为0(n log n)的排序方法 D.以上都不对 2.下面给出的四种排序法中( D )排序法是不稳定性排序法。【北京航空航天大学 1999 一、10 (2分)】 A. 插入 B. 冒泡 C. 二路归并 D. 堆积 3.下列排序算法中,其中(D )是稳定的。【福州大学 1998 一、3 (2分)】 A. 堆排序,冒泡排序 B. 快速排序,堆排序 C. 直接选择排序,归并排序 D. 归并排序,冒泡排序 4.稳定的排序方法是( B )【北方交通大学 2000 二、3(2分)】 A.直接插入排序和快速排序 B.折半插入排序和起泡排序 C.简单选择排序和四路归并排序 D.树形选择排序和shell排序 5.下列排序方法中,哪一个是稳定的排序方法?( B )【北方交通大学 2001 一、8(2分)】A.直接选择排序 B.二分法插入排序 C.希尔排序 D.快速排序 6. 快速排序方法在( D )情况下最不利于发挥其长处。【燕山大学 2001 一、3 (2分)】 A. 要排序的数据量太大 B. 要排序的数据中含有多个相同值 C. 要排序的数据个数为奇数 D. 要排序的数据已基本有序 7. 以下序列不是堆的是( D )。【西安电子科技大学 2001应用一、5 (2分)】 A. (100,85,98,77,80,60,82,40,20,10,66) B. (100,98,85,82,80,77,66,60,40,20,10) C. (10,20,40,60,66,77,80,82,85,98,100) D. (100,85,40,77,80,60,66,98,82,10,20) 8.下列四个序列中,哪一个是堆( C )。【北京工商大学 2001 一、8 (3分)】 A. 75,65,30,15,25,45,20,10 B. 75,65,45,10,30,25,20,15 C. 75,45,65,30,15,25,20,10 D. 75,45,65,10,25,30,20,15 9.从未排序序列中依次取出一个元素与已排序序列中的元素依次进行比较,然后将其放在已排序序列的合适位置,该排序方法称为( A )排序法。【北京航空航天大学 1999 一、8(2分)】 A. 插入 B. 选择 C. 希尔 D. 二路归并 10.比较次数与排序的初始状态无关的排序方法是( D )。【北方交通大学 2000 二、2(2分)】A.直接插入排序 B.起泡排序 C.快速排序 D.简单选择排序 11.对关键码序列28,16,32,12,60,2,5,72快速排序,从小到大一次划分结果为( B )。 A. (2,5,12,16)26(60,32,72) B. (5,16,2,12)28(60,32,72) C. (2,16,12,5)28(60,32,72) D. (5,16,2,12)28(32,60,72) 【青岛大学 2000 三、4 (2分)】12.下列排序算法中( B )不能保证每趟排序至少能将一个元素放到其最终的位置上。 A.快速排序 B. shell排序 C. 堆排序 D.冒泡排序【合肥工业大学 2001 一、3(2分)】13.有一组数据(15,9,7,8,20,-1,7,4)用快速排序的划分方法进行一趟划分后数据的排序为 ( A )(按递增序)。【南京理工大学 1996 一、4 (2分)】 A.下面的B,C,D都不对。 B.9,7,8,4,-1,7,15,20 C.20,15,8,9,7,-1,4,7 D. 9,4,7,8,7,-1,15,20 14.一组记录的关键码为(46,79,56,38,40,84),则利用快速排序的方法,以第一个记录为基准得到的一次划分结果为( C )。【燕山大学 2001 一、4(2分)】 A.(38,40,46,56,79,84) B. (40,38,46,79,56,84) C.(40,38,46,56,79,84) D. (40,38,46,84,56,79) 15.下列排序算法中,在待排序数据已有序时,花费时间反而最多的是( C )排序。 A.冒泡 B. 希尔 C. 快速 D. 堆【南京理工大学 2001 一、12 (1.5分)】 16. 对初始状态为递增序列的表按递增顺序排序,最省时间的是( C )算法,最费时间的是( B )算 法。 A. 堆排序 B. 快速排序 C. 插入排序 D. 归并排序【南开大学 2000 一、5】 17. 就平均性能而言,目前最好的内排序方法是( D )排序法。【西安电子科技大学 1998 一、9 (2分)】 A. 冒泡 B. 希尔插入 C. 交换 D. 快速 18.如果只想得到1000个元素组成的序列中第5个最小元素之前的部分排序的序列,用( D )方法最快。

第7章 排序 习题参考答案

习题七参考答案 一、选择题 1.内部排序算法的稳定性是指( D )。 A.该排序算法不允许有相同的关键字记录 B.该排序算法允许有相同的关键字记录 C.平均时间为0(n log n)的排序方法 D.以上都不对 2.下面给出的四种排序算法中,( B )是不稳定的排序。 A.插入排序B.堆排序C.二路归并排序D.冒泡排序 3. 在下列排序算法中,哪一种算法的时间复杂度与初始排序序列无关(D )。 A.直接插入排序B.冒泡排序C.快速排序D.直接选择排序 4.关键字序列(8,9,10,4,5,6,20,1,2)只能是下列排序算法中( C )的两趟排序后的结果。 A.选择排序 B.冒泡排序 C.插入排序 D.堆排序 5.下列排序方法中,( D )所需的辅助空间最大。 A.选择排序B.希尔排序C.快速排序D.归并排序 6.一组记录的关键字为(46,79,56,38,40,84),则利用快速排序的方法,以第一个记录为支点得到的一次划分结果为(C )。 A.(38,40,46,56,79,84) B.(40,38,46,79,56,84) C.(40,38,46,56,79,84) D.(40,38,46,84,56,79) 7.在对一组关键字序列{70,55,100,15,33,65,50,40,95},进行直接插入排序时,把65插入,需要比较( A )次。 A. 2 B. 4 C. 6 D. 8 8.从待排序的序列中选出关键字值最大的记录放到有序序列中,该排序方法称为( B )。 A. 希尔排序 B. 直接选择排序 C. 冒泡排序 D. 快速排序 9.当待排序序列基本有序时,以下排序方法中,( B )最不利于其优势的发挥。 A. 直接选择排序 B. 快速排序 C.冒泡排序 D.直接插入排序 10.在待排序序列局部有序时,效率最高的排序算法是( B )。 A. 直接选择排序 B. 直接插入排序 C. 快速排序 D.归并排序 二、填空题 1.执行排序操作时,根据使用的存储器可将排序算法分为内排序和外排序。 2.在对一组记录序列{50,40,95,20,15,70,60,45,80}进行直接插入排序时,当把第7个记录60插入到有序表中 时,为寻找插入位置需比较 3 次。 3.在直接插入排序和直接选择排序中,若初始记录序列基本有序,则选用直接插入排序。 4.在对一组记录序列{50,40,95,20,15,70,60,45,80}进行直接选择排序时,第4次交换和选择后,未排序记录为 {50,70,60,95,80}。 5.n个记录的冒泡排序算法所需的最大移动次数为3n(n-1)/2 ,最小移动次数为0 。 6.对n个结点进行快速排序,最大的比较次数是n(n-1)/2 。 7.对于堆排序和快速排序,若待排序记录基本有序,则选用堆排序。 8.在归并排序中,若待排序记录的个数为20,则共需要进行5 趟归并。 9.若不考虑基数排序,则在排序过程中,主要进行的两种基本操作是关键字的比较和数据元 素的移动。 10.在插入排序、希尔排序、选择排序、快速排序、堆排序、归并排序和基数排序中,平均比较次数最少的是快速排序,需要内存容量最多的是基数排序。 三、算法设计题 1.试设计算法,用插入排序方法对单链表进行排序。 参考答案: public static void insertSort(LinkList L) {

第十章试题(有答案)

一、填充题 1、按排序操作中所涉及的存储器的不同,可以把排序分成和两大类。 内部排序外部排序 2、主关键字是可以地标识一个数据元素的关键字。 唯一 3、希尔排序是属于插入排序的一种类型,它又被称为排序。 缩小增量 4、次关键字是用以标识数据元素的关键字。 多个 5、按关键字与排序结果的关系,可以把排序方法分成和两类。 稳定排序非稳定排序 6、在直接插入排序、希尔排序、直接选择排序、堆排序、快速排序和基数排序中,需要内存量最大的是。 基数排序 7、在堆排序和快速排序中,如果数据元素的原始序列接近正序或反序,则选用最好,如果数据元素的原始序列无序,则最好选用。 堆排序快速排序 8、对于由n个数据元素构成的序列实施冒泡排序时,最少的比较次数是。冒泡排序的结束条件是。 n-1 刚做完的一趟排序没有交换元素 9、对于由n个数据元素构成的序列实施冒泡排序时,数据元素的最少交换次数是,此情况说明该数据元素序列是。 0 已按排序要求有序的 二、单选题(每题2分,共24分) 1、如果采用直接选择排序法来排序一个长度为5,且已按相反顺序排序的数组,共需的比较次数是。 A、1 B、15 C、8 D、10 D 2、有一组随机数25,84,21,47,15,27,68,35,20,现在采用某种算法对它们进行排序,

具体过程如下: (1)25 84 21 47 15 27 68 35 20 (2)20 15 21 25 47 27 68 35 84 (3)15 20 21 25 35 27 47 68 84 (4)15 20 21 25 27 35 47 68 84 请根据以上情况,判断所用的排序方法是。 A、直接选择排序 B、快速排序 C、冒泡排序 D、Shall 排序 B 3、在所有学过的排序方法中,关键字比较次数与记录的初始排列次序无关的是。 A、冒泡排序 B、直接选择排序 C、直接插入排序 D、Shell排序 B 4、设有1000个无序的数据元素,希望用最快的速度挑选出其中前10个最大的元素,最好选用的排序方法是。 A、冒泡排序 B、基数排序 C、堆排序 D、快速排序 C 5、在待排元素序列基本有序的前提下,下面给出的几种排序方法效率最高的是。 A、直接插入排序 B、直接选择排序 C、归并排序 D、快速排序 A 6、现有一待排序列为49,38,65,97,76,13,27,50,如果以第一个数据元素49为支撑元素,在经过一趟快速排序后的结果序列是。 A、27,38,65,97,76,13,49,50 B、27,38,49,97,76,13,65,50 C、27,38,13,49,76,97,65,50 D、27,38,13,97,76,49,65,50 C 7、在下面给出的几种排序方法中,从未排序之序列中依次取出元素与已经排好的序列(开始为空)中的元素进行比较以确定其在已排序列中的位置的排序方法是。 A、冒泡排序 B、希尔排序 C、快速排序 D、直接插入排序 D

相关文档
相关文档 最新文档