数据结构(C语言)第10章排序自测题

合集下载

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

中南大学数据结构与算法第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)快速排序:(方括号表示无序区,层表示对应的递归树的层数)初始态:[265 301 751 129 937 863 742 694 076 438]第二层:[076 129] 265 [751 937 863 742 694 301 438] 第三层:076 [129] 265 [438 301 694 742] 751 [863 937] 第四层:076 129 265 [301] 438 [694 742] 751 863 [937] 第五层:076 129 265 301 438 694 [742] 751 863 937第六层:076 129 265 301 438 694 742 751 863 937 (5)直接选择排序:(方括号为无序区)初始态[265 301 751 129 937 863 742 694 076 438]第一趟:076 [301 751 129 937 863 742 694 265 438]第二趟:076 129 [751 301 937 863 742 694 265 438]第三趟:076 129 265[ 301 937 863 742 694 751 438]第四趟:076 129 265 301 [937 863 742 694 751 438]第五趟:076 129 265 301 438 [863 742 694 751 937]第六趟:076 129 265 301 438 694 [742 751 863 937]第七趟:076 129 265 301 438 694 742 [751 863 937]第八趟:076 129 265 301 438 694 742 751 [937 863]第九趟:076 129 265 301 438 694 742 751 863 937(6)堆排序:(通过画二叉树可以一步步得出排序结果)初始态[265 301 751 129 937 863 742 694 076 438]建立初始堆:[937 694 863 265 438 751 742 129 075 301]第一次排序重建堆:[863 694 751 765 438 301 742 129 075] 937第二次排序重建堆:[751 694 742 265 438 301 075 129] 863 937第三次排序重建堆:[742 694 301 265 438 129 075] 751 863 937第四次排序重建堆:[694 438 301 265 075 129] 742 751 863 937第五次排序重建堆:[438 265 301 129 075] 694 742 751 863 937第六次排序重建堆:[301 265 075 129] 438 694 742 751 863 937第七次排序重建堆:[265 129 075] 301 438 694 742 751 863 937第八次排序重建堆:[129 075]265 301 438 694 742 751 863 937第九次排序重建堆:075 129 265 301 438 694 742 751 863 937(7)归并排序(为了表示方便,采用自底向上的归并,方括号为有序区)初始态:[265] [301] [751] [129] [937] [863] [742] [694] [076] [438]第一趟:[265 301] [129 751] [863 937] [694 742] [076 438]第二趟:[129 265 301 751] [694 742 863 937] [076 438]第三趟:[129 265 301 694 742 751 863 937] [076 438]第四趟:[076 129 265 301 438 694 742 751 863 937](8)基数排序(方括号内表示一个箱子共有10个箱子,箱号从0到9)初始态:265 301 751 129 937 863 742 694 076 438第一趟:[] [301 751] [742] [863] [694] [265] [076] [937] [438] [129]第二趟:[301] [] [129] [937 438] [742] [751] [863 265] [076] [] [694]第三趟:[075] [129] [265] [301] [438] [] [694] [742 751] [863] [937]在上面的排序方法中,直接插入排序、冒泡排序、归并排序和基数排序是稳定的,其他排序算法均是不稳定的,现举实例如下:以带*号的表示区别。

数据结构答案 第10章 排序学习与指导

数据结构答案 第10章 排序学习与指导

第10章排序10.1 知识点分析1.排序基本概念:(1)排序将数据元素的任意序列,重新排列成一个按关键字有序(递增或递减)的序列的过程称为排序。

(2)排序方法的稳定和不稳定若对任意的数据元素序列,使用某个排序方法,对它按关键字进行排序,若对原先具有相同键值元素间的位置关系,排序前与排序后保持一致,称此排序方法是稳定的;反之,则称为不稳定的。

(3)内排序整个排序过程都在内存进行的排序称为内排序,本书仅讨论内排序。

(4)外排序待排序的数据元素量大,以致内存一次不能容纳全部记录,在排序过程中需要对外存进行访问的排序称为外排序。

2.直接插入排序直接插入排序法是将一个记录插到已排序好的有序表中,从而得到一个新的,记录数增1的有序表。

3.二分插入排序二分插入排序法是用二分查找法在有序表中找到正确的插入位置,然后移动记录,空出插入位置,再进行插入的排序方法。

4.希尔排序希尔排序的基本思想是:先选取一个小于n的整数d1作为第一个增量,把待排序的数据分成d1个组,所有距离为d1的倍数的记录放在同一个组内,在各组内进行直接插入排序,每一趟排序会使数据更接近于有序。

然后,取第二个增量d2,d2< d1,重复进行上述分组和排序,直至所取的增量d i=1(其中d i< d i-1 < ……< d2< d1),即所有记录在同一组进行直接插入排序后为止。

5.冒泡排序冒泡法是指每相邻两个记录关键字比大小,大的记录往下沉(也可以小的往上浮)。

每一遍把最后一个下沉的位置记下,下一遍只需检查比较到此为止;到所有记录都不发生下沉时,整个过程结束。

6.快速排序快速排序法是通过一趟排序,将待排序的记录组分割成独立的两部分,其中前一部分记录的关键字均比枢轴记录的关键字小;后一部分记录的关键字均比枢轴记录的关键字大,枢轴记录得到了它在整个序列中的最终位置并被存放好。

第二趟再分别对分割成两部分子序列,再进行快速排序,这两部分子序列中的枢轴记录也得到了最终在序列中的位置而被存放好,并且它们又分别分割出独立的两个子序列……。

【免费下载】数据结构第10章排序练习及答案

【免费下载】数据结构第10章排序练习及答案
9.一组记录的关键字为{45,80,55,40,42,85},则利用堆排序的方法建立的初始堆为 ( ) A)80,45,50,40,42,85 B)85,80,55,40,42, 45 C)85,80,55,45,42,40 D)85,55,80,42,45,40 【答案】B 10.一组记录的关键字为{25,50,15,35,80,85,20,40,36,70},其中含有 5 个长 度为 2 的有序表,用归并排序方法对该序列进行一趟归并后的结果为( ) A)15,25,35,50,20,40,80,85,36,70 B)15,25,35,50,80,20,85,40,70,36 C)15,25,50,35,80,85,20,36,40,70 D)15,25,35,50,80,20,36,40,70,85 【答案】A 【解析】对 5 个长度为 2 的有序表一趟归并后得到前两个长度为 4 的有序表和最后一个长 度为 2 的有序表,故选 A。 11.n 个元素进行冒泡排序的过程中,最好情况下的时间复杂度为( ) A)O(1) B)O(log2n) C)O(n2) D)O(n) 【答案】D 【解析】最好情况下至少需要一趟排序,即比较 n-1 次,故选 D。
9.1 选择题 1.从末排序的序列中依次取出一个元素与已排序序列中的元素依次进行比较,然后将其放 在排序序列的合适位置,该排序方法称为( )排序法。 A)插入 B)选择 C)希尔 D)二路归并 【答案】A 2.下面各种排序方法中,最好情况下时间复杂度为 O(n)的是( ) A)快速排序 B)直接插入排序 C)堆排序 D)归并排序 【答案】B 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 84 15 20 21 25 27 35 47 68 84 则所采用的排序方法是( ) A)选择排序 B)希尔排序 C)归并排序 D)快速排序 【答案】D 4.下面给出的四种排序法中,( )排序是不稳定排序法。 A)插入 B)冒泡 C)二路归并 D)堆 【答案】D 5.快速排序方法在( )情况下最不利于发挥其长处。 A)要排序的数据量太大 B)要排序的数据中含有多个相同值 C)要排序的数据已基本有序 D)要排序的数据个数为奇数 【答案】C 6.一组记录的关键码为(46,79,56,38,40,84),则利用快速排序的方法,以第一个记录为基 准得到的一次划分结果为( ) 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 【答案】C 7.对记录的关键码{50,26,38,80,70,90,8,30,40,20}进行排序,各趟排序结束 时的结果为: 50,26,38,80,70,90 ,8,30,40,20 50,8,30,40,20,90,26,38,80,70 26,8,30,40,20,80,50,38,90,70 8,20,26,30,38,40,50,70,80,90 其使用的排序方法是( ) A)快速排序 B)基数排序 C)希尔排序 D)归并排序 【答案】C

数据结构第10章 习题答案

数据结构第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,20C.20,15,8,9,7,-1,4,7 D. 9,4,7,8,7,-1,15,203.下列排序算法中,在每一趟都能选出一个元素放到其最终位置上,并且其时间性能受数据初始特性影响的是:( 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. 3B. 10C. 15D. 258. 对序列{15,9,7,8,20,-1,4,} 用希尔排序方法排序,经一趟后序列变为{15,-l,4,8,20,9,7}则该次采用的增量是 ( B )A. lB. 4C. 3D. 29. 堆排序是( E )类排序A. 插入B. 交换C. 归并D. 基数E. 选择10.排序方法有许多种,(1)法从未排序的序列中依次取出元素,与已排序序列(初始时为空)中的元素作比较,将其放入已排序序列的正确位置上;(2)法从未排序的序列中挑选元素,并将其依次放入已排序序列(初始时为空)的一端;交换排序方法是对序列中的元素进行一系列比较,当被比较的两元素逆序时,进行交换;(3)和(4)是基于这类方法的两种排序方法,而(4)是比(3)效率更高的方法;(5)法是基于选择排序的一种排序方法,是完全二叉树结构的一个重要应用。

第10章自测题

第10章自测题

第十章自测题一、填空题1.三相异步电动机的力能指标是指,起动性能指标是指。

2.三相异步电动机的过载能力是指,它反映了电动机能力。

3.异步电动机采用Y-D降压起动时,起动电流为直接起动时的倍,起动转矩为直接起动时的倍。

4.异步电动机采用变比为2的自耦变压器降压起动时,起动电流为直接起动时的倍,起动转矩为直接起动时的倍。

5.绕线式异步电动机采用转子串联电阻起动,可以使起动电流__ _,起动转矩。

6.异步电动机的变极调速,就是改接定子绕组接法,使每相绕组的一半线圈中的电流,为了保证变极调速前后电动机的转向不变,应当。

7.异步电动机串级调速时,在转子回路中串入一个附加电动势,该电动势的频率与相同,该电动势的相位与转子电动势相位。

8.异步电动机拖动恒转矩负载进行变频调速时,为了保证不变,则U1应随f1按规律调节。

9.电力变压器在运行时效率较高,而异步电动机在运行时效率较高。

10.如果电源电压不对称,异步电动机气隙中不仅有正转旋转磁场,还有磁场,该磁场和转子电流作用产生的电磁转矩,对转子起作用。

二、选择题1.一台三相笼型异步电动机的k T =,k I=6,定子绕组为三角形联结。

若供电变压器允许电动机的起动电流不超过12I N,当拖动额定负载转矩起动时,则首选的起动方法是( )。

①直接起动;② Y-D降压起动;③自耦变压器降压起动;④以上三种方法均可以。

2.异步电动机的机械负载愈重,其起动电流()。

①愈大;②愈小;③与负载轻重无关;④是额定电流的7倍。

3.一台三相异步电动机接到电压下降了10%的电源上,拖动额定转矩负载稳定运行,则这台电动机的电磁转矩为( )。

①T em=T N;②T em= ;③T em= ;④T em=。

4.异步电动机进行降压起动的目的是()。

①减小起动电流;②减小起动转矩;③减小起动时的铁耗;④使起动过程平稳。

5.定子绕组为Y联结的绕线式异步电动机,不能采用的起动方法是()。

①直接起动;② Y-D降压起动;③自耦变压器降压起动;④转子串电阻起动。

数据结构第10章排序练习及答案

数据结构第10章排序练习及答案

9.1选择题1.从末排序的序列中依次取出一个元素与已排序序列中的元素依次进行比较,然后将其放在排序序列的合适位置,该排序方法称为()排序法。

A)插入B)选择C)希尔D)二路归并【答案】A2.下面各种排序方法中,最好情况下时间复杂度为O(n)的是()A)快速排序B)直接插入排序C)堆排序D)归并排序【答案】B3.用某种排序方法对线性表(25,84,21,47,15,27,68,35,20)进行排序时,无序序列的变化情况如下:25 84 21 47 15 27 68 35 2020 15 21 25 47 27 68 35 8415 20 21 25 35 27 47 68 8415 20 21 25 27 35 47 68 84则所采用的排序方法是()A)选择排序B)希尔排序C)归并排序D)快速排序【答案】D4.下面给出的四种排序法中,()排序是不稳定排序法。

A)插入B)冒泡C)二路归并D)堆【答案】D5.快速排序方法在()情况下最不利于发挥其长处。

A)要排序的数据量太大B)要排序的数据中含有多个相同值C)要排序的数据已基本有序D)要排序的数据个数为奇数【答案】C6.一组记录的关键码为(46,79,56,38,40,84),则利用快速排序的方法,以第一个记录为基准得到的一次划分结果为()A)38,40,46,56,79,84B)40,38,46,79,56,84C)40,38,46,56,79,84D)40,38,46,84,56,79【答案】C7.对记录的关键码{50,26,38,80,70,90,8,30,40,20}进行排序,各趟排序结束时的结果为:50,26,38,80,70,90 ,8,30,40,2050,8,30,40,20,90,26,38,80,7026,8,30,40,20,80,50,38,90,708,20,26,30,38,40,50,70,80,90其使用的排序方法是()A)快速排序B)基数排序C)希尔排序D)归并排序【答案】C8.以下序列不是堆的是()A)100,85,98,77,80,60,82,40,20,10,66B)100,98,85,82,80,77,66,60,40,20,10C)10,20,40,60,66,77,80,82,85,98,100D)100,85,40,77,80,60,66,98,82,10,20【答案】D【解析】根据堆采用完全二叉树的顺序存储形式及堆的特点,因第一个结点即根结点关键字值最大,则应建立一个大根堆,但依据此数据序列建立起堆后关键字值为40的左右孩子结点分别为60、66,不符合大根堆特点。

数据结构与算法复习题10(C语言版)

数据结构与算法复习题10(C语言版)

习10解答判断题:1.排序的功能是将一个数据元素(或记录)的任意序列,重新排成一个按关键字有序的序列。

( )答:TRUE2.直接插入排序的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表。

( )答:TRUE3.使用简单选择排序方法无论记录的初始排列如何,所需进行的关键字间的比较次数相同。

( )答:TRUE4.用希尔(Shell)方法排序时,若关键字的初始排序杂乱无序,则排序效率就低。

()答:FALSE(希尔排序又称“缩小增量排序”,即每趟只对相同增量距离的关键字进行比较,这与关键字序列初始有序或无序无关)单选题:5.在对n个元素进行简单选择排序过程中,第i趟需从( )个元素中选择出最小值元素。

A.n-i+1 B. n-i C.i D. i+1答:A6. n个记录直接插入排序所需的记录最小比较次数是 ( )A. n-1B. 2(n-1)C. (n+2)(n-1)/2D. n答:A(注:如果初始记录序列就是一个符合要求的有序序列,则每趟操作只做一次比较,n-1趟操作仅需n-1次比较。

参见严蔚敏《(c语言版)数据结构》P.265) 7.若用起泡排序对关键字序列{18,16,14,12,10,8}进行从小到大的排序,所需进行的关键字比较总次数是()A.10 B. 15 C. 21 D. 34答:B (注:参见严蔚敏《(c语言版)数据结构》P.274, 此题所给的初始序列为“逆序”,需要进行n(n-1)/2 = 6×(6-1)/2 = 15次比较。

)8. 用起泡法对n个关键码排序,在最好情况下,只需做次比较;在最坏的情况下要做次比较。

答:n-1, n(n-1)/2 (注:参见严蔚敏《(c语言版)数据结构》P.273~274)9.在所有排序方法中,关键字比较次数与记录的初始排列无关的是( )。

A.希尔排序 B. 起泡排序 C. 插入排序 D.选择排序答:D10. 一组记录的关键字为(45,80,55,40,42,85),则利用堆排序的方法建立的初始堆为( )。

数据结构第10章习题

数据结构第10章习题

三、填空题
1. 设用希尔排序对数组{98,36,-9,0,47,23, 1,8,10,7}进行排序,给出的步长(也称增量 序列)依次是4,2,1则排序需__________趟, 写出第一趟结束后,数组中数据的排列次序 __________。 【南京理工大学 1997 三、5 (2分)】 2.若不考虑基数排序,则在排序过程中,主要进行 的两种基本操作是关键字的______和记录的 _____。 【北京邮电大学 2001 二、7 (4分)】 3.分别采用堆排序,快速排序,冒泡排序和归并排 序,对初态为有序的表,则最省时间的是_____ 算法,最费时间的是______算法。【福州大学 1998 二、10 (2分)】
பைடு நூலகம்
12.就排序算法所用的辅助空间而言,堆排序,快 速排序,归并排序的关系是( a ) A.堆排序〈 快速排序〈归并排序 B.堆排序 〈 归并排序〈 快速排序 C.堆排序〉 归并排序 〉快速排序 D.堆排 序 > 快速排序 > 归并排序 E.以上答案都不 对 【西安交通大学 1996 三、1 (3分)】 13.将两个各有N个元素的有序表归并成一个有序表, 其最少的比较次数是( a ) A.N B.2N-1 C.2N D.N-1
2.比较次数与排序的初始状态无关的排序方法是 ( d )。【北方交通大学 2000 二、2(2分)】
A.直接插入排序 D.简单选择排序 B.起泡排序 C.快速排序
3.数据序列(8,9,10,4,5,6,20,1,2)只能是 下列排序算法中的( c )的两趟排序后的结果。 【合肥工业大学 1999 一、3 (2分)】 A.选择排序 B.冒泡排序 C.插入排序 D.堆排序 4.数据序列(2,1,4,9,8,10,6,20)只能是下 列排序算法中的( a )的两趟排序后的结果。 A. 快速排序 B. 冒泡排序 C. 选择排序 D. 插入排序 5.对序列{15,9,7,8,20,-1,4}进行排序,进行 一趟后数据的排列变为{4,9,-1,8,20,7,15}; 则采用的是( c )排序。【南京理工大学 1998 一、8(2分)】 A. 选择 B. 快速 C. 希尔 D. 冒泡

数据结构Ch10习题答案

数据结构Ch10习题答案

第十章内部排序一、择题1.用直接插入排序法对下面四个表进行(由小到大)排序,比较次数最少的是(B)。

A.(94,32,40,90,80,46,21,69)插32,比2次插40,比2次插90,比2次插80,比3次插46,比4次插21,比7次插69,比4次B.(21,32,46,40,80,69,90,94)插32,比1次插46,比1次插40,比2次插80,比1次插69,比2次插90,比1次插94,比1次C.(32,40,21,46,69,94,90,80)插40,比1次插21,比3次插46,比1次插69,比1次插94,比1次插90,比2次插80,比3次D.(90,69,80,46,21,32,94,40)插69,比2次插80,比2次插46,比4次插21,比5次插32,比5次插94,比1次插40,比6次2.下列排序方法中,哪一个是稳定的排序方法(BD)。

A.希尔排序B.直接选择排序C.堆排序D.冒泡排序下列3题基于如下代码:for(i=2;i<=n;i++){ x=A[i];j=i-1;while(j>0&&A[j]>x){ A[j+1]=A[j];j--;}A[j+1]=x3.这一段代码所描述的排序方法称作(A)。

A.插入排序B.冒泡排序C.选择排序D.快速排序4.这一段代码所描述的排序方法的平均执行时间为(D)A.O(log2n) B.O(n) C.O(nlog2n) D.O(n2)5.假设这段代码开始执行时,数组A中的元素已经按值的递增次序排好了序,则这段代码的执行时间为(B)。

A.O(log2n) B.O(n) C.O(nlog2n) D.O(n2)6.在快速排序过程中,每次被划分的表(或了表)分成左、右两个子表,考虑这两个子表,下列结论一定正确是(B)。

A.左、右两个子表都已各自排好序B.左边子表中的元素都不大于右边子表中的元素C.左边子表的长度小于右边子表的长度D.左、右两个子表中元素的平均值相等7.对n个记录进行堆排序,最坏情况下的执行时间为(C)。

数据结构课后习题第十章

数据结构课后习题第十章

1.在下列排序算法中,稳定的事(),平均速度最快的是(),所需辅助存储空间最多的是()。

A.希尔排序B.快速排序C.堆排序D.归并排序2.若要在O(n)数量级的时间内完成对数组的排序,且要求排序是稳定的,则可选择的排序方式应该是()。

A.快速排序B.堆排序C.归并排序D.希尔排序3.在下列排序算法中,()算法的时间复杂度与初始排序无关。

A.直接插入排序B.起泡排序C.快速排序D.直接选择排序4.一组记录关键字序列是(46,79,56,38,40,84),则用堆排序方法建立的初始大根堆是()。

A.79,46,56,38,40,84B.84,79,56,38,40,46C.84,79,56,46,40,38D.94,56,79,40,46,385.一组记录的关键字序列是(46,79,56,38,40,84),则用快速排序方法,以第一个关键字为支点,得到的第一次划分结果是()。

A.38,40,46,56,79,84B.40,38,46,79,56,84C.40,38,46,56,79,84D.40,38,46,84,56,796.一组记录的关键字序列是(25,48,16,35,79,82,26,40,36,72),用二路归并排序方法进行排序,则第二趟归并的结果是()。

A.16,25,35,48,23,40,79,82,36,72B.16,25,35,48,79,82,23,36,40,72C.16,25,35,46,23,36,40,79,82,72D.16,25,35,48,79,23,36,40,72,827.在以下排序方法中,关键字比较的次数与记录的初始排列次序有关的是()A.归并排序B.堆排序C.插入排序D.选择排序8.下列排序算法中,()算法可能会出现下面情况:初始数据有序时,花费的时间反而最多。

A.堆排序B.冒泡排序C.希尔排序D.快速排序9.数据序列(8,9,10,4,5,6,20,1,2)只能是下列排序算法中的()的两趟排序后的结果。

《数据结构》期末考试复习题 第10章 排序

《数据结构》期末考试复习题 第10章 排序
已知待排序的n个元素可分为nk个组每个组包含k个元素且任一组内的各元素均分别大亍前一组内的所有元素和小亍后一组内的所有元素若采用基亍比较的排序其时间下界应为oklog2k中国科技大学1998类似本题的另外叙述有
第 10 章
排序
一、选择题 1.某内排序方法的稳定性是指( )。 【南京理工大学 1997 一、10(2 分) 】 A. 该排序算法不允许有相同的关键字记录 B. 该排序算法允许有相同的关键字 记录 C.平均时间为 0(n log n)的排序方法 D.以上都不对 2. 下面给出的四种排序法中( )排序法是不稳定性排序法。 【北京航空航天大学 1999 一、 10 (2 分) 】 A. 插入 B. 冒泡 C. 二路归并 D. 堆积 3.下列排序算法中,其中( )是稳定的。 【福州大学 1998 一、3 (2 分)】 A. 堆排序,冒泡排序 B. 快速排序,堆排序 C. 直接选择排序,归并排序 D. 归并排序,冒泡排序 4.稳定的排序方法是( ) 【北方交通大学 2000 二、3(2 分) 】 A.直接插入排序和快速排序 B.折半插入排序和起泡排序 C.简单选择排序和四路归并排序 D.树形选择排序和 shell 排序 5.下列排序方法中,哪一个是稳定的排序方法?( ) 【北方交通大学 2001 一、8 (2 分) 】 A.直接选择排序 B.二分法插入排序 C.希尔排序 D.快速排序 6.若要求尽可能快地对序列进行稳定的排序,则应选(A.快速排序 B.归并排序 C.冒 泡排序) 。 【北京邮电大学 2001 一、5(2 分) 】 7.如果待排序序列中两个数据元素具有相同的值,在排序前后它们的相互位置发生颠倒, 则称该排序算法是不稳定的。 ( )就是不稳定的排序方法。 【清华大学 1998 一、3 (2 分) 】 A.起泡排序 B.归并排序 C.Shell 排序 D.直接插入排序 E.简单选 择排序 8.若要求排序是稳定的,且关键字为实数,则在下列排序方法中应选( )排序为宜。 A.直接插入 B.直接选择 C.堆 D.快速 E.基数 【中科院计算所 2000 一、 5(2 分) 】 9.若需在 O(nlog2n)的时间内完成对数组的排序,且要求排序是稳定的,则可选择的排序方 法是( ) 。 A. 快速排序 B. 堆排序 C. 归并排序 D. 直接插入排序 【中国科技大学 1998 二、4(2 分) 】 【中科院计算所 1998 二、4(2 分) 】 10.下面的排序算法中,不稳定的是( ) 【北京工业大学 1999 一、2 (2 分)】 A.起泡排序 B.折半插入排序 C.简单选择排序 D.希尔排序 E.基数排序 F.堆 排序。 11.下列内部排序算法中: 【北京工业大学 2000 一、1 (10 分 每问 2 分)】 A.快速排序 B.直接插入排序 C. 二路归并排序 D. 简单选择排序 E. 起泡排序 F. 堆排序 (1) 其比较次数与序列初态无关的算法是( ) (2)不稳定的排序算法是( ) (3)在初始序列已基本有序(除去 n 个元素中的某 k 个元素后即呈有序,k<<n)的情况下, 排序效率最高的算法是( ) (4)排序的平均时间复杂度为 O(n•logn)的算法是( )为 O(n•n)的算法是( )

第10章排序自测题答案

第10章排序自测题答案

第10章排序自测卷一、填空题(每空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个不同的数据进行排序,至多需要比较次。

数据结构ch10习题

数据结构ch10习题

数据结构ch10一、单项选择(10分)1、在文件“局部有序”或文件长度较小的情况下,最佳的排序方法是______。

A 简单选择B 直接插入C 冒泡D 快速2、对关键字{14,5,19,20,11,19}进行非递减排序,第一趟的排序结果为{14,5,19,20,11,19},则采用的排序方法是______。

A 简单选择B 直接插入C 希尔排序D 归并排序3、快速排序在______情况下,最不利于发挥其长处。

A.要排序的数据量太大B.要排序的数据中含有多个相同值C.要排序的数据已经基本有序D.要排序的数据个数为奇数4、设有关键码初始序列{Q,H,C,Y,P,A,M,S,R,D,F,X}, 新序列{F,H,C,D,P,A,M,Q,R,S,Y,X} 是采用下列那种排序方法对初始序列进行第一趟扫描的结果? ( ) (2004年)A 直接插入排序B 二路归并排序C 以第一元素为分界元素的快速排序D 基数排序5、排序的比较次数与序列的初始状态无关的是______。

(2006年)A 简单选择B 直接插入C 冒泡D 快速二、填空(10分)1、在对n个元素进行直接插入排序时,最好情况下的比较次数为______ ,记录移动次数为______ ,时间复杂度为______ 。

2、在对n个元素进行冒泡插入排序时,最好情况下的比较次数为______ ,记录移动次数为______ ,时间复杂度为______ 。

3、在对n个元素进行快速排序时,平均情况下的时间复杂度为______ ,最坏情况下的时间复杂度为______ 。

一、判断题(5分)二、综合应用(3×5=15)1、(2005年12分)若待排序记录的关键字集合是{30 , 4 , 48 , 25 , 95, 13, 90 , 27 , 18 },采用快速排序法排成由小到大的序列。

(1)写出第1趟的排序过程。

(2)写出第2趟的排序结果。

2、写出下列序列(16,9,4,25,15,2,13,18,17,5)按2路归并排序的结果和步骤.( 2004年5分)三、算法(10分)(可以结合第2章顺序表出题)1、顺序表A用一个整型数组表示,表未满并且元素已经进行非递减排序,插入一个元素x并保证表的有序。

《C语言数据结构》第1至9章自测题答案大全

《C语言数据结构》第1至9章自测题答案大全

积少成多,争取每天进步一点。

第一章概论自测题答案姓名班级题号一二三四五六总分题分3315982015100得分一、填空题(每空1分共33分)1. 一个计算机系统包括硬件系统和软件系统两大部分2. 一台计算机中全部程序的集合称为这台计算机的软件资源 /(系统)3. 计算机软件可以分为系统软件和应用软件两大类科学计算程序包属于应用软件诊断程序属于系统软件(工具)4. 一种用助忆符号来表示机器指令的操作符和操作数的语言是汇编语言5. 数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和运算等的学科6. 数据结构被形式地定义为(DR)其中D是数据元素的有限集合R是D上的关系有限集合7. 数据结构包括数据的逻辑结构、数据的存储结构和数据的运算这三个方面的内容8. 数据结构按逻辑结构可分为两大类它们分别是线性结构和非线性结构9. 线性结构中元素之间存在一对一关系树形结构中元素之间存在一对多关系图形结构中元素之间存在多对多关系10.在线性结构中第一个结点没有前驱结点其余每个结点有且只有 1个前驱结点;最后一个结点没有后续结点其余每个结点有且只有1个后续结点11. 在树形结构中树根结点没有前驱结点其余每个结点有且只有 1 个前驱结点;叶子结点没有后续结点其余每个结点的后续结点数可以任意多个12. 在图形结构中每个结点的前驱结点数和后续结点数可以任意多个13.数据的存储结构可用四种基本的存储方法表示它们分别是顺序、链式、索引和散列14. 数据的运算最常用的有5种它们分别是插入、删除、修改、查找、排序15. 一个算法的效率可分为时间效率和空间效率16. 〖00年省统考〗任何一个C程序都由一个主函数和若干个被调用的其它函数组成17. 【00年省统考题】变量一经说明就确定该变量的取值范围(即存储单元)及确定变量所允许的运算二、单项选择题(每小题1分共15分)( B ) 1. 通常所说的主机是指∶A) CPU B) CPU和内存C) CPU、内存与外存D) CPU、内存与硬盘( C )2. 在计算机内部一切信息的存取、处理和传送的形式是∶A) ACSII码 B) BCD码C)二进制D)十六进制( D )3. 软件与程序的区别是∶A) 程序价格便宜、软件价格昂贵;B) 程序是用户自己编写的而软件是由厂家提供的;C) 程序是用高级语言编写的而软件是由机器语言编写的;D) 软件是程序以及开发、使用和维护所需要的所有文档的总称而程序只是软件的一部分( C )4. 所谓"裸机"是指∶A) 单片机B)单板机C) 不装备任何软件的计算机D) 只装备操作系统的计算机( D )5. 应用软件是指∶A)所有能够使用的软件 B) 能被各应用单位共同使用的某种软件 C)所有微机上都应使用的基本软件 D) 专门为某一应用目的而编制的软件(*A )6. 〖00年省统考〗C语言中的常量可分为整型常量、实型常量、字符型常量及 (枚(A)符号常量(B)长整型常量(C)逻辑常量(D)二进制整数(*C )7. 编译程序的功能是∶A)发现源程序中的语法错误B)改正源程序中的语法错误C)将源程序编译成目标程序 D)将某一高级语言程序翻译成另一种高级语言程序( A )8. 系统软件中最重要的是∶A) 操作系统 B) 语言处理系统 C) 工具软件 D) 数据库管理系统( C )9. 可移植性最好的计算机语言是∶A) 机器语言B)汇编语言C) 高级语言D) 自然语言( B )10. 非线性结构是数据元素之间存在一种:A)一对多关系 B)多对多关系 C)多对一关系 D)一对一关系( C )11. 数据结构中与所使用的计算机无关的是数据的结构;A) 存储 B) 物理 C) 逻辑 D) 物理和存储( C )12. 算法分析的目的是:A) 找出数据结构的合理性 B) 研究算法中的输入和输出的关系C) 分析算法的效率以求改进 D) 分析算法的易懂性和文档性( A )13. 算法分析的两个主要方面是:A) 空间复杂性和时间复杂性 B) 正确性和简明性C) 可读性和文档性 D) 数据复杂性和程序复杂性( C )14. 计算机算法指的是:A) 计算方法 B) 排序方法 C) 解决问题的有限运算序列 D) 调度方法( B )15. 计算机算法必须具备输入、输出和等5个特性A) 可行性、可移植性和可扩充性 B) 可行性、确定性和有穷性C) 确定性、有穷性和稳定性 D) 易读性、稳定性和安全性三、简答题(每小题3分1.我们知道计算机只能执行机器指令为什么它能运行用汇编语言和高级语言编写的程序?答:靠汇编程序将汇编语言或高级语言翻译转换为目标程序(即机器语言)2.【严题集1.2②】数据结构和数据类型两个概念之间有区别吗?答:简单地说数据结构定义了一组按某些关系结合在一起的数组元素数据类型不仅定义了一组带结构的数据元素而且还在其上定义了一组操作3. 简述线性结构与非线性结构的不同点答:线性结构反映结点间的逻辑关系是一对一的非线性结构反映结点间的逻辑关系是多对多的四、〖00年统考题〗阅读下列C程序段写出相应的执行结果(每小题4分共8分)1. printf("Input x");scanf("%d"&x);if (x<=30)if(x>20) y=x;else if (x>10) y=2*x;if (x>0&&x<30)printf("x=%dy=%d"xy);else printf("输入数据错!");试写出当x分别为188时的执行结果答:运行结果为:x=18y=36x=8y=运行前的值且从x=30开始为数据错五、【严题集1.8④】分析下面各程序段的时间复杂度(每小题5分共20分)六、设有数据逻辑结构S=(DR)试按各小题所给条件画出这些逻辑结构的图示并确定相对于关系R哪些结点是开始结点哪些结点是终端结点?(每小题5分共15分)1. 【严蔚敏习题集P7 1.3②】D={d1d2d3d4} R={(d1d2)(d2d3)(d3d4) }答: d1→d2→d3→d4 d1-无直接前驱是首结点 d4-无直接后继是尾结点2. D={d1d2...d9}R={(d1d2)(d1d3)(d3d4)(d3d6)(d6d8)(d4d5)(d6d7)(d8d9) }答:此图为树形结构 d1-无直接前驱是根结点 d2d5d7d9-无直接后继是叶子结点3. D={d1d2...d9}R={(d1d3)(d1d8)(d2d3)(d2d4)(d2d5)(d3d9)(d5d6)(d8d9)(d9d7)(d4d7)(d4d6)}答:此图为图形结构 d1d2-无直接前驱是开始结点 d6d7-无直接后继是终端结点(2) (3) 第2章自测卷答案姓名班级题号一二三四五六七总分题分1310101071040100得分一、填空(每空1分共13分)1. 【严题集2.2①】在顺序表中插入或删除一个元素需要平均移动表中一半元素具体移动的元素个数与表长和该元素在表中的位置有关2. 线性表中结点的集合是有限的结点间的关系是一对一的3. 向一个长度为n的向量的第i个元素(1≤i≤n+1)之前插入一个元素时需向后移动 n-i+1 个元素4. 向一个长度为n的向量中删除第i个元素(1≤i≤n)时需向前移动 n-i 个元素5. 在顺序表中访问任意一结点的时间复杂度均为 O(1)因此顺序表也称为随机存取的数据结构6. 【严题集2.2①】顺序表中逻辑上相邻的元素的物理位置必定相邻单链表中逻辑上相邻的元素的物理位置不一定相邻7. 【严题集2.2①】在单链表中除了首元结点外任一结点的存储位置由其直接前驱结点的链域的值指示8.在n个结点的单链表中要删除已知结点*p需找到它的前驱结点的地址其时间复杂度为O(n)二、判断正误(在正确的说法后面打勾反之打叉)(每小题1分共10分)(×)1. 链表的每个结点中都恰好包含一个指针答:错误链表中的结点可含多个指针域分别存放多个指针例如双向链表中的结点可以含有两个指针域分别存放指向其直接前趋和直接后继结点的指针(×)2. 链表的物理存储结构具有同链表一样的顺序错链表的存储结构特点是无序而链表的示意图有序(×)3. 链表的删除算法很简单因为当删除链中某个结点后计算机会自动地将后续的各个单元向前移动错链表的结点不会移动只是指针内容改变(×)4. 线性表的每个结点只能是一个简单类型而链表的每个结点可以是一个复杂类型错混淆了逻辑结构与物理结构链表也是线性表!且即使是顺序表也能存放记录型数据(×)5. 顺序表结构适宜于进行顺序存取而链表适宜于进行随机存取错正好说反了顺序表才适合随机存取链表恰恰适于"顺藤摸瓜"(×)6. 顺序存储方式的优点是存储密度大且插入、删除运算效率高错前一半正确但后一半说法错误那是链式存储的优点顺序存储方式插入、删除运算效率较低在表长为n的顺序表中插入和删除一个数据元素平均需移动表长一半个数的数据元素(×)7. 线性表在物理存储空间中也一定是连续的错线性表有两种存储方式顺序存储和链式存储后者不要求连续存放(×)8. 线性表在顺序存储时逻辑上相邻的元素未必在存储的物理位置次序上相邻错误线性表有两种存储方式在顺序存储时逻辑上相邻的元素在存储的物理位置次序上也相邻(×)9. 顺序存储方式只能用于存储线性结构错误顺序存储方式不仅能用于存储线性结构还可以用来存放非线性结构例如完全二叉树是属于非线性结构但其最佳存储方式是顺序存储方式(后一节介绍)(×)10. 线性表的逻辑顺序与存储顺序总是一致的错理由同7链式存储就无需一致三、单项选择题(每小题1分共10分)( C )1.数据在计算机存储器内表示时物理地址与逻辑地址相同并且是连续的称之为:(A)存储结构(B)逻辑结构(C)顺序存储结构(D)链式存储结构( B )2.一个向量第一个元素的存储地址是100每个元素的长度为2则第5个元素的地址是(A)110 (B)108 (C)100 (D)120( A )3. 在n个结点的顺序表中算法的时间复杂度是O(1)的操作是:(A)访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n)(B)在第i个结点后插入一个新结点(1≤i≤n)(C)删除第i个结点(1≤i≤n)(D)将n个结点从小到大排序( B )4. 向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变平均要移动个元素(A)8 (B)63.5 (C)63 (D)7( A )5. 链接存储的存储结构所占存储空间:(A)分两部分一部分存放结点值另一部分存放表示结点间关系的指针(B)只有一部分存放结点值(C)只有一部分存储表示结点间关系的指针(D)分两部分一部分存放结点值另一部分存放结点所占单元数( B )6. 链表是一种采用存储结构存储的线性表;(A)顺序(B)链式(C)星式(D)网状( D )7. 线性表若采用链式存储结构时要求内存中可用存储单元的地址:(A)必须是连续的(B)部分地址必须是连续的(C)一定是不连续的(D)连续或不连续都可以( B )8.线性表L在情况下适用于使用链式结构实现(A)需经常修改L中的结点值(B)需不断对L进行删除插入(C)L中含有大量的结点(D)L中结点结构复杂( C )9.单链表的存储密度(A)大于1;(B)等于1;(C)小于1;(D)不能确定( B )10.设a1、a2、a3为3个结点整数P034代表地址则如下的链式存储结构称为P034P0-->a13-->a24-->A3(A)循环链表(B)单链表(C)双向循环链表(D)双向链表四、简答题(每小题5分共10分)1. 【严题集2.3②】试比较顺序存储结构和链式存储结构的优缺点在什么情况下用顺序表比链表好?答:①顺序存储时相邻数据元素的存放地址也相邻(逻辑与物理统一);要求内存中可用存储单元的地址必须是连续的优点:存储密度大(=1?)存储空间利用率高缺点:插入或删除元素时不方便②链式存储时相邻数据元素可随意存放但所占存储空间分两部分一部分存放结点值另一部分存放表示结点间关系的指针优点:插入或删除元素时很方便使用灵活缺点:存储密度小(<1)存储空间利用率低顺序表适宜于做查找这样的静态操作;链表宜于做插入、删除这样的动态操作若线性表的长度变化不大且其主要操作是查找则采用顺序表;若线性表的长度变化较大且其主要操作是插入、删除操作则采用链表2 .【严题集2.1①】描述以下三个概念的区别:头指针、头结点、首元结点(第一个元素结点)在单链表中设置头结点的作用是什么?答:首元结点是指链表中存储线性表中第一个数据元素a1的结点为了操作方便通常在链表的首元结点之前附设一个结点称为头结点该结点的数据域中不存储线性表的数据元素其作用是为了对链表进行操作时可以对空表、非空表的情况以及对首元结点进行统一处理头指针是指向链表中第一个结点(或为头结点或为首元结点)的指针若链表中附设头结点则不管线性表是否为空表头指针均不为空否则表示空表的链表的头指针为空这三个概念对单链表、双向链表和循环链表均适用是否设置头结点是不同的存储结构表示同一逻辑结构的问题头结点head-->datalink头指针首元结点简而言之头指针是指向链表中第一个结点(或为头结点或为首元结点)的指针;头结点是在链表的首元结点之前附设的一个结点;数据域内只放空表标志和表长等信息(内放头指针?那还得另配一个头指针!!!)首元素结点是指链表中存储线性表中第一个数据元素a1的结点五、【软考题】线性表具有两种存储方式即顺序方式和链接方式现有一个具有五个元素的线性表L={2317470531}若它以链接方式存储在下列100~119号地址空间中每个结点由数据(占2个字节)和指针(占2个字节)组成如下所示:05U17X23V31Y47Z^^100120其中指针XYZ的值分别为多少?该线性表的首结点起始地址为多少?末结点的起始地址为多少?(10分)答:X= 116 Y= 0 Z= 100 首址= 108 末址= 112六、阅读分析题(10分)【严题集2.10②】指出以下算法中的错误和低效(即费时)之处并将它改写为一个既正确又高效的算法答:错误有两处:①参数不合法的判别条件不完整例如表长为10若从第一位置(i=1)删除10个元素(k=10)要求合理但会被判为非法合法的入口参数条件为(0<i≤a.length)^ (0≤k≤a.length-i)应将if ( i<1 || k<0 || i+k> a.length ) return INFEASIBLE改为:if (!((0<i≤a.length)^ (o≤k≤a.length-i))) return INFEASIBLE 第二个FOR语句中元素前移的次序错误应将for ( j = a.length; j>=i+1; j--) a.elem[j-1] = a.elem[j];改为for (j>=i+1; j = a.length; j++) a.elem[j-1] = a.elem[j];七、编程题(每题10分共40分)1. 【徐士良题集2002年1月省统考题】写出在顺序存储结构下将线性表逆转的算法要求使用最少的附加空间解:输入:长度为n的线性表数组A(1:n)输出:逆转后的长度为n的线性表数组A(1:n)C语言描述如下(其中ET为数据元素的类型):2. 【严题集2.6②】已知L是无表头结点的单链表且P结点既不是首元结点也不是尾元结点请写出在P结点后插入S结点的核心语句序列答:此题答案不唯一但若从已给定序列中挑选则限制颇多(7) Q=P;(11) P=L;(8) while(P->next!=Q)P=P->next;(10) P=Q;(4) S->next=P->next;P->next=S;3. 编写程序将若干整数从键盘输入以单链表形式存储起来然后计算单链表中结点的个数(其中指针P指向该链表的第一个结点)注:统计结点个数是【省统考样题】的要求也是教材P60 4-6计算链表长度的要求编程又简单很容易作为考题解:编写C程序如下(已上机通过):全局变量及函数提前说明:---------------------------------#include<stdio.h>#include<stdlib.h>typedef struct liuyu{int data;struct liuyu*link;}test;liuyu *p*q*r*head;int m=sizeof(test);void main () /*第一步从键盘输入整数不断添加到链表*/{int i;head=(test*)malloc(m); /*m=sizeof(test);*/p=head; i=0;while (i!=-9999){ printf("/ninput an integer [stop by '-9999']:");scanf("%d"&i);p->data=i; /* input data is saved */p->link=(test*)malloc(m); /*m=sizeof(test));*/q=p;p=p->link;}q->link=NULL; /*原先用p->link=NULL似乎太晚!*/p=head; i=0; /*统计链表结点的个数并打印出来*/ while (p->link!=NULL){printf("%d"p->data);p=p->link;i++;}printf("\n node number=%d\n"i-1); /*结点的个数不包括-9999*/}0301陈建武:3.程序中统计结点数应是i个而不是i-1.假设链表表长为ni从0开始则在统计某一结点后 i 加一此时p已指向下一个结点第一结点统计结束i为1p指向第二结点即当p指向尾结点(第n个结点)时i的值为n-1while循环条件不符(指针域为null)退出循环即得统计的结点数为n-1.所以 i 的值就是结点数不必再减一4. 请编写26个字母按特定字母值插入或删除的完整程序可自行选用顺序存储或链表结构答:#include<stdio.h> /*全局变量及函数提前说明:*/ #include<stdlib.h>typedef struct liuyu{char data;struct liuyu*link;}test; liuyu *p*q*r*head;int L; /*元素的个数*/int m=sizeof(test);void build(); /* 主函数中会被调用的函数应当预先说明 */ void display();int insert_char(charchar); /*插入一个字母在第字母Y之前若无字母则加到末尾*/int delet_char(char); /* 删除元素X注意保存X的前趋元素指针! *//*---------------------------------------------------------*/void build() /*字母链表的生成*/{int i;head=(test*)malloc(m); /*m=sizeof(test);*/p=head;for(i=1;i<L;i++){ p->data=i+'a'-1; /* 'a'也可用其ASCII码97来表示 */ p->link=(test*)malloc(m); /*m=sizeof(test));*/p=p->link; }p->data=i+'a'-1;p->link=NULL;}/*---------------------------------------------------------*/void display() /*字母链表的输出*/{p=head;while (p->link!=NULL){ printf("%c"p->data);p=p->link; }printf("%c\n"p->data);}/*---------------------------------------------------------*/int insert_char(char Xchar Y) /*插入一个字母X在某个字母Y之前若找不到Y字母则加到末尾*/{p=head;r=(test*)malloc(m);r->data=X;if(head->data==Y){ head=r;r->link=p; }else{ while((p->data!=Y)&&(p->link!=NULL)) {q=p; p=p->link;} if(p->data==Y) { q->link=r; r->link=p; }else{p->link=r;r->link=NULL;}}L++;return(0);}/*---------------------------------------------------------*/ int delet_char(char X) /* 删除元素X注意保存X的前趋元素指针! */{ p=head;if(head->data==X){head=head->link;free(p);}else{ while((p->data!=X)&&(p->link!=NULL)){q=p;p=p->link;}if(p->data==X){ q->link=p->link;free(p); }else return(-1);}L--;return(0);}/*---------------------------------------------------------*/ void main(void) /*字母线性表的生成和输出*/{ L=26;build();display();printf("insert return value=%d\n"insert_char('L''W'));display();printf("delete return value=%d\n"delet_char('z'));display();}附:屏幕上显示的执行结果是:a b c d e f g h i j k l m n o p q r s t u v w x y zinsert return value=0a b c d 9 e f g h i j k l m n o p q r s t u v w x y z Ldelete return value=0a b c d e f g h i j k l m n o p q r s t u v w x y L0301陈建武修改意见:一. display()函数代码可优化为四行void display() /*字母链表的输出*/{p=head;while (p->link!=NULL)//改为while(p)因为当p指向尾结点时p不为null条件成立循环//printf()然后p被赋值为null此时循环条件不符退出正好.{ printf("%c"p->data);p=p->link; }printf("%c\n"p->data); //用while(p)此行可删}二.对int insert_char(char Xchar Y)若用带头结点的链表代码可减为10行我的程序如下(若参数没有slist p代码要多一行让q指向头指针)void InsertFind(slist pchar insertcharchar insertpos)//字母insertpos前插入字母insertchar{slist ppriornewnode; //newnode新结点pprior为插入位置结点的直接前驱newnode = new liuyu; //为新结点分配内存newnode->data = insertchar; //对结点数据域初始化while(p) //当p指向尾结点时最后一次循环 {pprior = p; //pprior从头指针开始指向p的直接前驱p = p->next; //p从首元结点开始不断前移直至最后p为nullif(p&&(p->data == insertpos)) //当p为null或者结点p的数据域为所要插入的字母break; //则退出循环}newnode->next = pprior->next; //在找到的位置前插入pprior->next = newnode;}对删除结点的操作若有头结点同样可以减少代码由此可见创建一个头结点对简化程序有很大的帮助.上面的观点仅供参考不对之处请指教!第3章栈和队列自测卷答案姓名班级题号一二三四五六总分题分151020202015100得分一、填空题(每空1分共15分)1. 【李春葆】向量、栈和队列都是线性结构可以在向量的任何位置插入和删除元素;对于栈只能在栈顶插入和删除元素;对于队列只能在队尾插入和队首删除元素2. 栈是一种特殊的线性表允许插入和删除运算的一端称为栈顶不允许插入和删除运算的一端称为栈底3. 队列是被限定为只能在表的一端进行插入运算在表的另一端进行删除运算的线性表4. 在一个循环队列中队首指针指向队首元素的前一个位置5. 在具有n个单元的循环队列中队满时共有 n-1 个元素6. 向栈中压入元素的操作是先移动栈顶指针后存入元素7. 从循环队列中删除一个元素时其操作是先移动队首指针后取出元素8. 〖00年统考题〗带表头结点的空循环双向链表的长度等于 0解:二、判断正误(判断下列概念的正确性并作出简要的说明)(每小题1分共10分)(×)1. 线性表的每个结点只能是一个简单类型而链表的每个结点可以是一个复杂类型错线性表是逻辑结构概念可以顺序存储或链式存储与元素数据类型无关(×)2. 在表结构中最常用的是线性表栈和队列不太常用错不一定吧?调用子程序或函数常用CPU中也用队列(√)3. 栈是一种对所有插入、删除操作限于在表的一端进行的线性表是一种后进先出型结构(√)4. 对于不同的使用者一个表结构既可以是栈也可以是队列也可以是线性表正确都是线性逻辑结构栈和队列其实是特殊的线性表对运算的定义略有不同而已(×)5. 栈和链表是两种不同的数据结构错栈是逻辑结构的概念是特殊殊线性表而链表是存储结构概念二者不是同类项(×)6. 栈和队列是一种非线性数据结构错他们都是线性逻辑结构栈和队列其实是特殊的线性表对运算的定义略有不同而已(√)7. 栈和队列的存储方式既可是顺序方式也可是链接方式(√)8. 两个栈共享一片连续内存空间时为提高内存利用率减少溢出机会应把两个栈的栈底分别设在这片内存空间的两端(×)9. 队是一种插入与删除操作分别在表的两端进行的线性表是一种先进后出型结构错后半句不对(×)10. 一个栈的输入序列是12345则栈的输出序列不可能是12345错有可能三、单项选择题(每小题1分共20分)( B )1. 〖00年元月统考题〗栈中元素的进出原则是A.先进先出B.后进先出C.栈空则进D.栈满则出( C )2. 〖李春葆〗若已知一个栈的入栈序列是123...n其输出序列为p1p2p3...pn若p1=n则pi为A.i B.n=i C.n-i+1 D.不确定解释:当p1=n即n是最先出栈的根据栈的原理n必定是最后入栈的那么输入顺序必定是123...n则出栈的序列是n...321( B )3. 〖李春葆〗判定一个栈ST(最多元素为m0)为空的条件是A.ST->top<>0 B.ST->top=0 C.ST->top<>m0 D.ST->top=m0( B )4. 〖李春葆〗判定一个队列QU(最多元素为m0)为满队列的条件是A.QU->rear - QU->front = = m0 B.QU->rear - QU->front -1= =m0C.QU->front = = QU->rear D.QU->front = = QU->rear+1( D )5.数组Q[n]用来表示一个循环队列f为当前队列头元素的前一位置r为队尾元素的位置假定队列中元素的个数小于n计算队列中元素的公式为(A)r-f; (B)(n+f-r)% n; (C)n+r-f; (D)(n+r-f)% n6. 【98初程P71】从供选择的答案中选出应填入下面叙述?内的最确切的解答把相应编号写在答卷的对应栏内设有4个数据元素a1、a2、a3和a4对他们分别进行栈操作或队操作在进栈或进队操作时按a1、a2、a3、a4次序每次进入一个元素假设栈或队的初始状态都是空现要进行的栈操作是进栈两次出栈一次再进栈两次出栈一次;这时第一次出栈得到的元素是 A第二次出栈得到的元素是 B 是;类似地考虑对这四个数据元素进行的队操作是进队两次出队一次再进队两次出队一次;这时第一次出队得到的元素是 C第二次出队得到的元素是 D最后在栈中或队中的元素还有 E 个供选择的答案:A~D:①a1 ②a2 ③ a3 ④a4E:①1 ②2 ③ 3 ④ 0答:ABCDE=241227. 【94初程P75】从供选择的答案中选出应填入下面叙述?内的最确切的解答把相应编号写在答卷的对应栏内栈是一种线性表它的特点是 A设用一维数组A[1...n]来表示一个栈A[n]为栈底用整型变量T指示当前栈顶位置A[T]为栈顶元素往栈中推入(PUSH)一个新元素时变量T的值 B ;从栈中弹出(POP)一个元素时变量T的值 C设栈空时有输入序列abc经过PUSHPOPPUSHPUSHPOP操作后从栈中弹出的元素的序列是 D变量T的值是 E供选择的答案:A:①先进先出②后进先出③进优于出④出优于进⑤随机进出BC:①加1 ②减1 ③不变④清0 ⑤加2 ⑥减2 D:① ac ③ca ④ba ⑤ cb ⑥ acE:① n+1 ②n+2 ③ n ④ n-1 ⑤ n-2答案:ABCDE=22164注意向地址的高端生长称为向上生成堆栈;向地址低端生长叫向下生成堆栈本题中底部为n向地址的低端递减生成称为向下生成堆栈8. 【91初程P77】从供选择的答案中选出应填入下面叙述?内的最确切的解答把相应编号写在答卷的对应栏内在做进栈运算时应先判别栈是否 A ;在做退栈运算时应先判别栈是否 B当栈中元素为n个做进栈运算时发生上溢则说明该栈的最大容量为 C为了增加内存空间的利用率和减少溢出的可能性由两个栈共享一片连续的内存空间时应将两栈的 D 分别设在这片内存空间的两端这样只有当 E 时才产生上溢供选择的答案:AB:①空②满③上溢④下溢C:①n-1 ② n ③ n+1 ④ n/2D:①长度②深度③栈顶④栈底E:①两个栈的栈顶同时到达栈空间的中心点②其中一个栈的栈顶到达栈空间的中心点。

严蔚敏版《数据结构(C语言版)》-内部排序-第10章

严蔚敏版《数据结构(C语言版)》-内部排序-第10章
>R[mid].key) )
high=mid-1 ; else low=mid+1 ;
}
/* 查找插入位置 */
for (j=i-1; j>=high+1; j--)
L->R[j+1]=L->R[j];
L->R[high+1]=L->R[0]; /* 插入到相
应位置 */
}
}
从时间上比较,折半插入排序仅仅减少了关键字的 比较次数,却没有减少记录的移动次数,故时间复杂度 仍然为O(n2) 。
待排序的记录类型的定义如下:
#define MAX_SIZE 100
Typedef int KeyType ;
typedef struct RecType
{ KeyType key ;
/* 关键字码 */
infoType otherinfo ; /* 其他域 */
}RecType ;
typedef struct Sqlist
③ 记录存储在一组连续地址的存储空间:构造另一 个辅助表来保存各个记录的存放地址(指针) :排序 过程不需要移动记录,而仅需修改辅助表中的指针, 排序后视具体情况决定是否调整记录的存储位置。
①比较适合记录数较少的情况;而②、③则适合 记录数较少的情况。
为讨论方便,假设待排序的记录是以①的情况存 储,且设排序是按升序排列的;关键字是一些可直接用 比较运算符进行比较的类型。
(n-1)(n+1)
2
移动次数:∑n (i+1)=
i=2
(n-1)(n+4)
2
一般地,认为待排序的记录可能出现的各种排列的
概率相同,则取以上两种情况的平均值,作为排序的关

数据结构单元10练习参考答案

数据结构单元10练习参考答案

单元测验10一.判断题(下列各题,正确的请在前面的括号内打√;错误的打╳)(ㄨ)(1)如果某种排序算法不稳定,则该排序方法就【没】有实用价值。

(√)(2)希尔排序是不稳定的排序。

(ㄨ)(3)冒泡排序是【不】稳定的排序。

(√)(4)对n个记录的进行快速排序,所需要的平均时间是O(nlog2n)。

(ㄨ)(5)堆排序所需的时间与待排序的记录个数【无】有关。

(√)(6)当待排序的元素个数很多时,为了交换元素的位置要占用较多的时间,这是影响时间复杂度的主要因素。

(ㄨ)(7)快速排序不是在任何情况下都比其它排序方法速度快。

(√)(8)对快速排序来说,初始序列为正序或反序都是最坏情况。

(√)(9)采用归并排序可以实现外排序。

(√)(10)采用希尔方法排序时,若关键字的排列杂乱无序,则效率最高(√)(11)快速排序算法在每一趟排序中都能找到一个元素放在其最终位置上。

(√)(12)冒泡排序的时间复杂度是O(n2)。

二.填空题(1)大多数排序算法都有两个基本的操作:比较和移动。

(2)评价排序算法优劣的主要标准是时间复杂度和算法所需的附加空间。

(3)根据被处理的数据在计算机中使用不同的存储设备,排序可分为:内排序和外排序。

(4)外排序是指在排序过程中,数据的主要部分存放在计算机的外存中。

(5)对n个关键字进行冒泡排序,其可能的最小比较次数为:n-1次。

(6)在最坏情况下,在第i趟直接插入排序中,要进行i-1次关键字的比较。

(7)对n个关键字进行冒泡排序,时间复杂度为 O(n2) 。

(8)快速排序在最坏情况下的时间复杂度是 O(n2) 。

(9)对于n个记录的集合进行归并排序,所需要的平均时间为: O(log2n) 。

(10)对于n个记录的集合进行归并排序,所需要的附加空间是 O(n) 。

(11)若原始数据接近无序,则选用快速排序最好。

(12)在排序前,关键字值相等的不同记录,排序后相对位置保持不变的排序方法,称为稳定排序方法。

数据结构 6-10章自测题及答案

数据结构 6-10章自测题及答案

自测题(6-10章)一、填空题1、二叉树第i(i>=1)层上至多有______个结点,深度为k(k>=1)的二叉树至多有______个结点。

2、对任何二叉树,若度为2的节点数为n2,则叶子数n0=______。

3、满二叉树上各层的节点数已达到了二叉树可以容纳的______,满二叉树也是______二叉树,但反之不然。

4、具有n个结点的完全二叉树的深度为______。

5、具有n个结点的二叉树中,一共有________个指针域,其中只有________个用来指向结点的左右孩子,其余的________个指针域为NULL。

6、二叉树有不同的链式存储结构,其中最常用的是________与________。

7、若二叉树的一个叶子是某子树的中根遍历序列中的第一个结点,则它必是该子树的后根遍历序列中的________个结点。

8、由________转换成二叉树时,其根结点的右子树总是空的。

9、哈夫曼树是带权路径长度________的树,通常权值较大的结点离根________。

10、有m个叶子结点的哈夫曼树,其结点总数为________。

11、已知一棵度为3的树有2个度为1的结点,3个度为2的结点,4个度为3的结点,则该树中有________个叶子结点。

12、具有10个顶点的无向图,边的总数最多为________。

13、N个顶点的连通图的生成树含有________条边。

14、无向图的邻接矩阵是一个________矩阵,有向图的邻接矩阵不一定是________矩阵。

15、一个具有n个顶点的完全无向图的边数为________,一个具有n个顶点的完全有向图的弧数为________。

16、遍历图的基本方法有________优先搜索和________优先搜索两种。

17、在有向图的邻接矩阵上,由第i行可得到第________个结点的________,而由第j列可得到第________个结点的________。

18、折半查找有序表(4,6,12,20,28,38,50,70,88,100),若查找表中元素20,它将依次与表中元素________比较大小。

数据结构(c语言版)题集答案——第十章_内部排序.docx

数据结构(c语言版)题集答案——第十章_内部排序.docx

第十章内部排序10.23void Insert_Sortl(SqList &L)〃监视哨设在高下标端的插入排序算法{k=L」ength;for(i=k-l;i;-i)//从后向前逐个插入排序if(L.r[i].key>L.r[i+1] .key){L.r[k+l].key=L.r[i].key;// 监视哨for(j=i+l;L.rfj].key>L.r[i].key;4-+j)L.r [j-1 ] .key=L.r[j] .key; 〃前移L.r [j-1 ] .key=L.r[k+1 ] .key; 〃插入}}//Insert_Sortl10.24void BiInsert_Sort(SqList &L)〃二路插入排序的算法{int dlMAXSIZE];//辅助存储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—)dU+l]=dU];d[j+l]=L.r[i].key;final++;}else//插入后部{for(j=first;d[j]d[j-l]=d[j];dl(j-2)%MAXSIZE+ l]=L.r[iJ.key;first=(first-2)%MAXSIZE+1; //&种形式的表达式是为了兼顾first=l的情况}}//forfor(i=first j= 1 ;dLiJ ;i=i%MAXS!ZE+1 ,j++)//^l 各序列复制回去L.r[j].key=d[i];}//BiInsert_Sort10.25void SLInsert_Sort(SLList &L)〃静态链农的插入排序算法L.r[0].key=0;L.r[0].next=l;L.r[l].ncxt=O; 〃建初始循环链表for(i=2;i<=L.length;i++) // 逐个插入{p=O;x=L.r[i].key;while(L.rLL.r[p].next].keyp=L.r[p].next;q=L.r[p].next;L.r[p].ncxt=i;L.r[i].next=q;}//forp=L.r[OJ.next;for(i=l;i{whilc(pq=L.r[p].ncxt;if(p!二i){L.r[pJ<->L.r[iJ;L.r[i].next=p;}p=q;}//for}//SLInsert_Sort10.26void Bubble_Sortl(int a[ ],int n)〃对包含n个元素的数组a进彳亍改进的冒泡排序{change=n-l; //change指示上一趟冒泡中最后发生交换的元素while(change){for(c=0,i=0;iif(a[i]>a[i+1]){a[i]<->a[i+l];c=i+l;//c指示这一趟冒泡屮发生交换的元素}changc=c;}//while}//Bubble_Sortl10.27void Bubblc_Sort2(int a[ ],int n)〃相邻两趟是反方向起泡的冒泡排序算法{low=0;high=n-1; 〃冒泡的上F界change=l;while(low{change=():for(i=low;iif(a[i]>a[i+1])chanse=l:}high-;//修改上界for(i=high;i>low;i-) //从F 向上起泡a[i]<->a[i-l];changc=l;}low++;〃修改卜-界}//while}//Bubble_Sort210.28void Bubble_Sort3(int a[ ],int n)〃对上一题的算法进行化简,循环体中只包含一次冒泡{int b[ 3 ]; //b[0]为冒泡的下界,b[ 2 ]为上界,b[l]无用d=l;b[0]=0;b[2]=n-l;//d为冒泡方向的标识,1为向上,・1为向下changc=l;while(b[0]{change=0;for(i=b[l -dl ;i!=bfl +d] ;i+=d) // 统一的冒泡算法if((a[i]・a[i+d])*d>0)//注意这个交换条件{a[i]<->a[i+d];change=l;}b[l+d]-=d; //修改边界d*=-l;〃换个方向}//while}//Bubble_Sort310.29void OE_Sort(int a[ ],int n)〃奇偶交换排序的算法{change=l;while(cha nge){change=():for(i= 1 ;iif(a[i]>a[i+1]){a[i]<->a[i+l];change=l;}for(i=0;iif(a[i]>a[i+1])}}//while}//OE_Sort分析:木算法的结束条件是连续两趟比较无交换发生10.30typcdcf struct {int low;int high;} boundary; //了序列的上下界类型void QSort_NotRecurve(int SQList &L)〃快速排序的非递归算法{low= 1 ;high=L.length;InitStack(S); //S 的元素为boundary 类型while(low{if(high-Iow>2) //如果当前了序列氏度大于3 尚未排好序{pivot=Partition(L,low,high); 〃进行一趟划分if(high-pivot>pivot-low){Push(S,{pivot+1 ,high}); //把长的了序列边界入栈high=pivot-l; 〃短的子序列留待下次排序}else{Push(S,{ low,pivot-1});low=pivot+l;}}〃讦else if(low{Easy_Sort(L,low,high); //直接进行比较排序low=high; 〃当前子序列标,忐为已排好序}else//如果当前子序列己排好序但栈屮还有未排序的子序列{Pop(S,a); 〃从栈中取出一个了序列low=a.low;high=a.high;}}//while}//QSort_NotRecurveint Partition(SQList &L,int low,int high)//-•趟划分的算法,与书上相同L.r[0]=L.r[low];pivotkey=L.r[low] .key;while(low=pivotkey)high-;L.r[low]=L.r[high];while(lowlow++;L.r[high]=L.r[low];}//whileL.r[lowJ=L.r[OJ;return low;{//Partitionvoid Easy_Sort(SQList &L,int low,int high)//对长度小于3的子序列进行比较排序{if(high-low==l)//子序列只含两个元索if(L.r[low] .key>L.r[high] .key) L.r[low]<->L.r[high];C1SC//T序列含冇三个元素{if(L.r[low].key>L.r[low+ l].key) L.r[low]<->L.r[low+1 ];if(L.r[low+1 J.key>L.r[high].key) L.r[low+1 J<->L.r[high];if(L.r[low].key>L.r[low+ l].key) L.r[low]<->L.r[low+ 1J;}}//Easy_Sort10.31void Divide(int a[ l,int n)〃把数组a中所有值为负的记录调到非负的记录ZMj{low=();high=n-l;whilc(low{while(low=0) high-; 〃以0作为虚拟的枢轴记录a[lowJ<->aLhighJ;while(lowallow]<->a[high];}[//Divide10.32typedef enum {RED,WHITE,BLUE} color; //三种颜色void Flag_Arrange(color a[ ],int n)〃把由三种颜色组成的序列重排为按照红,白,蓝的顺序排列{i=0;j=0;k=n-1;while(j<=k)switch(a[jj){case RED:i++;j++;break;case WHITE:j++;break;case BLUE:a[j]<->a[k];k-; 〃这里没有j++;语句是为了防止交换后a[j]仍为蓝色的情况}}//Flag_Arrange分析:这个算法屮设立了三个指针.其屮,j表示当前元素;i以前的元素全部为红色;k以示的元索全部为蓝色.这样,就可以根据j的颜色,把其交换到序列的前部或者后部.10.33void LinkedList_Select_Sort(LinkedList &L)〃单链表上的简单选择排序算法{for(p=L;p->next->next;p=p->next){q=p->ncxt;x=q->data;for(r=q,s=q;r->next;r=r->next)//?l: q后面寻找元素值最小的结点if(「>n ext->data{x=r- >n ext->data;s=r;}if(s!=q) //找至【J了值比q->data更小的最小结点s->next{p->next=s->next;s->next=q;(二q・> next;q・>next二pp->ncxt->ncxt=t;} 〃交换q和s->next两个结点}//for}//LinkedList_Select_Sort10.34void Build_Heap(Heap &H,int n)〃从低下标到高下标逐个插入建堆的算法{for(i=2;i{ 〃此时从H.r[l]到H.r[i・l]己经是大顶堆• •J=l;while(j!=l)//把H.r[i]插入{k=j/2;if(H.r|j] .key>H.r[kJ .key)H.r[j]<->H.r[k];j=k;}}//for}//Build_Heap10.35void TriHeap_Sort(Heap &H)〃利用三叉树形式的堆进行排序的算法{for(i=H.length/3;i>0;i—)Heap_Adjust(H,i,H.length);for(i=H」ength;i>l;i—){H.r[l]<->H.r[i];Heap_Adjust(H, 1 ,i-l);}}//TriHeap_Sortvoid Heap_Adjust(Heap &H,int s,int m)//顺序表H 中,H.r[s+1]到H.r[m]已经是堆,把H.r[s]插入并调整成堆{rc=H.r[s];for(j=3 *s-1 ;j<=m;j=3 *j-1){s=j;}H.rfs]=rc;}//Heap_ Adjust分析:本算法与课本上的堆排序算法相比,只有两处改动:1.建初始堆时,i的上限从H.length/3 开始(为什么?)2.调整堆的时候,要从结点的三个孩子结点中选择最大的那一个,最左边的孩子的序号的计算公式为j=3*s・l(为什么?)10.36void Merge_Sort(int a[ ],int n)〃归并排序的非递归算法{for(l= 1 ;lfor(i=0;(2*i-l)*l{start 1 =2*1 *i; //求出待归并的两段的上下界end l=start 1+1-1;start2=cnd 1+1;end2=(start2+l-1 )>(n-1 )?(n-1 )start2+l-1);//注意end2 可能超出边界Merge(a,start 1 ,end 1 ,start2,end2); 〃归)[■}}//Merge_Sortvoid Merge(int a[ ],int sl,int el,int s2,int e2)〃将有序子序列a[sl]到a[el]和a[s2]到a[e2]归并为有序序列a[sl]到a[e2]{int bfMAXSIZE]; 〃设立辅助存储数组bfor(i=s 1 ,j=s2,k=s 1 ;i<=e 1 &&jv二e2;k++) if(a[i]else b[k]=a[j++]; while(i<=el) b[k++]=a[i++];while(j<=e2) b[k++]=a[j++];〃归并到b 屮for(i=s 1 ;i<=e2;i++) // 复制回去a[iJ=bLiJ;}//Merge10.37void LinkedList_Merge_Sort 1 (LinkedList &L)〃链农结构上的归并排序非递归算法{for(l= 1 ;lfor(p=L->next,e2=p;p->next;p=e2){for(i= 1 ,q=p;i<=l&&q->next;i++,q=q->next);cl=q;for(i= l;i<=l&&q->next;i++,q=q->next);e2=q; 〃求出两个待归并子序列的尾指针if (el !=e2) LinkedList_Merge(L,p,el,e2); // 归并}}//LinkcdList_Mcrgc_Sort 1void LinkedList_Merge(LinkedList &L,LNode *p,LNode *el,LNode *e2)〃対链表上的子序列进行归并,第一个子序列是从p->next到el,第二个是从e 1 ->next到e2{q=p->ncxt;r=c 1 ->ncxt; //q和r为两个了序列的起始位置while(q!=el->next&&r!=e2->next){if(q->datadata) //^择关键字较小的那个结点接在p的后而{p->next=q;p=q;q=q->ncxt;}else{p->next=r;p=r;r=r->ncxt;}}//whilewhile(q!=el->next) //接上剩余部分{p->ncxt=q;p=q;q=q->next;}while(r!=e2->next){p->next=r;p=r;r=r->next;}//LinkedList_Merge10.38void LinkedList_Merge_Sort2(LinkedList &L)〃初始归并段为最大有序子序列的归并排序,采用链表存储结构{LNodc *cnd[MAXSIZE]; 〃设立一个数组来存储各冇序了序列的尾指针for(p=L->next->nextj=0;p;p=p->next) // 求各有序子序列的尾指针if(!p->nextllp->data>p->next->data) end[i++]=p;while(end[O]->next) //当不止一个子序列时进行两两归并{j=O;k=O;//j:当前子序列尾指针存储位B!;k:归并后的子序列尾指针存储位置for(p=L->next,e2=p;p->next;p=e2) //两两归并所有子序列{el二end[j];e2=end[j+l]; //确定两个子序列if(e 1 ->next) LinkedList_Merge(L,p,e 1 ,e2); 〃归并cnd[k++]=c2; //用新序列的尾指针取代原来的尾指针j+=2;〃转到后面两个子序列}}//while}//LinkedList_Merge_Sort2void LinkcdList_Mcrgc(LinkcdList &L,LNodc *p,LNodc *cl,LNodc *c2)〃对链表上的了序列进行归并,第一个了序列是从p->next到el,第二个是从el->next到e2{q=p->next;r=e 1 ->next;while(q!=e 1 ->next&&r!=e2->next){if(q->datadata){p->next=q;p=q;q=q->next;}else{p->next=r;p=r;r=r->next;}}//whilewhile(q!=e 1 ->next){p->next=q;p=q;q=q->next;}while(r!=e2->next)p->next=r;p=r;}//LinkedList_Merge,与上一题完全相同10.39void SL_Mcrgc(int a[ ],int ll,int 12)//把长度分别为11,12且11A2<(11+12)的两个有序子序列归并为有序序列{startl=0;start2=ll;//分别表示序列1和序列2的剩余未归并部分的起始位直for(i=0;i{for(j=start2;jk=j-start2; //k为要向右循环移动的位数RSh(a,start 1 j-1 ,k);//W a[startl]到a[j・l]之间的子序列循环右移k位start l+=k+l;start2=j; 〃修改两序列尚未归并部分的起始位置}}//SL_Mergevoid RSh(int a[ ] jnt start,int end,int k)〃将a[start]到a[end]之间的子序列循环右移k 位,算法原理参见5.18{len=end-start+l;for(i=l;i<=k;i++)if(len%i==0&&k%i==0) p=i; 〃求len 和k 的最大公约数pfor(i=0;i{j=start+i;l=start+(i+k)%len;temp=a|jj;while(l!=start+i){a[j]=tcmp;temp=a[l];all]=a|j];j=l;l=start+(j-start4-k)%len; // 依次|H J右移}a[start+i]=temp;}//for}//RSh10.40E后给出的解题思路在表述上存在问题,无法理解•比如说,“把第一个序列划分为两个子序列, 使其中的第一个子序列含有si个记录,0<=s 110.41void Hash_Sort(int a[ J)//X'j 1000个关键字为四位整数的记录进行排序{int b[ 10000];for(i=0;ivl000;i卄)〃直接按关键字散列{for(j=a[i] ;b[j] ;j=(j+1)% 10000);fo「(i=0,j=0;ivl000;j++)〃将散列收回a 中if(b[j]){for(x=b[j],k=j ;b[kj ;k=(k+1)%10000)if(b[k>=x){a[i++]=x;b[k]=0;}}//if}//Hash_Sort10.42typedef stmct {int gt; //大于该记录的个数int It; 〃小于该记录的个数} place; 〃整个序列中比某个关键字大或小的记录个数int Get_Mid(int a[ J,int n)〃求一个序列的中值记录的位置{place b[MAXSIZEJ;for(i=();ifor(j=0;j{if(a[j]>a[i])b[i].gt++;else if(a[j]}mid=0;min_dif=abs(b[0].gt-b[0].lt);for(i=0;iif(abs(b[i].gt-b[i].lt)return mid;}//Gct_Mid10.43void Count_Sort(int a[ ],int n)〃计数排序算法{int cfMAXSIZE];for(i=0;i{for(j=0,count=0;jif(a[j]c[i]=count;}for(i=0;i{min=();for(j=0;jif(c[j]a[i]<->a[min]; 〃与第i 个记录交换c[minJ=INFINITY; //修改该记录的c值为无穷大以便下一次选収}}//Count_Sort10.44void Enum_Sort(int a[ ],int n)〃对关键字只能取v到w Z间任意整数的序列进行排序int number[w+1 J,pos[w+1J; for(i=0;ifor(pos[0]=0,i=l;ipos[i]=pos[i-l]+num[i]; //pos 数组可以把关键字的值映射为元素在排好的序列中的位置for(i=0;ic[pos[a[i]]++]=a[i];for(i=0;ia[i]=c[i];}//Enum_Sort分析:木算法参考了第五章三元组稀疏矩阵转置的算法思想,其中的pos数组和那里的cpot数组起的是相类似的作用.10.45typedef enum {0,1,2,3,4,5,6,7,8,9} digit; //个位数类型typedef digit[3] num; //3位自然数类型,假设低位存储在低下标,高位存储在高卜•标void Enuni_Radix_Sort(num a[ ],int n)〃利用计数实现基数排序,其屮关键字为3位白然数,共有n个自然数{int number ,pos ;num c[MAXSIZEJ;for(j=0;j<3;j++) //依次对个位,十位和百位排序{for(i=0;ifor(pos[0]=0,i=l;ipos[iJ=pos[i-l]+numLi]; //把关键字的值映射为元素在排好的序列中的位置for(i=0;ic[pos[a[ij[j]]++]=a[i];for(i=0;ia[i]=c[i];}//for}//Enum_Radix_Sort分析:计数排序是一种稳定的排序方法.」E因为如此,它才能够被用来实现基数排序.10.46typedef struct {int key;int pos;} Shadow;//影子序列的记录类型void Shadow_Sort(Rectype b[ ],Rectype &a[ ],int n)〃对元素很人的记录序列b进行排序,结果放入a中,不移动元素{Shadow d[MAXSIZE];for(i=0;i{d[i].key=b[i].key;dfi].pos=i;}for(i=n-l ,change= 1 ;i> 1 &&change;i・・)//对影子序列执行冒泡排序{change=0;for(j=O;jif(d[j].key>d[j+l].key){dU]<->dU+U;change=l;}//forfor(i=0;ia[i]=b[d[i].pos]; }//Shadow_Sort。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第9章排序
一、填空题(每空1分,共24分)
1. 大多数排序算法都有两个基本的操作:和。

2. 在对一组记录(54,38,96,23,15,72,60,45,83)进行直接插入排序时,当把第7个记录60插入到有序表时,为寻找插入位置至少需比较次。

3. 在插入和选择排序中,若初始数据基本正序,则选
用;若初始数据基本反序,则选用。

4. 在堆排序和快速排序中,若初始记录接近正序或反序,则选用;若初始记录基本无序,则最好选用。

5. 对于n个记录的集合进行冒泡排序,在最坏的情况下所需要的时间是。

若对其进行快速排序,在最坏的情况下所需要的时间是。

6. 对于n个记录的集合进行归并排序,所需要的平均时间是,所需要的附加空间是。

7.对于n个记录的表进行2路归并排序,整个归并排序需进行趟(遍)。

8. 设要将序列(Q, H, C, Y, P, A, M, S, R, D, F, X)中的关键码按字母序的升序重新排列,则:
冒泡排序一趟扫描的结果是;
初始步长为4的希尔(shell)排序一趟的结果是;
二路归并排序一趟扫描的结果是;
快速排序一趟扫描的结果是;
堆排序初始建堆的结果是。

9. 在堆排序、快速排序和归并排序中,
若只从存储空间考虑,则应首先选取方法,其次选取方法,最后选取方法;
若只从排序结果的稳定性考虑,则应选取方法;
若只从平均情况下最快考虑,则应选取方法;
若只从最坏情况下最快并且要节省内存考虑,则应选取方法。

二、单项选择题(每小题1分,共18分)
1.将5个不同的数据进行排序,至多需要比较次。

A. 8 B. 9 C. 10 D. 25
2.排序方法中,从未排序序列中依次取出元素与已排序序列(初始时为空)中的元素进行比较,将其放入已排序序列的正确位置上的方法,称为
A. 希尔排序B. 冒泡排序C. 插入排序D. 选择排序3.从未排序序列中挑选元素,并将其依次插入已排序序列(初始时为空)的一端的方法,称为
A. 希尔排序B. 归并排序C. 插入排序D. 选择排序4.对n个不同的排序码进行冒泡排序,在下列哪种情况下比
较的次数最多。

A. 从小到大排列好的B. 从大到小排列好的
C. 元素无序D. 元素基本有序
5.对n个不同的排序码进行冒泡排序,在元素无序的情况下比较的次数为
A. n+1 B. n C. n-1 D. n(n-1)/2
6.快速排序在下列哪种情况下最易发挥其长处。

A. 被排序的数据中含有多个相同排序码
B. 被排序的数据已基本有序
C. 被排序的数据完全无序
D. 被排序的数据中的最大值和最小值相差悬殊
7.对有n个记录的表作快速排序,在最坏情况下,算法的时间复杂度是
A.O(n) B.O(n2) C.O(nlog2n) D.O(n3) 8.若一组记录的排序码为(46, 79, 56, 38, 40, 84),则利用快速排序的方法,以第一个记录为基准得到的一次划分结果为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
9.下列关键字序列中,是堆。

A. 16, 72, 31, 23, 94, 53
B. 94, 23, 31, 72, 16, 53
C. 16, 53, 23, 94,31, 72
D. 16, 23, 53, 31, 94, 72
10.堆是一种排序。

A. 插入B.选择C. 交换D. 归并
11.堆的形状是一棵
A. 二叉排序树B.满二叉树
C. 完全二叉树D. 平衡二叉树
12.若一组记录的排序码为(46, 79, 56, 38, 40, 84),则利用堆排序的方法建立的初始堆为
A. 79, 46, 56, 38, 40, 84 B. 84, 79, 56, 38, 40, 46
C. 84, 79, 56, 46, 40, 38 D. 84, 56, 79, 40, 46, 38 17.下述几种排序方法中,要求内存最大的是
A. 插入排序B.快速排序
C. 归并排序D. 选择排序。

相关文档
最新文档