数据结构第十章-排序.ppt
《数据结构第十章-排序.ppt》由会员分享,可在线阅读,更多相关《数据结构第十章-排序.ppt(88页珍藏版)》请在三一办公上搜索。
1、,华中科技大学计算机学院,数据结构,第十章 内部排序10.1 概述1.排序-将文件或表中的记录,通过某种方法整理成按关 键字大小次序排列的处理过程。假定n个记录的文件为(R1,R2,.,Rn)对应的关键字为(K1,K2,.,Kn)则排序是确定如下一个排列 p1,p2,.,pn 使得:Kp1Kp2.Kpn 从而得到一个有序文件(Rp1,Rp2,.Rpn),学生成绩表,12345,学 号 姓 名 数学 外语,学 号 姓 名 数学 外语,12345,学 号 姓 名 数学 外语,学 号 姓 名 数学 外语 总分,12345,12345,(a)无序表,(b)按学号排列的有序表,(c)按数学成绩排列的有序
2、表,(d)按总分成绩排列的有序表,2.什么是排序的稳定性 假设在待排序的文件中,存在两个具有相同关键字的记录R(i)与R(j),其中R(i)位于R(j)之前。在用某种排序法排序之后,R(i)仍位于R(j)之前,则称这种排序方法是稳定的;否则,称这种排序方法是不稳定的。例 数列(10,25,22,42,25,30,18)(10,18,22,25,25,30,42)(10,25,22,42,25,30,18)(10,18,22,25,25,30,42),稳定的排序,不稳定的排序,12345,学 号 姓 名 数学 外语,学 号 姓 名 数学 外语,12345,(e)按数学成绩排列的有序表,不稳定的排
3、序,3.内部排序(内排序)-指待排序文件不大,一次可以在内存中完成的排序。即在排序进行的过程中不使用计算机外部存储器的排序过程。排序速度快。外部排序(外排序)-指待排序文件较大,文件存放在外存上,不能一次调入内存的排序。即在排序进行的过程中需要对外存进行访问的排序过程。排序速度慢。本章主要讨论各种内部排序的方法。,4.待排序的记录和顺序表(文件)的数据类型#define MAXSIZE 20/最大长度 typedef int KeyType;/关键字类型 typedef struct/记录类型 KeyType key;/关键字 InfoType otherinfo;/其它数据类型 RecTyp
4、e;/记录类型名typedef struct RecType rMAXSIZE+1;/r0用作监视哨 int length;/实际表长 SeqList;/记录表类型或 表和表长分别定义和说明 RecType rMAXSIZE+1;/r0用作监视哨 int length;/实际表长,5.排序算法分析(1)时间复杂度对n个记录排序,所需比较关键字的次数;最好情况;最坏情况;平均情况对n个记录排序,所需移动记录的次数;最好情况;最坏情况;平均情况(2)空间复杂度 排序过程中,除文件中的记录所占的空间外,所需的辅助存储空间的大小。,6.内排序方法(1)对顺序表的排序插入排序:直接插入排序;折半插入排序
5、;2-路插入排序;表插入排序;希尔(Shell)排序;交换排序:冒泡排序:单向冒泡排序,双向冒泡排序 快速排序 选择排序:简单选择排序;树形选择排序;堆排序,归并排序 2-路归并排序 k-路归并排序基数排序 多关键字排序 最高位优先法 最低位优先法 链式基数排序(2)对单链表的排序 直接插入,简单选择,冒泡排序,基数排序,Donald Ervin Knuth 高德纳(1938-)斯坦福大学教授1974年图灵奖得主,计算机程序设计的艺术 The Art of Computer Programming 第一卷:基本算法 1968 第二卷:半数字化算法 1969 第三卷:排序与搜索 1973 第四卷
6、:组合算法,计算机与排版TEX排版软件,超现实数,具体数学,作文式程序设计,10.2 插入排序算法基本思想 将待排序的记录插入到已排序的子文件中去,使得插入之后得到的子文件仍然是有序子文件。插入一个记录,首先要对有序子文件进行查找,以确定这个记录的插入位置。按查找方式的不同,插入排序又可以分为线性插入排序和折半插入排序,前者使用顺序查找,后者使用折半查找。,1.直接插入排序(线性插入排序)设待排序的文件为:(r1,r2,.,rn)关键字为:(r1.key,r2.key,.,rn.key)首先,将初始文件中的记录r1看作有序子文件;第1遍:将r2插入有序子文件中,若:r2.keyr1.key,则
7、r2插在r1之前;否则,插在r1的后面。第2遍:将记录r3插入前面已有2个记录的有序子文件中,得到3个记录的有序子文件。以此类推,依次插入r4,.,rn,最后得到n个记录的递增有序文件。,例.直接插入排序,设K0为监视哨”K0 K1 K2 K3 K4 K5 K6初始关键字:(43)21 89 15 43 28第1遍排序后:21(21 43)89 15 43 28(43后移)第2遍排序后:89(21 43 89)15 43 28(不后移)第3遍排序后:15(15 21 43 89)43 28(89,43,21后移)第4遍排序后:43(15 21 43 43 89)28(89后移)第5遍排序后:2
8、8(15 21 28 43 43 89)(89,43,43后移),21,89,15,43,28,直接插入排序算法void InsertSort(RecType r,int n)/对数组r1.n中的n个记录作插入排序 int i,j;for(i=2;i=n;i+)r0=ri;/待插记录ri存入监视哨中 j=i-1;/以排序的范围1 i-1/从ri-1开始向左扫描 while(r0.keyrj.key)rj+1=rj;/记录后移 j-;/继续向左扫描 rj+1=r0;/插入记录r0,即原ri,直接插入排序算法分析:(1)最好情况,原n个记录递增有序:比较关键字n-1次 移动记录2(n-1)次,(将
9、数据复制到r0后又复制回来),(2)最坏情况,原n个记录递减有序:比较关键字的次数:n i=2+3+.+n=(n-1)(n+2)/2=O(n2)i=2 移动记录的次数(个数):n(i-1+2)=3+4+.+(n+1)i=2=(n-1)(n+4)/2 次=O(n2),(3)平均比较关键字的次数约为:n n i+1(1+2+i)/i=-=(3+4+.+(n+1)/2 i=2 i=2 2=(n-1)(n+4)/4=O(n2)平均移动记录的次数约为:n n(i+3)(0+2)+(1+2)+(i-1+2)/i=-=(5+6+.+(n+3)/2i=2 i=2 2=(n-1)(n+8)/2=O(n2)故,时
10、间复杂度为O(n2)。(4)只需少量中间变量作为辅助空间。O(1)(5)算法是稳定的。,2.折半插入排序(二分插入排序)(a)由于插入排序的基本思想是在一个有序序列中插入一个新的记录,因此可以利用“折半查找”查询插入位置,由此得到的插入排序算法为“折半插入排序”,又被称为二分法插入排序。(b)直接插入排序的算法简单易行,对长度(n)很大的记录序列宜采用性能更好的插入排序算法。(c)折半插入排序过程中的折半查找的目的是查询插入点,因此不论是否存在和给定值相同的关键字,结束查找过程的条件都是highlow,并且插入位置为low指示的地方。,折半插入排序实例在序列1 14 19 23 55 84 9
11、2已排好序的基础上,将元素15插入到序列中,最后还是一个有序序列。,折半插入排序算法void BInsertSort(SqList/插入/for/BInsertSort,3.希尔(shell)排序(缩小增量排序)(a)是插入排序中效率最高的一种排序方法。又称“缩小增量排序”,是由在1959年提出来的。(b)基本思想是,先对待排序列进行“宏观调整”,待序列中的记录“基本有序”时再进行直接插入排序。注:所谓“基本有序”是指,在序列中的各个关键字之前,只存在少量关键字比它大的记录。(c)做法是:先取定一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组,所有距离为d1的倍数的记录放在同一
12、个组中,在各组内进行直接插入排序;然后,到第二个增量d2d1重复上述分组和排序,直至所取的增量dt=1(dtdt-1d2d1),即所有记录放在同一组中进行直接插入排序为止。,希尔排序的复杂度空间复杂度:只占一个暂存单元(r0)即S(n)=O(1);时间复杂度:希尔排序的时间复杂度和所取增量序列相关,例如已有学者证明,当增量序列为 2t-k+1-1(k=0,1,,t)时(t为排序趟数),希尔排序的时间复杂度为O(n3/2),还有人在大量的实验基础上推出:当N在某特定范围内,希尔排序所需的比较和移动次数约为n1.3,当n时,一般认为是O(n(log2n)2)。注:希尔排序是一个不稳定的排序方法。,
13、10.3 交换排序10.3.1 冒泡排序基本思想:设待排序的文件为r1.n第1趟(遍):从r1开始,依次比较两个相邻记录的关键字ri.key和ri+1.key,若ri.keyri+1.key,则交换记录ri和ri+1的位置;否则,不交换。(i=1,2,.n-1)第1趟之后,n个关键字中最大的记录移到了rn的位置上。第2趟:从r1开始,依次比较两个相邻记录的关键字ri.key和ri+1.key,若ri.keyri+1.key,则交换记录ri和ri+1的位置;否则,不交换。(i=1,2,.n-2)第2趟之后,前n-1个关键字中最大的记录移到了rn-1的位置上。.作完n-1趟,或者不需再交换记录时为
14、止。,例:第1趟 第2趟 第3趟 第4趟 k1=43 21 21 21 21 21 21 21 21 15 15 15k2=21 43 43 43 43 43 43 15 15 21 21 21k3=89 89 89 15 15 15 15 28 28 28 28 28 k4=15 15 15 89 28 28 28 43 43 43 43 43k5=28 28 28 28 89 43 43 43 43 43 43 43k6=43 43 43 43 43 89 89 89 89 89 89 89 比较次数=543214 交换记录的次数=4+2+1=7,移动记录次数=3*7=21,冒泡排序算法(
15、对n个整数按递增次序作冒泡排序)void bubble1(int a,int n)int i,j,temp;for(i=0;iaj+1)temp=aj;/交换记录 aj=aj+1;aj+1=temp;for(i=0;in;i+)printf(%d,ai);/输出排序后的元素,改进的冒泡排序算法void bubblesort(RecType r,int n)int i,j,swap;RecType temp;j=1;/置比较的趟数为1 do swap=0;/置交换标志为0 for(i=1;iri+1.key)temp=ri;/交换记录 ri=ri+1;ri+1=temp;swap=1;/置交换标
16、志为1 j+;/作下一趟排序 while(jn&swap);,算法分析:最好情况:待排序的文件已是有序文件,只需要进行1趟 排序,共计比较关键字的次数为 n1 不交换记录。最坏情况:要经过n-1趟排序,所需总的比较关键字的次 数为(n-1)+(n-2)+.+1n(n-1)/2 交换记录的次数最多为(n-1)+(n-2)+.+1n(n-1)/2 移动记录次数最多为 3n(n-1)/2。只需要少量中间变量作为辅助空间。O(1)算法是稳定的。,10.3.2 快速排序 基本思想:首先在r1.n中,确定一个ri,经过比较和移动,将ri放到中间某个位置上,使得ri左边所有记录的关键字小于等于ri.key,
17、ri右边所有记录的关键字大于等于ri.key。以ri为界,将文件划分为左、右两个子文件。用同样的方法分别对这两个子文件进行划分,得到4个更小的子文件。继续进行下去,使得每个子文件只有一个记录为止,便得到原文件的有序文件。,例.给定文件(20,05,37,08,63,12,59,15,44,08),选用第1个元素20进行划分:,x,i,j,x,j,i,x,i,j,x,i,j,x,i,j,i,i,j,j,x,i,j,x,i,j,x,i,j,x,i,j,左子文件,右子文件,i,i,j,j,i,void quksort(RecType r,int low,int high)RecType x;int
18、i,j;if(low=x.key)j-;/j从右向左端扫描通过key不小于x.key的元素 if(ij)/i,j未相遇 ri=rj;i+;/此时j指示位置可用 while(ij&ri.key=x.key)i+;/i从左向右端扫描通过key不大于x.key的元素 if(ij)rj=ri;j-;while(i!=j);/i,j未相遇,/划分结束,i经过的是key不大于x.key的元素;j经过的是key不小于x.key的元素。i,j至少有一个指示的位置可用 ri=x;quksort(r,low,i-1);/递归处理左子文件 quksort(r,i+1,high);/递归处理右子文件 对文件r1.n快
19、速排序:void quicksort(RecType r,int n)quksort(r,1,n);,算法分析就平均速度而言,快速排序是已知内部排序方法中最好的一种排序方法,其时间复杂度为O(nlog2n)。但是,在最坏情况下(基本有序时),快速排序所需的比较次数和冒泡排序的比较次数相同,其时间复杂度为O(n2)。快速排序需要一个栈空间来实现递归。若每次划分均能将文件均匀分割为两部分,则栈的最大深度为log2n+1,所需栈空间为O(log2n),即空间复杂度 S(n)=O(log2n)快速排序是不稳定的。,练习:用快速排序法描述出下面序列的排序过程:关键字序列:(52,49,80,36,14,
20、75,58,97,23,61),经第1趟快速排序之后为:(23,49,14,36)52(75,58,97,80,61)经第2趟快速排序之后为:(14)23(49,36)52(61,58)75(80,97)经第3趟快速排序之后为:(14,23,36,49,52,58,61,75,80,97),思考:试对以下序列(90,45,39,54,68,87,76)进行快速排序,是否发现什么特殊情况?由于枢轴记录的关键字“90”大于其它所有记录的关键字,致使一次划分之后得到的子序列(1)的长度为0,由此可以想像,快速排序不适于对原本有序或基本有序的记录序列进行排序。注:为避免出现枢轴记录关键字为最大或最小的
21、情况,通常进行的快速排序采用三者取中的改进方案,即以 Rs、Rt 和 R(s+t)/2 三者中关键字介于中值者为枢轴。只要将它和 Rs 互换,一次划分的算法仍不变。,10.4 选择排序1.简单选择(选择排序)算法思想:设待排序的文件为(r1,r2,.,rn),关键字为(r1.key,r2.key,.,rn.key),第1趟(遍):在(r1,r2,.,rn)中,选出关键字最小 的记录rmin.key,若min1,则交换r1和rmin;需要进行n-1次比较。第2趟(遍):在n-1个记录(r2,.,rn)中,选出关键字 最小的记录rmin.key,若min2,则交换r2和rmin;需要进行n-2次比
22、较。.第n-1趟(遍):在最后的2个记录记录(rn-1,rn)中,选 出关键字最小的记录rmin.key,若minn-1,则交换rn-1 和rmin;需要进行1次比较。,例:k1 k2 k3 k4 k5 k6 初始关键字:(43 89 21 43 28 15)第1遍排序后:15(89 21 43 28 43)第2遍排序后:15 21(89 43 28 43)第3遍排序后:15 21 28(43 89 43)第4遍排序后:15 21 28 43(89 43)第5遍排序后:15 21 28 43 43 89,简单选择排序算法:(对数组r1.n中的记录作简单选择排序)void SelectSort(
23、RecType r,int n)int i,j,min;RecType x;/交换记录的中间变量 for(i=1;in;i+)/共n-1趟(遍)min=i;/ri为最小记录rmin for(j=i+1;j=n;j+)if(rj.keyrmin.key)min=j;/修改min if(min!=i)/若rmin不是ri x=rmin;/交换rmin和ri rmin=ri;ri=x;,算法分析:(1)比较次数,在任何情况下,均为 n-1(ni)(n-1)+(n-2)+.+1 i=1 n(n-1)/2 O(n2)(2)交换记录的次数 在最好情况下,原n个记录递增有序:不移动记录。在最坏情况下,每次都
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 第十 排序
链接地址:https://www.31ppt.com/p-6296882.html