ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:252.50KB ,
资源ID:11225502      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11225502.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第9章自测题答案.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第9章自测题答案.docx

1、第9章自测题答案第9章 排序 自测卷 答案 姓名 班级 题号一二三四五总分题分241836814100得分一、填空题(每空1分,共24分)1. 大多数排序算法都有两个基本的操作: 比较(两个关键字的大小) 和 移动(记录或改变指向记录的指针) 。2. 在对一组记录(54,38,96,23,15,72,60,45,83)进行直接插入排序时,当把第7个记录60插入到有序表时,为寻找插入位置至少需比较 3 次。(可约定为,从后向前比较)3. 在插入和选择排序中,若初始数据基本正序,则选用 插入排序(到尾部) ;若初始数据基本反序,则选用 选择排序 。4. 在堆排序和快速排序中,若初始记录接近正序或反

2、序,则选用 堆排序 ;若初始记录基本无序,则最好选用 快速排序 。5. 对于n个记录的集合进行冒泡排序,在最坏的情况下所需要的时间是 O(n2) 。若对其进行快速排序,在最坏的情况下所需要的时间是 O(n2) 。6. 对于n个记录的集合进行归并排序,所需要的平均时间是 O(nlog2n) ,所需要的附加空间是 O(n) 。7【计研题2000】对于n个记录的表进行2路归并排序,整个归并排序需进行 log2n 趟(遍),共计移动 n log2n 次记录。(即移动到新表中的总次数!共log2n趟,每趟都要移动n个元素)8.设要将序列(Q, H, C, Y, P, A, M, S, R, D, F,

3、X)中的关键码按字母序的升序重新排列,则:冒泡排序一趟扫描的结果是 H, C, Q, P, A, M, S, R, D, F, X ,Y ;初始步长为4的希尔(shell)排序一趟的结果是 P, A, C, S, Q, D, F, X , R, H,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. 在堆排序、快速排序和归并排序中,若只从存储

4、空间考虑,则应首先选取 堆排序 方法,其次选取 快速排序 方法,最后选取 归并排序 方法;若只从排序结果的稳定性考虑,则应 选取归并排序方法;若只从平均情况下最快考虑,则应选取快速排序方法;若只从最坏情况下最快并且要节省内存考虑,则应选取堆排序方法。二、单项选择题(每小题1分,共18分)( C )1将5个不同的数据进行排序,至多需要比较 次。. 8 . 9 . 10 . 25( C )2 排序方法中,从未排序序列中依次取出元素与已排序序列(初始时为空)中的元素进行比较,将其放入已排序序列的正确位置上的方法,称为. 希尔排序 . 冒泡排序 . 插入排序 . 选择排序( D )3 排序方法中,从未

5、排序序列中挑选元素,并将其依次插入已排序序列(初始时为空)的一端的方法,称为. 希尔排序 . 归并排序 . 插入排序 . 选择排序( C )4对个不同的排序码进行冒泡排序,在下列哪种情况下比较的次数最多。. 从小到大排列好的 . 从大到小排列好的 . 元素无序 . 元素基本有序( D )5对个不同的排序码进行冒泡排序,在元素无序的情况下比较的次数为. n+1 . n . n-1 . n(n-1)/2(前3个答案都太小了)( C )6快速排序在下列哪种情况下最易发挥其长处。. 被排序的数据中含有多个相同排序码 . 被排序的数据已基本有序. 被排序的数据完全无序 . 被排序的数据中的最大值和最小值

6、相差悬殊( B )7 【计研题2001】对有n个记录的表作快速排序,在最坏情况下,算法的时间复杂度是AO(n) BO(n2) CO(nlog2n) DO(n3)( C )8若一组记录的排序码为(46, 79, 56, 38, 40, 84),则利用快速排序的方法,以第一个记录为基准得到的一次划分结果为. 38, 40, 46, 56, 79, 84 . 40,38, 46 , 79, 56, 84 . 40, 38,46, 56, 79, 84 . 40, 38,46, 84, 56, 79( A&D )9【计研题2001】在最好情况下,下列排序算法中 排序算法所需比较关键字次数最少。A冒泡

7、B归并 C快速 D直接插入(仅n1次!)( C )10 【计研题2001】置换选择排序的功能是 。 (置换选择排序简单选择排序?)A选出最大的元素 B产生初始归并段 C产生有序文件 D置换某个记录( A )11将5个不同的数据进行排序,至少需要比较 次。. 4 . 5 . 6 . 7( D )12下列关键字序列中, 是堆。. 16,72,31,23,94,53 . 94,23, 31, 72, 16, 53 . 16, 53, 23,94,31, 72 . 16, 23, 53,31, 94, 72( B )13堆是一种 排序。. 插入 .选择 . 交换 . 归并( C )14堆的形状是一棵

8、. 二叉排序树 .满二叉树 . 完全二叉树 . 平衡二叉树( B )15若一组记录的排序码为(46, 79, 56, 38, 40, 84),则利用堆排序的方法建立的初始堆为. 79, 46, 56, 38, 40, 84 . 84, 79, 56, 38, 40, 46 . 84, 79, 56, 46, 40, 38 . 84, 56, 79, 40, 46, 38 ( B )16 下述几种排序方法中,平均查找长度(ASL)最小的是. 插入排序 .快速排序 . 归并排序 . 选择排序( C )17 下述几种排序方法中,要求内存最大的是. 插入排序 .快速排序 . 归并排序 . 选择排序(

9、B )18目前以比较为基础的内部排序方法中,其比较次数与待排序的记录的初始排列状态无关的是. 插入排序 . 二分插入排序 . 快速排序 . 冒泡排序三、简答题(每小题4分,共36分)1. 【全国专升本题】已知序列基本有序,问对此序列最快的排序方法是多少,此时平均复杂度是多少?答:插入排序和冒泡应该是最快的。因为只有比较动作,无需移动元素。此时平均时间复杂度为O(n)2. 设有1000个无序的元素,希望用最快的速度挑选出其中前10个最大的元素,最好采用哪种排序方法?答:用堆排序或锦标赛排序最合适,因为不必等全部元素排完就能得到所需结果,时间效率为O(nlog2n);若用冒泡排序则需时n!/(n-

10、10)!3. 用某种排序方法对线性表(25, 84,21,47,15,27,68,35,20)进行排序时,元素序列的变化情况如下:25, 84,21,47,15,27,68,35,20 20, 15, 21, 25,47, 27,68,35, 84 15, 20, 21, 25,35, 27, 47, 68, 8415, 20, 21, 25,27, 35, 47, 68, 84, 问采用的是什么排序方法?答:用的是快速排序方法。注意每一趟要振荡完全部元素才算一个中间结果。4. 对于整数序列100,99,98,3,2,1,如果将它完全倒过来,分别用冒泡排序和快速排序法,它们的比较次数和交换次数

11、各是多少?答:冒泡排序的比较和交换次数将最大,都是1+2+n-1=n(n-1)/25099=4545次快速排序则看按什么数据来分子表。如果按100来分,则很惨,也会是n(n-1)/2!若按中间数据50或51来分表,则:第1轮能确定1个元素,即在1个子表中比较和交换了n1个元素;n(21-1)第2轮能再确定2个元素,即在2个子表中比较和交换了n3个元素;n(22-1)第3轮能再确定4个元素,即在4个子表中比较和交换了n7个元素;n(23-1)第4轮能再确定8个元素,即在8个子表中比较和交换了n15个元素;n(24-1)第6轮能再确定32个元素,即在32个子表中比较和交换了n65个元素;n(26-

12、1)第7轮则能全部确定,(因为27=128), 在100个子表中比较和交换了n(1001)个元素; 比较和交换总次数为:7n(2112212312611001) 7n+7(12464+100)=7n(8+16+32+164)=700-220=480次若从中间选择初始元素,则ASL=(n+1)log2n(212223+2m)= nlog2n+log2n(212223+n)O(nlog2n)5.【全国专升本试题】【严题集10.15】设有n个值不同的元素存于顺序结构中,试问能否用比2n-3少的比较次数选出这n个元素中的最大值和最小值?若能请说明如何实现(不需写算法)。在最坏情况下至少需进行多少次比较

13、。(或问:对含有n个互不相同元素的集合,同时找最大元和最小元至少需进行多少次比较?)答:若用冒泡排序法,求最大值需n-1次比较;第二趟改为从n-1开始求最小值,需n-2次比较,合计2n-3次。显然本题意图是放弃冒泡排序,寻找其他方法。法1 :一个简单的办法是,在一趟比较时,将头两个元素分别作为最大和最小值的暂存内容,将其余n-2个元素与其相比,具体可设计为:第1步:a1a2? YES则直接替换a2,NO则再比较a1, 12次;第3步:a4a2? YES则直接替换a2,NO则再比较a1, 12次;第n-1步:ana2? YES则直接替换a2,NO则再比较a1, 12次;合计:(n-2)(12)1

14、=(n-1)(2n-3 )2n-3 最好情况至少需要n-1次比较,最坏情况需2n-3次。法2 :借用快速排序第一趟思想:以a1为支点,将序列分成两个子表。这一趟需要n-1次比较;然后,在左边的子表中求最小值,冒泡一趟需要y-1次;在右边的子表中求最大值,冒泡一趟需要z-1次;合计需要(n-1)+( y-1)+( z-1)=n+y+z-3 因为y+z+1=n, 所以总次数2n42n3!但最坏情况下仍为为2n-3次,即一趟完毕后仍为单子表的情况。怎么办?有无更好的办法?法3 :能否用锦标赛排序思路?求最大值等于求冠军,需要n1次比较;但接着求最小值,等于在n/2个叶子中比较即可。编程也不复杂:可设

15、计为,第一趟:n个数据两两比较(共n/2次),小者放偶数位,大者放奇数位;第二趟:对奇数位元素继续两两比较(n/4次);对偶数位元素也两两比较(n/4次);合计n/2次;第三趟:对奇数位元素继续两两比较(n/23次);对偶数位元素也两两比较(n/23次);合计n/22次;第四趟:对奇数位元素继续两两比较(n/24次);对偶数位元素也两两比较(n/24次);合计n/23次;第log2n趟:对奇数位元素继续两两比较(n/2log2n次1);对偶数位元素也两两比较(1次);合计2次;全部比较次数为:2+4+8+n/2次2n-3 (n1) 用二进制性质即可证明? 因为 20+21+2k-2+2k-12

16、k ,即21+2k-2+2k-12k 1 2k 1 +2k 2(n=2k, 当k1,即n=2时为极端情况,11; n=3时,1.53k=2时,即n=4时,2ai+1,则两者交换;第三趟对奇数i,第四趟对偶数i;依次类推直至整个序列有序为止。(1)试问这种排序方法的结束条件是什么?是否为稳定排序?(2)分析当初始序列为正序或逆序两种情况下,奇偶交换排序过程中所需进行的关键字比较的次数。 (3)分析此种排序方法的平均复杂度及最坏复杂度。答:(1) 这种算法其实是两两比较,第一趟很像锦标赛的“初赛”,将胜者(大数)置于偶数单元;第二趟对偶数单元操作,即第一组大者与第二组小者战,大者后移。结果相当于冒

17、泡排序的一趟;所以结束条件应为偶数趟无交换。结束条件是:若n为偶数时,奇数循环时in-1 ,偶数循环时in ,若n为奇数时,奇数循环时in 偶数循环时in+1似乎不稳定?因为交换没有依次进行。四、【全国专升本类似题】【类严题集10.1】以关键字序列(256,301,751,129,937,863,742,694,076,438)为例,分别写出执行以下算法的各趟排序结束时,关键字序列的状态,并说明这些排序方法中,哪些易于在链表(包括各种单、双、循环链表)上实现? 直接插入排序 希尔排序 冒泡排序 快速排序直接选择排序 堆排序 归并排序 基数排序 (8分)解:先回答第2问: 皆易于在链表上实现。1

18、 直接插入排序的中间过程如下: 希尔排序的中间过程如下:3 冒泡排序的中间过程如下: 快速排序的中间过程如下:5 直接选择排序的中间过程如下: 堆排序(大根堆)的中间过程如下:7 归并排序排序的中间过程如下: 8 基数排序的中间过程如下:五、算法设计题(4选2, 每题7分,共14分)1. 【严题集10.25】试编写教科书10.2.2节中所述链表插入排序的算法。10.25 void SLInsert_Sort(SLList &L)/静态链表的插入排序算法 L.r0.key=0;L.r0.next=1; L.r1.next=0; /建初始循环链表 for(i=2;i=L.length;i+) /逐

19、个插入 p=0;x=L.ri.key; while(L.rL.rp.next.keyx&L.rp.next) p=L.rp.next; q=L.rp.next; L.rp.next=i; L.ri.next=q; /for p=L.r0.next; for(i=1;iL.length;i+) /重排记录的位置 while(pi) p=L.rp.next; q=L.rp.next; if(p!=i) L.rpL.ri; L.ri.next=p; p=q; /for /SLInsert_Sort 2. 【严题集10.30】按下述原则编写快排的非递归算法:(1) 一趟排序之后,先对长度较短的子序列进

20、行排序,且将另一子序列的上、下界入栈保存;(2) 若待排记录数3,则不再进行分割,而是直接进行比较排序。10.30 typedef struct int low; int high; boundary; /子序列的上下界类型 void QSort_NotRecurve(int SQList &L)/快速排序的非递归算法 low=1;high=L.length; InitStack(S); /S的元素为boundary类型 while(low2) /如果当前子序列长度大于3且尚未排好序 pivot=Partition(L,low,high); /进行一趟划分 if(high-pivotpivot

21、-low) Push(S,pivot+1,high); /把长的子序列边界入栈 high=pivot-1; /短的子序列留待下次排序 else Push(S,low,pivot-1); low=pivot+1; /if else if(lowhigh&high-low3)/如果当前子序列长度小于3且尚未排好序 Easy_Sort(L,low,high); /直接进行比较排序 low=high; /当前子序列标志为已排好序 else /如果当前子序列已排好序但栈中还有未排序的子序列 Pop(S,a); /从栈中取出一个子序列 low=a.low; high=a.high; /while /QSo

22、rt_NotRecurve int Partition(SQList &L,int low,int high)/一趟划分的算法,与书上相同 L.r0=L.rlow; pivotkey=L.rlow.key; while(lowhigh) while(low=pivotkey) high-; L.rlow=L.rhigh; while(lowhigh&L.rlow.keyL.rhigh.key) L.rlowL.rhigh; else /子序列含有三个元素 if(L.rlow.keyL.rlow+1.key) L.rlowL.rlow+1; if(L.rlow+1.keyL.rhigh.key)

23、 L.rlow+1L.rhigh; if(L.rlow.keyL.rlow+1.key) L.rlowL.rlow+1; /Easy_Sort 3. 【严题集10.41】假设有1000个关键字为小于10000的整数的记录序列,请设计一种排序方法,要求以尽可能少的比较次数和移动次数实现排序,并按你的设计编出算法。解:可以用基数排序来实现,关键字位数d=4,数基radix=10(从09)则基数排序的算法如下;void Hash_Sort(int a )/对1000个关键字为四位整数的记录进行排序 int b10000; for(i=0;i1000;i+) /直接按关键字散列 (即分配) for(j

24、=ai;bj;j=(j+1)%10000); bj=ai; for(i=0,j=0;i1000;j+) /将散列收回a中 if(bj) for(x=bj,k=j;bk;k=(k+1)%10000) if(bk=x) ai+=x; bk=0; /if /Hash_Sort 4. 【严题集10.42】序列的“中值记录”指的是:如果将此序列排序后,它是第n/2个记录。试写一个求中值记录的算法。10.42 typedef struct int gt; /大于该记录的个数 int lt; /小于该记录的个数 place; /整个序列中比某个关键字大或小的记录个数 int Get_Mid(int a ,int n) /求一个序列的中值记录的位置 place bMAXSIZE; for(i=0;in;i+) /对每一个元素统计比它大和比它小的元素个数gt和lt for(j=0;jai) bi.gt+; else if(ajai) bi.lt+; mid=0; min_dif=abs(b0.gt-b0.lt); for(i=0;in;i+) /找出gt值与lt值最接近的元素,即为中值记录 if(abs(bi.gt-bi.lt)min_dif) mid=i;

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

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