数据结构 排序 查找 PPT.ppt





《数据结构 排序 查找 PPT.ppt》由会员分享,可在线阅读,更多相关《数据结构 排序 查找 PPT.ppt(37页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 2002005 5 -2 2-1 1华中科技大学华中科技大学计算机学院计算机学院(1212)数据结构数据结构10.4 归并归并排序排序 基本思想 把k(k2)个有序子文件合并在一起,形成一个新的有序文件。同时归并k个有序子文件的排序过程称为k-路归并排序。2-2-路归并排序路归并排序-归并2个有序子文件的排序。例.将有序文件A和B归并为有序文件C。A A(2,10,15,18,21,30)B B(5,20,35,40)按从小至大的次序从A或B中依次取出2,5,10,15,.,40,顺序归并到C中,得:C C(2,5,10,15,18,20,21,30,35,40)一般地,2-2-路归并路归并
2、过程为:假定文件rlow.high中的相邻子文件(子表)(rlow,rlow+1,.,rmid)rlow,rlow+1,.,rmid)和(rmid+1,.,rhighrmid+1,.,rhigh)为有序子文件,其中:lowmidhigh。将这两个相邻有序子文件归并为有序文件ylow.high,即:(ylow,ylow+1,.,yhigh)ylow,ylow+1,.,yhigh)06060808151540400707090920202222r9.16 91011121314151606060707080809091515202022224040y9.16 9101112131415162-路归
3、并有序文件有序文件(表表)ijk例有序有序子表子表有序有序子表子表将两个有序子文件归并为有一个有序文件的算法两个有序子文件归并为有一个有序文件的算法void merge(r,y,low,mid,high)RecType r,y;int low,mid,high;int k=i=low,j=mid+1;while(i=mid&j=high)if(ri.key=rj.key)yk=ri;i+;/归并前一个子文件的记录归并前一个子文件的记录 else yk=rj;j+;/归并后一个子文件的记录归并后一个子文件的记录 k+;while(j=high)/归并后一个子文件余下的记录归并后一个子文件余下的记
4、录 yk=rj;j+;k+;while(i=mid)/归并前一个子文件余下的记录归并前一个子文件余下的记录 yk=ri;i+;k+;/merge2-2-路路归并排序排序 假定文件(r1,r2,.,rn)中记录是随机排列的,进行2-路归并排序,首先把它划分为长度均为1的n个有序子文件,然后对它们逐步进行2路归并排序。其步骤如下:第第1 1趟趟:从r1.n中的第1个和第2个有序子文件开始,调用算法merge,每次归并两个相邻子文件,归并结果放到y1.n中。在y中形成 n/2 个长度为2的有序子文件。若n为奇数,则y中最后一个子文件的长度为1。第第2 2趟趟:把y1.n看作输入文件,将 n/2 个有
5、序子文件两两归并,归并结果回送到r1.n中,在r中形成 n/2/2个长度为4的有序子文件。若y中有奇数个子文件,则r中最后一个子文件的长度为2。.共计经过 loglog2 2n n 趟归并,最后得到n个记录的有序文件。例1.对8个记录作2路归并排序,共进行loglog2 28 83 3 趟归并。06 06 44 44 20 20 10 10 02 02 20 20 08 08 07 07r1.06 06 44 44 10 10 20 20 02 02 20 20 07 07 08 08y1.06 06 10 10 20 20 44 44 02 02 07 07 08 08 20 20r1.02
6、 02 06 06 07 07 08 08 10 10 20 20 20 20 44 44y1.第1趟第3趟第2趟例2.对11个记录作2-路归并排序,进行loglog2 211114 4趟归并。06 06 44 44 20 20 10 10 02 02 20 20 08 08 07 07 05 05 32 32 14 14 1 2 3 4 5 6 7 8 91011r1.06 06 44 44 10 10 20 20 02 02 20 20 07 07 08 08 05 05 32 32 14 14y1.06 06 10 10 20 20 44 44 02 02 07 07 08 08 20
7、20 05 05 14 14 32 32r1.02 02 06 06 07 07 08 08 10 10 20 20 20 20 44 44 05 05 14 14 32 32y1.1 2 3 4 5 6 7 8 91011 1 2 3 4 5 6 7 8 91011 1 2 3 4 5 6 7 8 91011 02 02 05 05 06 06 07 07 08 08 10 10 14 14 20 20 20 20 32 32 44 44r1.1 2 3 4 5 6 7 8 91011第1趟第3趟第2趟第4趟一趟归并排序算法一趟归并排序算法:void mergepass(r,y,s)/s s
8、为子文件的长度为子文件的长度 RecType r,y;int s;/将将r r中的子文件归并到中的子文件归并到y y中中 int i=1;while(i+2*s-1=)/两两归并长度均为两两归并长度均为s s的子文件的子文件 merge(r,y,i,i+s-1,i+2*s-1);i=i+2*s;if(i+s-1n)/最后两个子长度为最后两个子长度为s s和长度不足和长度不足s s的文件的文件 merge(r,y,i,i+s-1,n);else while(i=n)/复制最后一个子文件复制最后一个子文件,长度长度s s yi=ri;i+;调用算法mergepass,对文件对文件r r1.1.nn
9、归并排序的算法归并排序的算法 void mergesort(RecType r,int n)RecType yn+1;int s=1;/子文件初始长度为子文件初始长度为1 1 while(sri+1.key,则交换记录ri和ri+1的位置;否则,不交换。(i=1,2,.n-1)第1趟之后,n个关键字中最大的记录移到了rn的位置上。第第2 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-
10、1n-1趟趟,或者不需再交换记录时为止。例:第1趟 第2趟 第3趟 第4趟 k1=43 21 21 21 21 21 21 21 21 15 15 1515k2=21 43 43 43 43 43 43 15 15 21 21 2121k3=89 89 89 15 15 15 15 28 28 28 28 28 28 k4=15 15 15 89 28 28 28 43 43 4343 43 4343 43k5=28 28 28 28 89 43 43 4343 43 43 43 4343 43 43 43k6=43 43 43 43 43 8989 89 8989 89 89 89 89 8
11、989 89 89 89 比较次数=543214 交换记录的次数=3+2+1=6,移动记录次数=3*6=18 算法分析 最好情况最好情况:待排序的文件已是有序文件,只需要进行1趟 排序,共计比较关键字的次数为 n n1 1 不交换记录不交换记录。最坏情况最坏情况:要经过n-1趟排序,所需总的比较关键字的次 数为 (n-1)+(n-2)+.+1n(n-1)/2 交换记录的次数最多为 (n-1)+(n-2)+.+1n(n-1)/2 移动记录次数最多为 3 3n(n-1)/2n(n-1)/2。只需要少量中间变量作为辅助空间。算法是稳定稳定的。冒泡排序算法冒泡排序算法/对n个整数按递增次序作冒泡排序
12、Void bubble1(int a,int n)int i,j,temp;for(i=0;in-1;i+)/作n-1趟排序 for(j=0;jaj+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=0swap=0;/置交换标志为0 for(i=1;iri+1.key)temp=ri;/交换记录 ri=ri+
13、1;ri+1=temp;swap=1swap=1;/置交换标志为1 j+;/作下一趟排序 while(jn&swapjn&swap);/未作完n-1趟,且标志为110.5.2 快速快速排序排序 基本思想:首先在r1.n中,确定一个ri,经过比较和移动,将ri放到中间某个位置上,使得ri左边所有记录的关键字小于等于ri.key,ri右边所有记录的关键字大于等于ri.key。以以riri为界为界,将文件划分为左、右两个子文件将文件划分为左、右两个子文件。用同样的方法分别对这两个子文件进行划分,得到4个更小的子文件。继续进行下去,使得每个子文件只有一个记录为止,便得到原文件的有序文件。例.给定文件(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 排序 查找 PPT

限制150内