已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
分治策略(四)归并排序【问题描述】 对一组无序的整数用归并法进行排序【输入】 两行,第一行为数列的总个数,第二行为待排序的数列【输出】一行,排序后的数列【样例输入】810 4 6 3 8 2 5 7【样例输出】2 3 4 5 6 7 8 10【问题分析】归并排序是利用归并技术来进行排序。归并是指将若干个已排序的子文件合并成一个有序的文件。归并排序实际上就是二分法在排序中的应用。它的基本思想是:将待排序的数列分成两个小的数集,先对两个子数集进行排序,然后进行两个有序子集的合并,形成排序后的数列(称为序列),而对子集的处理方法与刚才的处理方法是一致的,直到子集中只存在一个整数为止一结束分解。(详见图4-6)【程序分析(伪代码)】Procedure sort(e:arr;n:integer);对数组e中的n个元素进行排序if (n=2) then begin i=n div 2;j=n-i;令a包含e中的前i个元素;令b包含e中余下的j个元素;sort(a,i);sort(b,j);merge(a,b,e,i,j); 把a和b合并到eendelse 终止;procedure merge (a,b:arr;var e:arr;i,j:integer); var k,m,mb,p:integer;begin k:=1;m:=1;p:=0; while (k=i)and(m=j) do begin if (akm then for mb:=m to j do begin p:=p+l;ep:=bmb end else for mb:=k to i do begin p:=p+l;ep:=amb end;end;【参考程序】type arr=array1.100 of integer;var i,n:integer; e:arr;procedure merge (a,b:arr;var e:arr;i,j:integer); var k,m,mb,p:integer; begin k:=1;m:=1;p:=0; while (k=i)and(m=j) do begin if (akm then for mb:=m to j do begin p:=p+1;ep:=bmb end else for mb:=k to i do begin p:=p+1;ep:=amb end;end;Procedure sort(var e:arr;n:integer);对数组e中的n个元素进行排序 var i,ii,j,jj:integer;a,b:arr; begin if (n=2) then begin i:=n div 2; j:=n-i; for ii:=1 to i do aii:=eii;/令a包含e中的前i个元素; for jj:=1 to j do bjj:=ei+jj;/令b包含e中余下的j个元素; sort(a,i); sort(b,j); merge(a,b,e,i,j); 把a和b合并到e end else exit; end;begin readln(n); for i:=1 to n do read(ei); sort(e,n); for i:=1 to n do write(ei, );end.算法思考与改进:【改进一】按照下述过程对以上伪代码进行细化:当集合E被化分成两个子集合时,可以不必把两个子集合的元素分别复制到A和B中,只需简单地在集合E中保持两个子集合的左右边界即可。接下来对A中的初始序列进行排序,并将所得到的排序序列归并到一个新数组B中,最后将它们复制到A中。mergesort( A:arr;left,right:integer);对A数组中从left到right元素进行排序begin if leftright then begin 至少两个元素 i:=(left + right) div 2: mergesort(a,left,i); mergesort(a,i+l,right); merge(a,b,left,i,right); 从a合并到b copy(b,a,left,right); 结果放回a end;end ;procedure merge (a,b:arr;left,i,right:integer); var k,m,mb,p,r1,r2:integer;begin k:=left;m:=i+1;r1:=i;r2:=right;p:=left; while (k=r1)and(m=r2) do begin if (akm then for mb:=m to r2 do begin p:=p+l;bp:=amb end else for mb:=k to r1 do begin p:=p+l;bp:=amb end;end;参考程序:program guibing;var a:array1.100 of integer; n,i:integer;procedure merge(left,mid,right:integer); var h,i,j,k:integer; b:array1.100 of integer;/思考,b数组定义在这里合适吗? begin h:=left; i:=left; j:=mid+1; while (h=mid) and (j=right) do begin if (ahmid then for k:=j to right do begin bi:=ak; i:=i+1; end else for k:=h to mid do begin bi:=ak; i:=i+1; end; for k:=left to right do ak:=bk; end;procedure mergesort(left,right:integer); var mid:integer; begin if leftright then begin mid:=(left+right) div 2; mergesort(left,mid); mergesort(mid+1,right); merge(left,mid,right); end; end;begin read(n); for i:=1 to n do read(ai); mergesort(1,n); for i:=1 to n do write(ai:7);end.【改进二】仔细查看原有的序列,我们可以发现,其实也可以不需人为地分成两个部分,只要将序列从左往右扫描一下,就可以分成若干有序序列。 例如,元素序列4,8,3,7,1,5,6,2中就可以分成子序列4,8,3, 7,1,5,6和2,每个子序列都是有序的。分割子序列的标准是:若位置i的元素比位置i+l的元素大,则从位置i进行分割。然后再根据归并的算法进行归并运算。这种排序列被称为自然归并排序,它是基本归并排序的一种改进。 对于上面这个元素序,可以找到四个子序列,子序列1和子序列2归并可得3,4,7,8,子序列3和子序列4归并可得1,2,5,6,最后,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025广东广州银行风险条线专题招聘备考题库含答案详解(完整版)
- 2025重庆垫江县永安镇委员会公开选拔本土人才3人备考题库及答案详解(历年真题)
- 2025克拉玛依市公安机关招聘警务辅助人员备考题库(169人)及答案详解参考
- 2025年辽阳市公安局招聘警务辅助人员体能测试备考题库含答案详解(培优)
- 抗震宜居农房设计标准
- 2025四川宜宾市叙州区招聘社区专职工作者25人备考题库及参考答案详解
- 2026年陕西省选调生招录备考题库(面向清华大学)及答案详解(有一套)
- 2025海南琼海市社区专职网格员招聘为社区专职人员50人备考题库(1号)含答案详解(培优a卷)
- 2025广州银行人才招聘6人备考题库及1套完整答案详解
- 2025中国民生银行南宁分行招聘2人备考题库及答案详解(典优)
- 2025年及未来5年市场数据中国组氨酸行业市场调查研究及投资前景预测报告
- 矿山井架钢结构施工方案
- 2025年航空服务创新项目可行性研究报告及总结分析
- 合伙酒店承包协议书
- 流动式起重机吊装施工方案
- 2017年版2025年修订 普通高中信息科技课程标准核心解读
- 水利工程现场管理
- 一元一次方程 数学活动 生活中的阶梯计价问题课件 2025-2026学年人教版七年级数学上册
- 教育部发布法学本科专业教学质量国家标准
- 焊接设备操作工标准化技术规程
- 青海省交通控股集团有限公司2026年度校园引才招聘笔试考试备考试题及答案解析
评论
0/150
提交评论