第二十二讲.ppt
《第二十二讲.ppt》由会员分享,可在线阅读,更多相关《第二十二讲.ppt(30页珍藏版)》请在三一办公上搜索。
1、第二十二讲,1、归并排序2、总复习,10.5归并排序,归并排序(Merge Sort)也是一种常用的排序方法,“归并”的含义是将两个或两个以上的有序表合并成一个新的有序表。如图8-11为两组有序表的归并,有序表4,25,34,56,69,74和15,26,34,47,52,通过归并把它们合并成一个有序表4,15,25,26,34,34,47,52,56,69,74。,图8-11 两组有序表的归并,二路归并排序的基本思想是:将有n个记录的待排序列看作n个有序子表,每个有序子表的长度为1,然后从第一个有序子表开始,把相邻的两个有序子表两两合并,得到n/2个长度为2或1的有序子表(当有序子表的个数为
2、奇数时,最后一组合并得到的有序子表长度为1),这一过程称为一趟归并排序。再将有序子表两两归并,如此反复,直到得到一个长度为n的有序表为止。上述每趟归并排序都需要将相邻的两个有序子表两两合并成一个有序表,这种归并方法称为二路归并排序。,1两个有序表的合并算法Merge()。设线性表Rlow.m,和Rm+1.high是两个已排序的有序表,存放在同一数组中相邻的位置上,将它们合并到一个数组Rl中,合并过程如下:(1)比较线性表Rlow.m与Rm+1.high的第一个记录,将其中关键字值较小的记录移入表R1(如果关键字值相同,可将Rlow.m的第一个记录移入R1中)。(2)将关键字值较小的记录所在线性
3、表的长度减1,并将其后继记录作为该线性表的第一个记录。反复执行上述过程,直到线性表Rlow.m或Rm+1.high之一成为空表,然后将非空表中剩余的记录移入R1中,此时Rl成为一个有序表。算法描述如下:,void Merge(RecType R,RecType R1,int low,int m,int high)/Rlow.m和Rm+1.high是两个有序表int i=low,j=m+l,k=low;/k是Rl的下标,i、j分别为Rlow.m和Rm+1.high的下标 while(i=m,while(i=m)/将Rlow.m余下部分复制到R1 R1k=Ri;i+;k+;while(j=high
4、)/将Rm+1.high余下部分复制到R1 R1k=Rj;j+;k+;,2一趟归并排序的算法MergePass()。一趟归并排序的算法调用n/(2*length)次归并算法merge(),将R1.n中前后相邻且长度为length的有序子表进行两两归并,得到前后相邻且长度为2*length的有序表,并存放在R11.n中。如果n不是2*length的整数倍,则可出现两种情况:一种情况是,剩下一个长度为length的有序子表和一个长度小于length的子表,合并之后其有序表的长度小于2*length;另一种情况是,只剩下一个子表,其长度小于等于length,此时不调用算法merge(),只需将其直接
5、放入数组R1中,准备进行下一趟归并排序。算法描述如下:,void MergePass(RecType R,RecType R1,int length,int n)int i=0,j;while(i+2*length-ln)Merge(R,R1,i,i+length-1,i+2*length-1);i=i+2*length;/归并长度为length的两相邻有序子表 if(i+length-1n-1)/余下两个有序子表,其中一个长度小于lengh Merge(R,R1,i,i+length-1,n-1);/归并两个有序表 else for(j=i;jn;j+)/剩下一个有序子表,其长度小于leng
6、h R1j=Rj;,3归并排序算法Merge_Sort()两路归并排序需要由多趟归并过程实现。第一趟length=1,以后每执行一趟归并后将length加倍。第一趟归并的结果存放在R1中;第二趟将数组R1中的有序子表两两合并,结果存放在数组R中;如此反复进行。为使最终排序结果存放在数组R中,进行归并的趟数必须是偶数。因此当只需奇数趟归并即可完成排序时,应再进行一趟归并,只是此时只剩下一个长度不大于length的有序表,直接从数组R1复制到R中即可。算法描述如下:,void Merge_Sort(RecType R,int n)int length=1;while(lengthn)MergePa
7、ss(R,R1,length,n);length=2*length;MergePass(R1,R,length,n);length=2*length;,【例10-8】初始序列为23,56,42,37,15,84,72,27,18用二路归并排序法排序。【解】排序后的结果为:15,18,23,27,37,42,56,72,84,整个归并过程如图8-12所示。,图 10-12 归并排序示例,显然,n个记录进行二路归并排序时,归并的趟数为O(log2n),每趟归并中,关键字的比较次数不超过n,因此,二路归并排序的时间复杂度为O(nlog2n)。对序列进行归并排序时,除采用二路归并排序外,还可以采用多路
8、归并排序方法(可参考其它有关书籍)。归并排序需要的辅助空间R1与待排序记录的数量相等,因此二路归并排序的空间复杂度为O(n),这是常用的排序方法中空间复杂度最差的一种排序方法。另外,从排序的稳定性看,二路归并排序是一种稳定的排序方法。,10.6各种排序方法的比较,在前面几节中讨论了内部排序的方法。对于内部排序主要介绍了四大类排序方法:插入排序(直接插入排序、折半插入排序和希尔排序)、交换排序(冒泡排序和快速排序)、选择排序(简单选择排序和堆排序)、归并排序。详细讨论了各种排序方法的基本原理,并从时间复杂性、空间复杂性以及排序的稳定性三方面讨论了各种排序方法的时效性,介绍了各排序方法的实现算法及
9、其存在的优缺点。如果待排序的数据量很小,最好选择编程简单的排序算法,因为在这种情况下采用编程复杂、效率较高的排序方法所能节约的计算机时间是很有限的。反之,如果待处理的数据量很大,特别是当排序过程作为应用程序的一部分需要经常执行时,就应该认真分析和比较各种排序方法,从中选出运行效率最高的方法。,下面具体比较一下各种排序方法,以便实现不同的排序处理。(1)插入排序的原理:向有序序列中依次插入无序序列中待排序的记录,直到无序序列为空,对应的有序序列即为排序的结果,其主旨是“插入”。(2)交换排序的原理:先比较大小,如果逆序就进行交换,直到有序。其主旨是“若逆序就交换”。(3)选择排序的原理:先找关键
10、字最小的记录,再放到已排好序的序列后面,依次选择,直到全部有序,其主旨是“选择”。(4)归并排序的原理:依次对两个有序子序列进行“合并”,直到合并为一个有序序列为止,其主旨是“合并”。(5)基数排序的原理:按待排序记录的关键字的组成成分进行排序的一种方法,即依次比较各个记录关键字相应“位”的值,进行排序,直到比较完所有的“位”,即得到一个有序的序列。各种排序方法的工作原理不同,对应的性能也有很大的差别,下面通过一个表格可以看到各排序方法具体的时间性能、空间性能等方面的区别。,表10-2 内部排序方法的时间性能、空间性能表,依据这些因素,可得出如下几点结论:(1)若n较小(如n值小于50),对排
11、序稳定性不作要求时,宜采用选择排序方法,若关键字的值不接近逆序,亦可采用直接插入排序法。但如果规模相同,且记录本身所包含的信息域比较多的情况下应首选简单选择排序方法。因为直接插入排序方法中记录位置的移动操作次数比直接选择排序多,所以选用直接选择排序为宜。(2)如果序列的初始状态已经是一个按关键字基本有序的序列,则选择直接插入排序方法和冒泡排序方法比较合适,因为“基本”有序的序列在排序时进行记录位置的移动次数比较少。(3)如果n较大,则应采用时间复杂度为O(nlog2n)的排序方法,即快速排序、堆排序或归并排序方法。快速排序是目前公认的内部排序的最好方法,当待排序的关键字是随机分布时,快速排序所
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第二十二
链接地址:https://www.31ppt.com/p-5426186.html