收藏 分享(赏)

数据结构 排序 查找 PPT.ppt

上传人:tkhy51908 文档编号:9013015 上传时间:2019-07-20 格式:PPT 页数:37 大小:347.50KB
下载 相关 举报
数据结构 排序 查找 PPT.ppt_第1页
第1页 / 共37页
数据结构 排序 查找 PPT.ppt_第2页
第2页 / 共37页
数据结构 排序 查找 PPT.ppt_第3页
第3页 / 共37页
数据结构 排序 查找 PPT.ppt_第4页
第4页 / 共37页
数据结构 排序 查找 PPT.ppt_第5页
第5页 / 共37页
点击查看更多>>
资源描述

1、,2005 - 2-1,华中科技大学 计算机学院(12),数据结构,10.4 归并排序基本思想把k(k2)个有序子文件合并在一起,形成一个新的有序 文件。同时归并k个有序子文件的排序过程称为k-路归并排序。2-路归并排序-归并2个有序子文件的排序。例. 将有序文件A和B归并为有序文件C。A(2,10,15,18,21,30)B(5,20,35,40)按从小至大的次序从A或B中依次取出2,5,10,15,.,40, 顺序归并到C中,得:C(2,5,10,15,18,20,21,30,35,40),一般地,2-路归并过程为:假定文件rlowhigh中的相邻子文件(子表) (rlow,rlow+1,

2、.,rmid)和(rmid+1,.,rhigh) 为有序子文件,其中:lowmidhigh 。将这两个相邻有序子文件归并为有序文件ylowhigh,即:(ylow,ylow+1,.,yhigh),r916,9 10 11 12 13 14 15 16,y916,9 10 11 12 13 14 15 16,2-路归并,有序文件(表),i,j,k,例,有序 子表,有序 子表,将两个有序子文件归并为有一个有序文件的算法 void merge(r,y,low,mid,high)RecType r,y;int low,mid,high; int k=i=low,j=mid+1;while (i=mid

3、 & j=high) if (ri.key=rj.key) yk=ri;i+;/归并前一个子文件的记录else yk=rj;j+; /归并后一个子文件的记录k+;while (j=high) /归并后一个子文件余下的记录 yk=rj; j+; k+; while (i=mid) /归并前一个子文件余下的记录 yk=ri; i+; k+; / merge,2-路归并排序假定文件(r1,r2,.,rn)中记录是随机排列的,进行 2-路归并排序,首先把它划分为长度均为1的n个有序子文件, 然后对它们逐步进行2路归并排序。其步骤如下:第1趟:从r1n中的第1个和第2个有序子文件开始,调用 算法merg

4、e,每次归并两个相邻子文件,归并结果放到y1n中。 在y中形成 n/2 个长度为2的有序子文件。若n为奇数,则y中最 后一个子文件的长度为1。第2趟:把y1n看作输入文件,将 n/2 个有序子文件两 两归并,归并结果回送到r1n中,在r中形成 n/2/2个长度为4的有序子文件。若y中有奇数个子文件,则r中最后一个子文 件的长度为2。共计经过 log2n 趟归并,最后得到n个记录的有序文件。,例1. 对8个记录作2路归并排序,共进行log283 趟归并。, ,r1, ,y1, ,r1, ,y1,第1趟,第3趟,第2趟,例2. 对11个记录作2-路归并排序,进行log2114趟归并。,123456

5、789 10 11,r1,y1,r1,y1,123456789 10 11,123456789 10 11,123456789 10 11,r1,123456789 10 11,第1趟,第3趟,第2趟,第4趟,一趟归并排序算法:void mergepass(r,y,s) / s为子文件的长度RecType r,y;int s;/将r中的子文件归并到y中 int i=1;while(i+2*s-1=) /两两归并长度均为s的子文件 merge(r,y,i,i+s-1,i+2*s-1); i=i+2*s; if (i+s-1n) /最后两个子长度为s和长度不足s的文件merge(r,y,i,i+s

6、-1,n);elsewhile(i=n) /复制最后一个子文件,长度s yi=ri;i+;,调用算法mergepass,对文件r1n归并排序的算法void mergesort(RecType r,int n) RecType yn+1; int s=1; /子文件初始长度为1while (sn) mergepass(r,y,s); /将r1n归并到y1ns=2*s; /修改子文件长度mergepass(y,r,s); /将y1n归并到r1ns=2*s; /修改子文件长度算法分析 对n个记录的文件进行归并排序,共需 log2n 趟,每趟所需比较关键字的次数不超过n, 共比较O(nlog2n)次。

7、 每趟移动n个记录, 共移动O(nlog2n)个记录。 归并排序需要一个大小为n的辅助空间y1n。 归并排序是稳定的。,10.5 交换排序 10.5.1 冒泡排序基本思想: 设待排序的文件为r1n第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的位置;否则,不交

8、换。(i=1,2,.n-2)第2趟之后,前n-1个关键字中最大的记录移到了rn-1的位 置上。作完n-1趟,或者不需再交换记录时为止。,例: 第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 4

9、3 89 89 89 89 89 89 89比较次数=543214交换记录的次数=3+2+1=6,移动记录次数=3*6=18,算法分析 最好情况: 待排序的文件已是有序文件,只需要进行1趟排序,共计比较关键字的次数为n1不交换记录。 最坏情况: 要经过n-1趟排序,所需总的比较关键字的次数为 (n-1)+(n-2)+.+1n(n-1)/2 交换记录的次数最多为(n-1)+(n-2)+.+1n(n-1)/2 移动记录次数最多为3n(n-1)/2 。 只需要少量中间变量作为辅助空间。 算法是稳定的。,冒泡排序算法/ 对n个整数按递增次序作冒泡排序Void bubble1(int a,int n)

10、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; /置比较的趟数为1do swap=0; /置交换标志为0for (i=1;iri+1.key) temp=ri; /交换记录ri=ri+1;ri+1=temp;swap=1; /置交换标志为1j+; /作下一趟排序 while (jn &

11、swap); /未作完n-1趟,且标志为1,10.5.2 快速排序基本思想:首先在r1n中,确定一个ri,经过比较和 移动,将ri放到“中间“某个位置上,使得ri左边所有记录 的关键字小于等于ri.key,ri右边所有记录的关键字大于等 于ri.key。以ri为界,将文件划分为左、右两个子文件。用同样的方法分别对这两个子文件进行划分, 得到4个更小 的子文件。继续进行下去,使得每个子文件只有一个记录为止, 便得到原文件的有序文件。例. 给定文件(20,05,37,08,63,12,59,15,44,08),选 用第1个元素20进行划分:, ,x,i,j,例, ,x, ,x,i,j,i,j, ,

12、x,i,j, ,x,i,j, ,x,i,j, ,x,i,j,x,i,j,x,i,j,左子文件,右子文件,例,快速排序 void quksort(r,low,high)RecType r;int low,high; RecType x;int i,j;if (lowx.key)j-; /j向左端扫描if (ij) /i,j未相遇 ri=rj; i+;while(ij & ri.keyx.key)i+; /i向右端扫描if (ij) rj=ri;j-; while (i!=j); /i,j未相遇,ri=x; /划分结束quksort(r,low,i-1); /递归处理左子文件quksort(r,i

13、+1,high); /递归处理右子文件 对文件r1n快速排序void quicksort(RecType r,int n) quksort(r,1,n);,算法分析 就平均速度而言,快速排序是已知内部排序方法中最好 的一种排序方法,其时间复杂度为O(nlog(n)。 但是,在最坏情况下,快速排序所需的比较次数和冒泡 排序的比较次数相同,其时间复杂度为O(n2)。 快速排序需要一个栈作辅助空间,用来实现递归处理左、 右子文件。在最坏情况下,递归深度为n,因此所需栈的空间大 小为O(n)数量级。 快速排序是不稳定的。,10.6 基数排序 基数排序的一般过程:将任一关键字K看做一个d元组:K=(K1

14、,K2, ,Kd) 其中:K1是最高位, Kd是最低位K,按组成关键字关键 字的每一位的值进行排序。 排序过程(以十进制正整数为例):设文件有n个记录(R1,R2, , Rn),记录Ri的关键字为Ki,且Ki是不超d位的非负整数。:建立十个队列,编号分别为0,1,2, ,9:重复执行d遍分配:若Ki【d】=j,则Ri放入第j号队列(j=0,1,9)收集:按0,1, ,9的次序将各队列中的记录收集和排列起来。 d=d-1,例:设有关键字序列:,队列,分配,队列,队列,收集,分配,队列,收 集,问题:各队列的长度 如何确定?,例2:已知 n=12, d=2,r=10(12个2位的十进制整数,低位优

15、先),A ,COUNT09,各队列中的记录个数,分配,B ,收集,0 1 2 3 4 5 6 7 8 9 10 11,a ,count09,0 1 2 3 4 5 6 7 8 9 10 11,收集,分配,b ,参考程序如下:for (i=0,d=1;i=0; j-) b-countaj / d % r=aj; /收集for( j=0; jn; j+) aj=bj; 注: d 1为个位,10为十位,k 整数的最大位数;r 数值的基数(如八进制数,十进制数等);n 关键字个数。,内排序小结 内排序方法 插入排序:直接插入排序; 选择排序:简单选择/选择排序;堆排序 归并排序2-路归并排序k-路归并

16、排序 交换排序冒泡排序: 快速排序 基数排序最低位优先法,.什么是排序,什么是排序的稳定性 排序算法分析 (1)时间复杂度 对n个记录排序,所需比较关键字的次数;最好情况;最坏情况;平均情况 对n个记录排序,所需移动记录的次数;最好情况;最坏情况;平均情况 (2)空间复杂度排序过程中,除文件中的记录所占的空间外,所需的辅助存储空间的大小。,第11章 外部排序,外部排序思想设磁盘有4500个记录的文件,磁盘的读写单位是250个记录的数据块,内存只能提供1500个记录的空间,试对此文件进行排序。 解: 从磁盘文件输入三个数据块,计750个记录至内存,排序后再写入磁盘; 按同样的方法得如下归并段:,

17、R1 R2 R3 R4 R5 R6,1 750 7511500 1501 2250 2251 3000 3001 3750 3751 4500, 归并R1,R2,R1 R2,BF1,BF2,BF3,内存区 3块计750个记录,R12,磁盘(1500个记录) 部分有序,磁盘(1500个记录) 整体有序, 按同样得方法得:R34,R56,R1234,R123456,R1 R2 R3 R4 R5 R6,R56,R12,R34,R1234,R123456,1500,1500,1500,3000,4500个记录整体有序,1遍,2/3遍,1遍,建立初始归并段要把全部记录(4500)读写成遍,完成全部记录的

18、归并要把(4500)个记录读写8/3遍。下面分析三路归并的情况:,R1 R2 R3 R4 R5 R6,完成全部记录的归并要把(4500)个记录读写2遍。,结论:M个初始归并段进行K路归并时,归并的趟数为:S= log(K(M) 证明:设M为K的整幂次,即M=K*s (s为整数)第一趟归并得 k*(s-1)个为归并段;第二趟归并得 k*(s-2)个为归并段;第s趟归并得 k*s-s=1个归并段;由m=k*s ,有log(k(m)=s当m不是k的整幂次时,归并趟数是log(k(m)的上界函数log(K(M)证毕上式说明:要s ,只有K 或m,最佳归并树设有8个初始归并段,其长度(以外存物理块为单位

19、)分别为2,3,6,9,12,17,18,24,求其3路最佳归并树,并求其WPL和对外存的访问次数。 解1:,3,12,6,2,24,18,17,9,11,59,32,91,0,WPL=(2+3+6)*3+(9+12) *2+(17+18+24)*2 =193,读写次数WPL*2=386,权值愈小的结点,离根愈近?,解2: k-(m-1) mod (k-1)-1 =3-(8-1) mod (3-1)-1=1 虚设一个长度为“0”的归并段。,18,17,12,9,6,5,3,2,0,91,47,24,20,WPL=(0+2+3)*3+(6+9+12+17+18)*2+24*1=163 读写次数WPL*2=326,权值愈小的结点,离根愈远!,如何判定虚设段的个数?令 M 初始归并段的个数K 归并的路数若(M-1) MOD (K-1)= 0,则不加虚设段;否则需加 P个虚设段。P = K-(M-1) MOD (K-1) 1,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报