数据结构第10章 排序答案
源代码--数据结构与算法(Python版)chap10 排序
交换类
(2)快速排序 快速排序采用分而治之(Divide and Conquer)
的策略将问题分解成若干个较小的子问题,采用 相同的方法一一解决后,再将子问题的结果整合 成最终答案。快速排序的每一轮处理其实就是将 这一的基准数定位,直到所有的数都排序完成 为止。
21
快速排序的基本步骤:
1. 选定一个基准值(通常可选第一个元素); 2. 将比基准值小的数值移到基准值左边,形
14
• 交换类
交换类排序的基本思想是:通过交换无序序列 中的记录得到其中关键字最小或最大的记录,并将 其加入到有序子序列中,最终形成有序序列。交换 类排序可分为冒泡排序和快速排序等。
15
交换类
(1)冒泡排序 两两比较待排序记录的关键字,发现两
个记录的次序相反时即进行交换,直到没有 反序的记录为止。因为元素会经由交换慢慢 浮到序列顶端,故称之为冒泡排序。
3. 最后对这个组进行插入排序。步长的选法 一般为 d1 约为 n/2,d2 为 d1 /2, d3 为 d2/2 ,…, di = 1。
11
【例】给定序列(11,9,84,32,92,26,58,91,35, 27,46,28,75,29,37,12 ),步长设为d1 =5、d2 =3、 d3 =1,希尔排序过程如下:
for i in range(1,len(alist)):
#外循环n-1
for j in range(i,0,-1):
#内循环
if alist[j]<alist[j-1]:
alist[j],alist[j-1]=alist[j-1],alist[j] #交换
li=[59,12,77,64,72,69,46,89,31,9] print('before: ',li) insert_sort(li) print('after: ',li)
数据结构答案 第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.快速排序快速排序法是通过一趟排序,将待排序的记录组分割成独立的两部分,其中前一部分记录的关键字均比枢轴记录的关键字小;后一部分记录的关键字均比枢轴记录的关键字大,枢轴记录得到了它在整个序列中的最终位置并被存放好。
第二趟再分别对分割成两部分子序列,再进行快速排序,这两部分子序列中的枢轴记录也得到了最终在序列中的位置而被存放好,并且它们又分别分割出独立的两个子序列……。
最完整的数据结构1800题包括完整答案第10章 排序答案
1 3 C (n − 2) + 3 C(n)=
n=2 n=3 n>3
通过逐步递推,可以得到:C(n)=3n/2-2。显然,当 n>=3 时,2n-3>3n/2-2。事实上, 3n/2-2 是解决这一问题的比较次数的下限。 6. 假定待排序的记录有 n 个。由于含 n 个记录的序列可能出现的状态有 n!个,则描述 n 个 记录排序过程的判定树必须有 n!个叶子结点。因为若少一个叶子,则说明尚有两种状态没 h-1 有分辨出来。我们知道,若二叉树高度是 h,则叶子结点个数最多为 2 ;反之,若有 u 个
59.1C 59.2A 59.3D 59.4B 59.5G
60.1B 60.2C 60.3A
61.1B 61.2D 61.3B 61.4C 61.5F
部分答案解释如下: 18. 对于后三种排序方法两趟排序后,序列的首部或尾部的两个元素应是有序的两个极值, 而给定的序列并不满足。 20. 本题为步长为 3 的一趟希尔排序。 24.枢轴是 73。 49. 小根堆中,关键字最大的记录只能在叶结点上,故不可能在小于等于 n/2 的结点上。 64. 因组与组之间已有序, 故将 n/k 个组分别排序即可, 基于比较的排序方法每组的时间下 界为 O(klog 2 k),全部时间下界为 O(nlog 2 k)。 二、判断题 1.√ 14. √ 27. √ 2.× 15. √ 28. × 3.× 16. × 29. × 4.× 17. × 30. × 5.× 18. × 31. √ 6.× 19. × 7.× 20. × 8.× 21. × 9.× 22. × 10. × 23. × 11. × 24. × 12. × 25. √ 13. × 26. ×
第 10 章 排序(参考答案)
数据结构第九、十章作业答案
数据结构第九、⼗章作业答案第九章查找⼀、填空题1. 在数据的存放⽆规律⽽⾔的线性表中进⾏检索的最佳⽅法是顺序查找(线性查找)。
2. 线性有序表(a 1,a 2,a 3,…,a 256)是从⼩到⼤排列的,对⼀个给定的值k ,⽤⼆分法检索表中与k 相等的元素,在查找不成功的情况下,最多需要检索 8 次。
设有100个结点,⽤⼆分法查找时,最⼤⽐较次数是 7 。
3. 假设在有序线性表a[1..20]上进⾏折半查找,则⽐较⼀次查找成功的结点数为1;⽐较两次查找成功的结点数为 2 ;⽐较四次查找成功的结点数为 8 ,其下标从⼩到⼤依次是1,3,6,8,11,13,16,19______,平均查找长度为 3.7 。
解:显然,平均查找长度=O (log 2n )<5次(25)。
但具体是多少次,则不应当按照公式)1(log 12++=n n n ASL 来计算(即(21×log 221)/20=4.6次并不正确!)。
因为这是在假设n =2m -1的情况下推导出来的公式。
应当⽤穷举法罗列:全部元素的查找次数为=(1+2×2+4×3+8×4+5×5)=74; ASL =74/20=3.74.折半查找有序表(4,6,12,20,28,38,50,70,88,100),若查找表中元素20,它将依次与表中元素 28,6,12,20 ⽐较⼤⼩。
5. 在各种查找⽅法中,平均查找长度与结点个数n ⽆关的查找⽅法是散列查找。
6. 散列法存储的基本思想是由关键字的值决定数据的存储地址。
7. 有⼀个表长为m 的散列表,初始状态为空,现将n (n8、设⼀哈希表表长M 为100 ,⽤除留余数法构造哈希函数,即H (K )=K MOD P (P<=M ), 为使函数具有较好性能,P 应选( 97 )9、在各种查找⽅法中,平均查找长度与结点个数⽆关的是哈希查找法10、对线性表进⾏⼆分查找时,要求线性表必须以顺序⽅式存储,且结点按关键字有序排列。
数据库系统l试题库及答案第10章排序
第10章排序10.1排序的相关知识一、填空题1.将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列叫2.大多数排序算法都有两个基本的操作:____________ 和___________ 。
二、选择题1.()排序算法的稳定性是指()。
A.经过排序后,能使关键字相同的元素保持原顺序中的相对位置不变B.经过排序后,能使关键字相同的元素保持原顺序中的绝对位置不变C.排序算法的性能与被排序元素的个数关系不大D.排序算法的性能与被排序元素的个数关系密切2.()关于排序的以下叙述中,正确的是()。
A.稳定的排序方法优于不稳定的排序方法,因为稳定的排序方法效率高B.对同一个线性表使用不同的排序方法进行排序,得到的排序结果可能不同C.排序方法都是在顺序表上实现的,在链表上无法实现排序方法D.在顺序表上实现的排序方法都可以在链表上实现3.()以下不属于内部排序方法的是()。
A.选择排序B. 插入排序C. 归并排序D. 拓扑排序10.2插入排序填空题1. 在对一组记录(54, 38, 96, 23,15,72,60,45, 83)进行直接插入排序时,当把第个记录60插入到有序表时,为寻找插入位置至少需比较______________ 次。
二、选择题:1.()排序方法中,从未排序序列中依次取出元素与已排序序列(初始时空)中的元素进行比较,将其放入已排序序列的正确位置上的方法,称为()。
A. 希尔排序B. 冒泡排序C. 插入排序D. 选择排序2.()折半插入排序算法的平均情况下的时间复杂度为()。
2 3A. O(n)B. O (nlog 2n)C. O (n )D. O (n )3.()对含有n个元素的顺序表采用直接插入排序方法进行排序,在最坏情况下所需的比较次数是()。
A.n-1B. n+1C. n/2D. n(n-1)/2三、简答题1.给出关键字序列{4,5,1,2,8,6,7,3,10,9} 的直接插入排序过程。
数据结构(严蔚敏)第10章
一、什么是排序?
排序是计算机内经常进行的一种操作, 其目的是将一组“无序”的记录序列调 整为“有序”的记录序列。
例如:将下列关键字序列 52, 49, 80, 36, 14, 58, 61, 23, 97, 75
调整为
14, 23, 36, 49, 52, 58, 61 ,75, 80, 97 .页 08.06.2020
10. 2 插入排序
.页 08.06.2020
一趟直接插入排序的基本思想:
有序序列R[1..i-1]
无序序列 R[i..n]
R[i]
有序序列R[1..i]
无序序列 R[i+1..n]
.页 08.06.2020
实现“一趟插入排序”可分三步进行:
1.在R[1..i-1]中查找R[i]的插入位置,
R[1..j].key R[i].key < R[j+1..i-1].key;
有序序列区 无 序 序 列 区
经过一趟排序
08.06.2020
有序序列区 无 序 序 列 区
.页
基于不同的“扩大” 有序序列长 度的方法,内部排序方法大致可分 下列几种类型:
插入类 交换类 选择类
归并类 其它方法
.页 08.06.2020
#待de排fin记e M录A的XS数IZ据E 类10型00定// 义待排如顺下序:表最大长度
第十章 排序
.页 08.06.2020
【课前思考】
1. 你熟悉排序吗?你过去曾经学过哪些排序方法? 在第一章中曾以选择排序和起泡排序为例讨论算 法实践复杂度,不知你还记得吗? 2. 你自己有没有编过排序的程序?是用的什么策 略?
.页 08.06.2020
【学习目标】
数据结构考研试题精选及答案第10章排序
第10章 排序排序排序一、选择题 1.某内排序方法的稳定性是指.某内排序方法的稳定性是指( )( )( )。
【南京理工大学【南京理工大学 1997 1997 1997 一、一、一、101010((2分)】 A .该排序算法不允许有相同的关键字记录该排序算法不允许有相同的关键字记录 B B B..该排序算法允许有相同的关键字记录记录C .平均时间为0(n log n n log n)的排序方法)的排序方法)的排序方法D D D.以上都不对.以上都不对.以上都不对2.下面给出的四种排序法中下面给出的四种排序法中( )( )( )排序法是不稳定性排序法。
排序法是不稳定性排序法。
【北京航空航天大学北京航空航天大学 1999 1999 1999 一、一、10 10 ((2分)】 A. A. 插入插入插入 B. B. B. 冒泡冒泡冒泡 C. C. C. 二路归并二路归并二路归并 D. D. D. 堆积堆积堆积 3.下列排序算法中,其中(.下列排序算法中,其中( )是稳定的。
)是稳定的。
)是稳定的。
【福州大学【福州大学 1998 1998 1998 一、一、一、3 (23 (2分)】A. A. 堆排序,冒泡排序堆排序,冒泡排序堆排序,冒泡排序B. B. B. 快速排序,堆排序快速排序,堆排序快速排序,堆排序C. C. 直接选择排序,归并排序直接选择排序,归并排序直接选择排序,归并排序D. D. D. 归并排序,冒泡排序归并排序,冒泡排序归并排序,冒泡排序4.稳定的排序方法是(.稳定的排序方法是( )) 【北方交通大学【北方交通大学【北方交通大学 2000 2000 2000 二、二、二、33(2分)】 A .直接插入排序和快速排序.直接插入排序和快速排序 B B B.折半插入排序和起泡排序.折半插入排序和起泡排序.折半插入排序和起泡排序C .简单选择排序和四路归并排序.简单选择排序和四路归并排序D D D.树形选择排序和.树形选择排序和shell 排序排序5.下列排序方法中,哪一个是稳定的排序方法?(.下列排序方法中,哪一个是稳定的排序方法?( ) 【北方交通大学【北方交通大学【北方交通大学 2001 2001 2001 一、一、一、88(2分)】A .直接选择排序.直接选择排序B B B.二分法插入排序.二分法插入排序.二分法插入排序C C C.希尔排序.希尔排序.希尔排序D D D.快速排序.快速排序.快速排序6.若要求尽可能快地对序列进行稳定的排序,则应选(.若要求尽可能快地对序列进行稳定的排序,则应选(A A .快速排序.快速排序 B B B.归并排序.归并排序.归并排序 C C C.冒.冒泡排序)。
数据结构第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. 冒泡
数据结构第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,不符合大根堆特点。
数据结构第九、十章 作业答案
第九章 查找一、填空题1. 在数据的存放无规律而言的线性表中进行检索的最佳方法是 顺序查找(线性查找) 。
2. 线性有序表(a 1,a 2,a 3,…,a 256)是从小到大排列的,对一个给定的值k ,用二分法检索表中与k 相等的元素,在查找不成功的情况下,最多需要检索 8 次。
设有100个结点,用二分法查找时,最大比较次数是 7 。
3. 假设在有序线性表a[1..20]上进行折半查找,则比较一次查找成功的结点数为1;比较两次查找成功的结点数为 2 ;比较四次查找成功的结点数为 8 ,其下标从小到大依次是1,3,6,8,11,13,16,19______,平均查找长度为 3.7 。
解:显然,平均查找长度=O (log 2n )<5次(25)。
但具体是多少次,则不应当按照公式)1(log 12++=n nn ASL 来计算(即(21×log 221)/20=4.6次并不正确!)。
因为这是在假设n =2m -1的情况下推导出来的公式。
应当用穷举法罗列:全部元素的查找次数为=(1+2×2+4×3+8×4+5×5)=74; ASL =74/20=3.7 !!! 4.折半查找有序表(4,6,12,20,28,38,50,70,88,100),若查找表中元素20,它将依次与表中元素 28,6,12,20 比较大小。
5. 在各种查找方法中,平均查找长度与结点个数n 无关的查找方法是 散列查找 。
6. 散列法存储的基本思想是由 关键字的值 决定数据的存储地址。
7. 有一个表长为m 的散列表,初始状态为空,现将n (n<m )个不同的关键码插入到散列表中,解决冲突的方法是用线性探测法。
如果这n 个关键码的散列地址都相同,则探测的总次数是 n(n-1)/2=( 1+2+…+n-1) 。
(而任一元素查找次数 ≤n-1)8、设一哈希表表长M 为100 ,用除留余数法构造哈希函数,即H (K )=K MOD P (P<=M ), 为使函数具有较好性能,P 应选( 97 )9、在各种查找方法中,平均查找长度与结点个数无关的是哈希查找法 10、对线性表进行二分查找时,要求线性表必须以 顺序 方式存储,且结点按关键字有序排列。
数据结构第九、十章 作业答案
第九章 查找一、填空题1. 在数据的存放无规律而言的线性表中进行检索的最佳方法是 顺序查找(线性查找) 。
2. 线性有序表(a 1,a 2,a 3,…,a 256)是从小到大排列的,对一个给定的值k ,用二分法检索表中与k 相等的元素,在查找不成功的情况下,最多需要检索 8 次。
设有100个结点,用二分法查找时,最大比较次数是 7 。
3. 假设在有序线性表a[1..20]上进行折半查找,则比较一次查找成功的结点数为1;比较两次查找成功的结点数为 2 ;比较四次查找成功的结点数为 8 ,其下标从小到大依次是1,3,6,8,11,13,16,19______,平均查找长度为 3.7 。
解:显然,平均查找长度=O (log 2n )<5次(25)。
但具体是多少次,则不应当按照公式)1(log 12++=n n n ASL 来计算(即(21×log 221)/20=4.6次并不正确!)。
因为这是在假设n =2m -1的情况下推导出来的公式。
应当用穷举法罗列:全部元素的查找次数为=(1+2×2+4×3+8×4+5×5)=74; ASL =74/20=3.7 !!!4.折半查找有序表(4,6,12,20,28,38,50,70,88,100),若查找表中元素20,它将依次与表中元素 28,6,12,20 比较大小。
5. 在各种查找方法中,平均查找长度与结点个数n 无关的查找方法是 散列查找 。
6. 散列法存储的基本思想是由 关键字的值 决定数据的存储地址。
7. 有一个表长为m 的散列表,初始状态为空,现将n (n<m )个不同的关键码插入到散列表中,解决冲突的方法是用线性探测法。
如果这n 个关键码的散列地址都相同,则探测的总次数是 n(n-1)/2=( 1+2+…+n-1) 。
(而任一元素查找次数 ≤n-1)8、设一哈希表表长M 为100 ,用除留余数法构造哈希函数,即H (K )=K MOD P (P<=M ), 为使函数具有较好性能,P 应选( 97 )9、在各种查找方法中,平均查找长度与结点个数无关的是哈希查找法10、对线性表进行二分查找时,要求线性表必须以 顺序 方式存储,且结点按关键字有序排列。
数据结构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]=x}3.这一段代码所描述的排序方法称作(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)。
数据结构单元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)在排序前,关键字值相等的不同记录,排序后相对位置保持不变的排序方法,称为稳定排序方法。
中国铁道出版社数据结构(第二版)单元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)在排序前,关键字值相等的不同记录,排序后相对位置保持不变的排序方法,称为稳定排序方法。
数据结构第九、十章 作业答案
第九章 查找一、填空题1. 在数据的存放无规律而言的线性表中进行检索的最佳方法是 顺序查找(线性查找) 。
2. 线性有序表(a 1,a 2,a 3,…,a 256)是从小到大排列的,对一个给定的值k ,用二分法检索表中与k 相等的元素,在查找不成功的情况下,最多需要检索 8 次。
设有100个结点,用二分法查找时,最大比较次数是 7 。
3. 假设在有序线性表a[1..20]上进行折半查找,则比较一次查找成功的结点数为1;比较两次查找成功的结点数为 2 ;比较四次查找成功的结点数为 8 ,其下标从小到大依次是1,3,6,8,11,13,16,19______,平均查找长度为 3.7 。
解:显然,平均查找长度=O (log 2n )<5次(25)。
但具体是多少次,则不应当按照公式)1(log 12++=n n n ASL 来计算(即(21×log 221)/20=4.6次并不正确!)。
因为这是在假设n =2m -1的情况下推导出来的公式。
应当用穷举法罗列:全部元素的查找次数为=(1+2×2+4×3+8×4+5×5)=74; ASL =74/20=3.7 !!!4.折半查找有序表(4,6,12,20,28,38,50,70,88,100),若查找表中元素20,它将依次与表中元素 28,6,12,20 比较大小。
5. 在各种查找方法中,平均查找长度与结点个数n 无关的查找方法是 散列查找 。
6. 散列法存储的基本思想是由 关键字的值 决定数据的存储地址。
7. 有一个表长为m 的散列表,初始状态为空,现将n (n<m )个不同的关键码插入到散列表中,解决冲突的方法是用线性探测法。
如果这n 个关键码的散列地址都相同,则探测的总次数是 n(n-1)/2=( 1+2+…+n-1) 。
(而任一元素查找次数 ≤n-1)8、设一哈希表表长M 为100 ,用除留余数法构造哈希函数,即H (K )=K MOD P (P<=M ), 为使函数具有较好性能,P 应选( 97 )9、在各种查找方法中,平均查找长度与结点个数无关的是哈希查找法10、对线性表进行二分查找时,要求线性表必须以 顺序 方式存储,且结点按关键字有序排列。
严蔚敏版《数据结构(C语言版)》-内部排序-第10章
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.2 插入排序 插入排序
直接插入排序 折半插入排序 2-路插入排序 表插入排序 希尔排序
10.2.1 直接插入排序
基本操作:将一个记录插入到已排好序的有序表中, 从而得到一个新的、记录数增1的有序表。
例:有一组待排序的记录的关键字初始序列如下:
(49,38,65,97,76,13,27,49`)
(4)归并排序 (5)基数排序
按内排过程中所需的工作量分类:
(1)简单的排序方法,其时间复杂度为O(n×n)
(2)先进的排序方法,其时间复杂度为O(nlogn);
(3)基数排序,其时间复杂度为O(d(n+rd))
排序算法的两种基本操作:
(1)比较两个关键字的大小; (2)将记录从一个位置移至另一个位置;
算法实现的关键设计:
将d看成是一个循环数组,并设两个指针first和final分别指示排序过 程中得到的有序序列中的第一个记录和最后一个记录在d中的位置.
例:有一组待排序的记录的关键字初始排列如下:
(49,38,65,97,76,13,27,49`) 16
[初始关键字] 49 38 65 97 76 13 27 49`
18
10.2.3 希尔排序 从直接插入排序
待排序序列基本有序可提高效率 回顾 待排序序列的记录数n很小时可提高效率
希尔排序的基本思想:
先将整个待排记录序列分割成为若干子序列分别进行
直接插入排序,待整个序列中的记录“基本有序”时,再对 全
体记例录:有进一行组一待次排直序接的插记入录排的序关. 键字初始排列如下: (49,38,65,97,76,13,27,49`)
} 12
直接插入排序的性能分析: 10. 3
(1)空间:只需一个记录的辅助空间r[0].
第10章 排序(3)-数据结构教程(Java语言描述)-李春葆-清华大学出版社
12/41
排序区间是R[s..t](为大问题),当其长度为0或者1时,本身就是有 序的,不做任何处理。
否则,其中间位置m,采用相同方法对R[s..m]和R[m+1..t]排好序(分 解为两个小问题),再调用前面的二路归并算法Merge(s,m,t)得到整 个有序表(合并)。
f(R,s,t) ≡ 不做任何事情
int i=low,j=mid+1,k=0;
//k是R1的下标,i、j分别为第1、2段的下标
while (i<=mid && j<=high)
//在第1段和第2段均未扫描完时循环
if (R[i].key<=R[j].key) //将第1段中的元素放入R1中
{ R1[k]=R[i];
i++; k++; }
空间复杂度为O(high-low+1)
else
//将第2段中的元素放入R1中
{ R1[k]=R[j];
j++; k++;
}
while (i<=mid)
//将第1段余下部分复制到R1
{ R1[k]=R[i];
i++; k++;
}
while (j<=high)
//将第2段余下部分复制到R1
{ R1[k]=R[j];
j++; k++;
}
for (k=0,i=low;i<=high;k++,i++)
//将R1复制回R中
R[i]=R1[k];
}
5/41
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第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)/28.题中p指向无序区第一个记录,q指向最小值结点,一趟排序结束,p和q所指结点值交换,同时向后移p指针。
(1)!=null (2)p->next (3)r!=null (4)r->data<q->data(5)r->next (6)p->next9. 题中为操作方便,先增加头结点(最后删除),p指向无序区的前一记录,r指向最小值结点的前驱,一趟排序结束,无序区第一个记录与r所指结点的后继交换指针。
(1)q->link!=NULL (2)r!=p (3)p->link (4)p->link=s (5)p=p->link10.(1)i<n-i+1 (2)j<=n-i+1 (3)r[j].key<r[min].key (4)min!=i (5)max==i(6)r[max]<-->r[n-i+1]11.(1)N (2)0 (3)N-1 (4)1 (5)R[P].KEY<R[I].KEY (6)R[P].LINK(7)(N+2)(N-1)/2(8)N-1 (9)0 (10)O(1)(每个记录增加一个字段) (11)稳定(请注意I的步长为-1)12. 3,(10,7,-9,0,47,23,1,8,98,36) 13.快速14.(4,1,3,2,6,5,7)15.最好每次划分能得到两个长度相等的子文件。
设文件长度n=2k-1,第一遍划分得到两个长度⎣n/2⎦的子文件,第二遍划分得到4个长度⎣n/4⎦的子文件,以此类推,总共进行k=log2(n+1)遍划分,各子文件长度均为1,排序结束。
16.O(n2) 17. O(nlog2n) 18.(1)2*i (2)r[j].key>r[j+1].key (3)true(4)r[j] (5)2*i19.(1)2*i (2)j<=r (3)j←j+1 (4)x.key>heap[j].key (5)i←j (6)j←2*i(7)x20.(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<n (6)a[i]:=a[m] (7)a[m]:=t26. 程序(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)flag27.(Q,A,C,S,Q,D,F,X,R,H,M,Y),(F,H,C,D,Q,A,M,Q,R,S,Y,X) 28. 初始归并段(顺串)29. 初始归并段,初始归并段,减少外存信息读写次数(即减少归并趟数),增加归并路数和减少初始归并段个数。
30. ⎡n/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}。
若整个排序过程都在内存中完成,则称此类排序问题为内部排序。
后发生了变化,而题中叙述和排序中稳定性的定义无关,所以此说法不对。
对4,3,2,1起泡排序就可否定本题结论。
4. 可以做到。
取a与b进行比较,c与d进行比较。
设a>b,c>d(a<b和c<d情况类似),此时需2次比较,取b和d比较,若b>d,则有序a>b>d;若b<d时则有序c>d>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 个叶子结点,则二叉树的高度至少为⎡log 2u ⎤+1。
这就是说,描述n 个记录排序的判定树必定存在一条长度为⎡log 2(n!)⎤的路径。
即任何一个籍助“比较”进行排序的算法,在最坏情况下所需进行的比较次数至少是⎡log 2(n!)⎤。
根据斯特林公式,有⎡log 2(n!)⎤ =O(nlog 2n)。
即籍助于“比较”进行排序的算法在最坏情况下能达到的最好时间复杂度为O(nlog 2n)。
证毕。
7. 答:拓扑排序,是有向图的顶点依照弧的走向,找出一个全序集的过程,主要是根据与顶点连接的弧来确定顶点序列;冒泡排序是借助交换思想通过比较相邻结点关键字大小进行排序的算法。
8. 直接插入排序的基本思想是基于插入,开始假定第一个记录有序,然后从第二个记录开始,依次插入到前面有序的子文件中。
即将记录R[i](2<=i<=n)插入到有序子序列R[1..i-1]中,使记录的有序序列从R[1..i-1]变为R[1..i] ,最终使整个文件有序。
共进行n-1趟插入。
最坏时间复杂度是0(n 2),平均时间复杂度是0(n 2),空间复杂度是O(1),是稳定排序。
简单选择排序的基本思想是基于选择,开始有序序列长度为零,第i(1<=i<n)趟简单选择排序是,从无序序列R[i..n]的n-i+1记录中选出关键字最小的记录,和第i 个记录交换,使有序序列逐步扩大,最后整个文件有序。
共进行n-1趟选择。
最坏时间复杂度是0(n 2),平均时间复杂度是0(n 2),空间复杂度是O(1),是不稳定排序。
二路并归排序的基本思想是基于归并,开始将具有n 个待排序记录的序列看成是n 个长度为1的有序序列,然后进行两两归并,得到⎡n/2⎤个长度为2的有序序列,再进行两两归并,得到⎡n/4⎤个长度为4的有序序列。
如此重复,经过⎡log 2n ⎤趟归并,最终得到一个长度为n 的有序序列。
最坏时间复杂度和平均时间复杂度都是0(nlog 2n),空间复杂度是O(n),是稳定排序。
9. 错误。
快速排序,堆排序和希尔排序是时间性能较好的排序方法,但都是不稳定的排序方法。
10. 等概率(后插),插入位置0..n ,则平均移动个数为n/2。
若不等概率,则平均移动个数为=11. 从节省存储空间考虑:先选堆排序,再选快速排序,最后选择归并排序;从排序结果的稳定性考虑:选择归并排序。
堆排序和快速排序都是不稳定排序;从平均情况下排序最快考虑:先选择快速排序。
12. (1)堆排序,快速排序,归并排序 (2)归并排序 (3)快速排序 (4)堆排序13. 平均比较次数最少: 快速排序; 占用空间最多: 归并排序; 不稳定排序算法:快速排序、堆排序、希尔排序。
14. 求前k 个最大元素选堆排序较好。
因为在建含n 个元素的堆时,总共进行的关键字的比较次数不超过4n ,调整建新堆时的比较次数不超过2log 2n 次。
在n 个元素中求前k 个最大⎪⎩⎪⎨⎧>+-==33)2(3321n n C n n ∑-=+1i)-(n *1)/2)(n *i)/(n-(n n i 312+n元素,在堆排序情况下比较次数最多不超过4n+2klog2n。
稳定分类是指,若排序序列中存在两个关键字值相同的记录Ri与Rj(Ki=Kj,i≠j)且Ri 领先于Rj,若排序后Ri与Rj的相对次序保持不变,则称这类分类是稳定分类(排序),否则为不稳定分类。