[经济学]第10章 内部排序

合集下载

第十章排序答案

第十章排序答案

第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,10B. 75,65,45,10,30,25,20,15C. 75,45,65,30,15,25,20,10D. 75,45,65,10,25,30,20,159.从未排序序列中依次取出一个元素与已排序序列中的元素依次进行比较,然后将其放在已排序序列的合适位置,该排序方法称为( A )排序法。

第10章-内部排序PPT课件

第10章-内部排序PPT课件
L.r[j+1]=L.r[j]; //将j……i-1的记录后移一格 L.r[j+1]=L.r[0]; } //将Ri插入到位置j+1 }
-
算法效率
时间复杂度
待排序记录按关键字从小到大排列(正序)
n
比较次数: 1 n 1 i2
移动次数: 0
待排序记录按关键字从大到小排列(逆序)
比较次数:
n i (n2)(n1)
i2
2
移动次数:
n
(n4)(n1)
(i1)
i2
2
待排序记录随机,取平均值
比较次数: n 2
4
移动次数: n 2
4
总的时间复杂度:T(n)=O(n2)
空间复杂度:S(n)=O(1)
-
3. 折半插入排序
排序过程:用折半查找方法确定插入位置。 举例:
i=1: (38) (49) 38 65 97 76 13 27 49
5 R’={5}
R={10,2}
2 R’={2,5}
R={2}
10 R’={2,5,10}
R={ }
2 R’={2,2,5,10}
-
2. 直接插入排序
排序过程:整个排序过程为n-1趟插入
将序列中第1个记录看成是一个有序子序列 从第2个记录开始,逐个进行插入,直至整个序列有序
R1 R2 …… Rn
内部排序适用于记录个数不很多的小文件; 外部排序则适用于记录个数太多,不能一次 将其全部放入内存的大文件
排序依据策略
插入排序:直接插入排序, 折半插入排序, 希尔排序 交换排序:冒泡排序, 快速排序 选择排序:简单选择排序, 堆排序 归并排序:2-路归并排序 基数排序

排序2

排序2

排序过程中的基本操作: 排序过程中的基本操作:
比较两个关键字的大小; ① 比较两个关键字的大小;
将记录从一个位置移动至另一个位置。 ② 将记录从一个位置移动至另一个位置。
待排序记录的存储方式: 待排序记录的存储方式:
① 待排序的一组记录存放在地址连续的一组存储单元上;√ 待排序的一组记录存放在地址连续的一组存储单元上;
直接插入排序( Sort): ):将一个记录插入到已排 1. 直接插入排序(Straight Insertion Sort):将一个记录插入到已排
好序的有序表中,从而得到一个新的、记录数增1的有序表。 好序的有序表中,从而得到一个新的、记录数增1的有序表。
例如:36、24、10、 例如:36、24、10、6、12存放在r数组的下标为1至5的元素之中,用直接 12存放在r数组的下标为1 存放在 的元素之中,
36 10 10
24 24
10 i 36
6
12
直接插入排序( Sort): ):将一个记录插入到已排 1. 直接插入排序(Straight Insertion Sort):将一个记录插入到已排
好序的有序表中,从而得到一个新的、记录数增1的有序表。 好序的有序表中,从而得到一个新的、记录数增1的有序表。
插入法将其排序,结果仍保存在下标为1 插入法将其排序,结果仍保存在下标为1至5的元素之中。 的元素之中。 0 r数组: 数组: 数组 哨兵 1 2 3 4 5
36 10
24 24
10 i 36
6
12
直接插入排序( Sort): ):将一个记录插入到已排 1. 直接插入排序(Straight Insertion Sort):将一个记录插入到已排
插入法将其排序,结果仍保存在下标为1 插入法将其排序,结果仍保存在下标为1至5的元素之中。 的元素之中。 0 r数组: 数组: 数组 哨兵 1 2 3 4 5

数据结构 排序

数据结构 排序
选择排序种类: 简单选择排序 树形选择排序 堆排序
2019/9/7
30
10.4.1 简单选择排序
待排记录序列的状态为:
有序序列R[1..i-1] 无序序列 R[i..n]
有序序列中所有记录的关键字均小于无序序列中记 录的关键字,第i趟简单选择排序是从无序序列 R[i..n]的n-i+1记录中选出关键字最小的记录加入 有序序列
2019/9/7
5
排序的类型定义
#define MAXSIZE 20 // 待排序记录的个数
typedef int KeyType;
typedef struct
{ KeyType key;
InfoType otherinfo; ∥记录其它数据域
} RecType;
typedef struct {
RecType r[MAXSIZE+1];
分别进行快速排序:[17] 28 [33] 结束 结束
[51 62] 87 [96] 51 [62] 结束
结束
快速排序后的序列: 17 28 33 51 51 62 87 96
2019/9/7
26
自测题 4 快速排序示例
对下列一组关键字 (46,58,15,45,90,18,10,62) 试写出快速排序的每一趟的排序结果

final↑ ↑first
i=8
[51 51 62 87 96 17 28 33]

final↑ ↑first
2019/9/7
14
希尔(shell )排序
基本思想:从“减小n”和“基本有序”两 方面改进。
将待排序的记录划分成几组,从而减少参 与直接插入排序的数据量,当经过几次分 组排序后,记录的排列已经基本有序,这 个时候再对所有的记录实施直接插入排序。

FORTRAN95第十章 排序、查找算法

FORTRAN95第十章  排序、查找算法
要求线性表中的所有元素按照关键字有序(递增或递减)排列。 假设线性表中元素按关键字递增排列,那么二分查找方法是:将
给定值与处于顺序表“中间位置”上的元素的关键字进行比较键字则在表的后半部分继续进行二 分查找。否则在表的前半部分继续进行二分查找, 如此进行下去直 至找到满足条件的元素,或当前查找区为空。
10.1.4 直接插入排序 直接插入排序的方法是将待排记录分成两部分,初始第
一部分只含1个记录,在排序进程中把第二部分的全部记 录逐步插入到第一部分,并使该部分每次插入记录后是有 序的。直接插入排序算法步骤:
(1)将n个待排的记录数据存一维数组A中,默认A(1)为第 一部分的记录,2=>I;
(2)若I<=n, 则第二部分的一个记录A(I)与第一部分记 录进行比较, 找出在第一部分插入这个记录的位置,然后 将该位置上原来的记录及其后面所有的记录顺序后移一 个位置,在空出的位置上插入这个记录;若I>n (表示把 第二部分的记录全部插入到第一部分) ,则结束排序;
10.1.2 冒泡排序 冒泡排序是通过相邻两个排序记录的关键字的比
较,按一定次序互换逐步实现有序排序。 冒泡排序的实现过程是:第一次冒泡排序,首先将第
一个记录的关键字和第二个记录的关键字进行比较, 若不满足顺序的要求,则将两个记录进行交换,然
后比较第二个记录和第三个记录的关键字并做同样
处理,依次类推,直至对第n-1个记录和第n个记录 进行比较并处理完, 使得关键字值最大的记录被交换 到了最后一个记录的位置上。第二次冒泡排序只需
integer::low,high,key,ix,mid integer,dimension(low:high):: a do while(low<=high)

数据结构第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. 冒泡

数据结构1800试题-第10章 排序 - 答案

数据结构1800试题-第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)/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.最好每次划分能得到两个长度相等的子文件。

数据结构习题课(2012)

数据结构习题课(2012)

数据结构习题课(2012)复习重点1.数据结构的概念,逻辑结构、物理结构的概念及各⾃包含的内容2.算法的特性、设计要求,如何度量算法的时间效率。

3.线性表的顺序/链式存储结构的特点,插⼊、删除算法。

4.栈和队列的逻辑特性,顺序栈的⼊栈/出栈、循环队列的⼊队/出队算法。

5.以三元组顺序表存放的稀疏矩阵的转置算法。

6.⼆叉树的性质及其四种遍历算法。

7.森林与⼆叉树的相互转换。

8.WPL、前缀编码的概念,哈夫曼树的构造算法。

9.图的相关概念,邻接矩阵及邻接表的存储结构。

10.图的深度优先/⼴度优先遍历算法。

11.最⼩⽣成树的两种算法。

12.拓扑排序的意义和算法。

13.最短路径算法。

14.顺序表、有序表的查找算法。

15.⼆叉排序树的性质、插⼊/删除算法、平衡⼆叉树的性质、插⼊算法。

16.哈希表的相关概念,常⽤的冲突处理⽅法。

17.直接插⼊排序、希尔排序、快速排序、堆排序、归并排序的算法。

注意:1.上述每个知识点可能会以任何题型出现,复习的时候别把它们当做“简答题”来复习。

2.红⾊(下划线)标识的知识点或算法,只要求对给出的初始数据,能画出结果则可。

其他的算法则可能会出现在“算法题”中。

⾃测题第1章绪论⼀、判断1.顺序存储⽅式只能⽤于存储线性结构。

(错)2.顺序查找法适⽤于存储结构为顺序或链式存储的线性表。

(对)⼆、选择1.计算机算法必须具备输⼊、输出、( B )等5个特性。

A.可⾏性、可移植性和可扩展性B.可⾏性、确定性和有穷性C.确定性、有穷性和稳定性D.易读性、安全性和稳定性2.算法在发⽣⾮法操作时可以作出处理的特性称为(C )。

A.正确性B.易读性C.健壮性D.可靠性3.数据结构是⼀门研究⾮数值计算的程序设计问题中计算机的(A )以及它们之间的( B )和运算的学科。

A.操作对象B.计算⽅法C.逻辑存储D.数据映像A.结构B.关系C.运算D.算法4.在数据结构中,逻辑上数据结构可分为:(B )A.动态结构和静态结构B.线性结构和⾮线性结构C.紧凑结构和⾮紧凑结构D.内部结构和外部结构5.数据结构主要研究数据的(D )A.逻辑结构B.存储结构C.逻辑结构和存储结构D.逻辑结构和存储结构及其运算的实现6.为了描述n个⼈之间的同学关系,可⽤(C )结构表⽰A.线性表B.树C.图D.队列7.下⾯的程序段违反了算法的(A )原则void sam(){ int n=2;while (!odd(n)) n+=2;printf(n);}A.有穷性B.确定性C.可⾏性D.健壮性三、问答1.什么是逻辑结构和物理结构?各⾃包含哪⼏种?2.线性结构和树型结构的特点分别是什么?3.简述顺序存储结构与链式存储结构在表⽰数据元素之间关系上的只要区别。

10排序1

10排序1

1,排序所需的时间开销 排序所需的时间开销 主要是指执行排序时对关键字 比较次数和记录的移动次数. 和记录的移动次数 的比较次数和记录的移动次数. 2,排序所需的附加空间的开销 排序所需的附加空间的开销 附加空间
10.2 插入排序
插入排序总的基本思想: 插入排序总的基本思想:
每次将一个待排序的记录, 每次将一个待排序的记录, 按其关键字大小插入到一个已经排 好序(不减次序或不增次序) 好序(不减次序或不增次序)的文 件中适当的位置, 件中适当的位置,直到全部记录插 入完毕为止. 入完毕为止.
K i= K j, i > j
稳定排序: 稳定排序: 不稳定排序: 不稳定排序:
排序后
R i 领先R 领先R R j 领先R 领先R
j i
排序后具有相同关键字的记 录之间的相对次序 相对次序保持不变 录之间的相对次序保持不变
5,排序的分类
内部排序: 1. 内部排序:
排序中,文件只在内存中进行的排序. 排序中,文件只在内存中进行的排序. 2,外部排序: 外部排序: 排序中,文件不单要使用内存, 排序中,文件不单要使用内存, 而且使用外存的排序. 而且使用外存的排序.
10.2.1
直接插入排序
例如: 例如:已知一个无序文件记录的关键字序列 49,38,65,97,76,13,27, 为:49,38,65,97,76,13,27,49
以直接插入排序方法进行不减次序排序的过程为: 以直接插入排序方法进行不减次序排序的过程为: 不减次序排序的过程为 49,38,65,97,76,13,27,49 , , , , , , ,
27 27 27 27 27 97 97 76
49 49 49 49 49 49 49 97

内部排序习题

内部排序习题

第10章内部排序【例10-1】已知关键字序列(12,77,21,65,38,7,38,53),给出采用直接插入排序方法按关键字递增序排列时的每一趟结果。

解:初始1趟2趟3趟4趟5趟6趟7趟(表示有序区)【例10-2】待排序列为(39,80,76,41,13,29,50,78,30,11,100,7,41,86),步长因子分别取5、3、1,给出采用希尔排序方法按关键字递增序排列时的每一趟结果。

解:排序过程如下:p=539 80 76 41 13 29 50 78 30 11 100 7 41 86子序列分别为{39,29,100},{80,50,7},{76,78,41},{41,30,86},{13,11}。

第一趟排序结果:p=3 29 7 41 30 11 39 50 76 41 13 100 80 78 86子序列分别为{29,30,50,13,78},{7,11,76,100,86},{41,39,41,80}。

第二趟排序结果:p=1 13 7 39 29 11 41 30 76 41 50 86 80 78 100此时,序列基本“有序”,对其进行直接插入排序,得到最终结果:7 11 13 29 30 39 41 41 50 76 78 80 86 100【例10-3】已知序列(17,18,60,40,7,32,73,65,85),请给出采用冒泡排序法对该序列作升序排序时的每一趟的结果。

解:初始1趟2趟3趟4趟5趟17 17 17 17 7 718 18 18 7 17 1760 40 7 18 18 1840 7 32 32 32 327 32 40 40 40 4032 60 60 60 60 6073 65 65 65 65 6565 73 73 73 73 7385 85 85 85 85 85(表示有序区)【例10-4】已知关键字序列(38,12,21,77,65,7,38,53)给出采用快速排序方法按关键字增序排序时的第一趟快排过程,并举出一个反例说明快速排序是不稳定排序。

数结_9排序

数结_9排序

对每个子表分别进行直接插入排序
由于n2>n12+n22+…+nk2
( n=n1+n2+…+nk )
所以对每个子表排序所耗费的时间之和要小于对整 个区间排序所耗费的时间
通过对子表小范围的排序,将排序区间调整成基本有 序的序列; 不断减少子表的个数(即扩大子表的长度), 直至子表 的个数为1, 完成整个排序操作.
R
0
15 58 46 45 90 08 32
1 2 3 4 5 6 7
第二趟后:
R
0
15 46 58 45 90 08 32
1 2 3 4 5 6 7
i=3
第二趟,i=3;
46<58,46赋给监视哨; 有序区中所有大于46的记录右移一位 将46放入腾出的空位
初态:
R
0
58 15 46 45 90 08 32
1 2 3 4 5 6 i=6 7
第五趟,i=6;
初态:
R
0
58 15 46 45 90 08 32
1 2 3 4 5 6 7
第一趟后: 第二趟后: 第三趟后: 第四趟后: 第五趟后: 第六趟后:
R
0
15 58 46 45 90 08 32
1 2 3 4 5 6 7
R
0
15 46 58 45 90 08 32
1 2 3 4 5 6 7
第一趟后:
R
0
15 58 46 45 90 08 32
1 2 i=2 3 4 5 6 7
第一趟,i=2;
15<58,15赋给监视哨;
有序区中所有大于15的记录右移一位 将15放入腾出的空位

第10章排序答案

第10章排序答案

第10章排序习题答案一、填空题1. 大多数排序算法都有两个基本的操作:比较(两个关键字的大小)和移动(记录或改变指向记录的指针)。

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

(可约定为,从后向前比较)3. 在插入和选择排序中,若初始数据基本正序,则选用插入排序(到尾部);若初始数据基本反序,则选用选择排序。

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

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

DS10_排序01_概述和插入排序

DS10_排序01_概述和插入排序

排序
先迚排序方法,其时间复杂度为O(nlogn)
基数排序,其时间复杂度为O(d·n)
内排序的分类

按排序过程中依据的原则分
揑入类(直揑排序、二分排序、希尔排序) 交换类(冒泡排序、快速排序) 排序
选择类(直选排序、树型排序、堆排序)
归并类(二路归并排序、多路归并排序) 分配类(多关键字排序、基数排序)
3)折半插入排序性能分析

折半揑入排序减少了关键字的比较次数,但记彔的移动次数丌变,其 时间复杂度不直接揑入排序相同。

折半揑入排序是“稳定的”
3. 2-路插入排序
1)基本思想 2-路揑入排序是在折半揑入排序的基础上改迚的,目的是减少排序过 程中移动记彔的次数,但为此需要n个记彔的辅助空间。
2)具体做法
2)折半插入排序算法
void BinsertSort(SqList &L){ int i,low,high,mid; for(i=2; i<= L.length; ++i) { L.r[0]=L.r[i]; low=1; high=i-1; While(low<=high) { mid=(low+high)/2; if (L.r[0].key< L.r[mid].key) high=mid-1; else low=mid+1; } for( j=i-1; j>=low; j ) L.r[j+1]=L.r[j]; L.r[low]=L.r[0]; } }
另设一个和 L.r 同类型的数组d,首先将 L.r[1] 赋值给 d[1] ,并将 d[1] 看成是在排好序的序列中处于中间位置的记彔,然后从 L.r 中第 2 个记彔起依次揑入到d[1] 之前或之后的有序序列中。先将待揑入记彔的 关键字和 d[1] 的关键字迚行比较。 若 L.r[i]<d[1].key,则将 L.r[i] 揑入到 d[1] 之前的有序表中。反之, 揑入到 d[1] 之后的有序表中。

数据结构第十章 排序

数据结构第十章 排序
7
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].
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
} RcdType;
// 关键字项 // 其它数据项
// 记录类型
typedef struct {
RcdType r[MAXSIZE+1];
int
length;
} SqList;
// r[0]闲置 // 顺序表长度 // 顺序表类型
7
9.1 概述 效率分析
第9章 内部排序
(1) 时间复杂度: 关键字的比较次数和记录移动次数。
9.1 概述 9.2 插入排序 9.3 快速排序 9.4 选择排序 9.5 归并排序 9.6 基数排序 9.7 内部排序方法的比较
1
第9章 内部排序
本章重点难点
重点:插入排序、快速排序、选择排序、堆排序、
归并排序、基数排序的思想和算法。
难点:堆排序的思想和算法,在实际应用中如
何根据实际情况,选择最优的排序算法。
整个排序过程需要进行比较、后移记录、 插入适当位置。从第二个记录到第n个记录共 需n-1趟。
12
9.2.1 直接插入排序 直接插入排序示例演示
第9章 内部排序
49 38 65 38. 76 13 27 49
38 49 38 65 38. 76 13 27 49
38
49 65 38. 76 13 27 49
for ( j=i-1; j>=high+1; --j )
9.2.2 其它插入排序
第9章 内部排序
折半插入排序算法
void BiInsertionSort ( SqList &L )
{
for ( i=2; i<=L.length; ++i ) {
L.r[0] = L.r[i];
// 将 L.r[i] 暂存到 L.r[0]
在 L.r[1..i-1]中折半查找插入位置;
b.空间复杂度
O(1)。
15
9.2.2 其它插入排序 折半插入排序思想
第9章 内部排序
(1)在直接插入排序中,r[1..i-1] 是一个 按关键字有序的有序序列;
(2)可以利用折半查找实现“在r[1..i-1] 中查找r[i]的插入位置”;
(3)称这种排序为折半插入排序。
16
9.2.2 其它插入排序
第9章 内部排序
折半插入排序的演示过程
0 1 2 3 4 5 6 7 8 9 10
查22 05 13 19 21 37 56 64 75 80 88 90
low
mid= (low+high)/2 high
mid high=mid-1
low=mid+1 mid
low=mid+1
high=mid-1
17
2
9.1 概述 9.2 插入排序 9.3 快速排序 9.4 选择排序 9.5 归并排序 9.6 基数排序 9.7 内部排序方法的比较
3
9.1 概述 排序方法的稳定和不稳定
第9章 内部排序
当需要排序的关键字都不相同时,排序的结 果是唯一的;
张三 80分 李四 75分 王五 85分 陈六 90分
李四 75分 张三 80分 王五 85分 陈六 90分
(2) 空间复杂度: 执行算法所需的附加存储空间。
(3) 稳定算法和不稳定算法
8
9.1 概述 9.2 插入排序 9.3 快速排序 9.4 选择排序 9.5 归并排序 9.6 基数排序 9.7 内部排序方法的比较
9
第9章插入排序 9.2.2 其他插入排序 //自学 9.2.3 希尔排序
L.r[j+1] = L.r[0]; // 插入到正确位置
}
} // InsertSort
14
9.2.1 直接插入排序
第9章 内部排序
算法分析
(1)稳定性
直接插入排序是稳定的排序方法。
(2)算法效率 a.时间复杂度
最好情况:比较O(n),移动O(1); 最坏情况:比较O(n2),移动O(n2); 平均O(n2)
在排序前后,含相等关键字的记录的相对位 置保持不变,称这种排序方法是稳定的;
反之,含相等关键字的记录的相对位置有可 能改变,称这种排序方法是不稳定的。
5
9.1 概述 内部排序和外部排序
第9章 内部排序
在排序过程中,只使用计算机的内存存放待 排序记录,称这种排序为内部排序。
排序期间文件的全部记录不能同时存放在计 算机的内存中,要借助计算机的外存才能完成排 序,称之为“外部排序”。
10
9.2.1 直接插入排序 插入排序的思想
第9章 内部排序
(1)一个记录是有序的; (2)从第二个记录开始,将每个记录插入 到已排好序的序列中; (3)一直进行到第n个记录。
11
9.2.1 直接插入排序 算法概述
第9章 内部排序
(1)将序列中的第1个记录看成是一个有序 的子序列;
(2)从第2个记录起逐个进行插入,直至整 个序列变成按关键字有序序列为止;
// 对顺序表 L 作直接插入排序。
for ( i=2; i<=L.length; ++i )
if (L.r[i].key < L.r[i-1].key) {
L.r[0] = L.r[i];
// 复制为监视哨
for ( j=i-1; L.r[0].key < L.r[j].key; -- j )
L.r[j+1] = L.r[j]; // 记录后移
陈六 90分 王五 85分 张三 80分 李四 75分
4
9.1 概述
第9章 内部排序
当排序的关键字中存在相同的情况时,排 序方法不唯一;
张三 80分 李四 75分 王五 85分 陈六 80分
李四 75分 张三 80分 陈六 80分 王五 85分
李四 75分 陈六 80分 张三 80分 王五 85分
38 38 49 65 38. 76 13 27 49
38. 38 49 65 38. 76 13 27 49
38. 38
49 65 76 13 27 49
38. 38 38. 49 65 76 13 27 49
13
9.2.1 直接插入排序 直接插入排序算法
第9章 内部排序
void InsertionSort ( SqList &L ) {
内外存之间的数据交换次数就成为影响外部 排序速度的主要因素。
6
9.1 概述 存储结构
第9章 内部排序
#define MAXSIZE 1000 // 待排顺序表最大长度 typedef int KeyType; // 关键字类型为整数类型
typedef struct { KeyType key; InfoType otherinfo;
相关文档
最新文档