分治策略四.DOC

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
分治策略四

分治策略(四) 归并排序 【问题描述】 对一组无序的整数用归并法进行排序 【输入】 两行,第一行为数列的总个数,第二行为待排序的数列 【输出】 一行,排序后的数列 【样例输入】 8 10 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合并到e} end else 终止; 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 (a[k]=b[m]) then begin p:=p+l;e[p]:=a[k];k:=k+l end else begin p:=p+l;e[p]:=b[m];m:=m+l end; end; if km then for mb:=m to j do begin p:=p+l;e[p]:=b[mb] end else for mb:=k to i do begin p:=p+l;e[p]:=a[mb] end; end; 【参考程序】 type arr=array[1..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 (a[k]=b[m]) then begin p:=p+1;e[p]:=a[k];k:=k+1 end else begin p:=p+1;e[p]:=b[m];m:=m+1 end; end; if km then for mb:=m to j do begin p:=p+1;e[p]:=b[mb] end else for mb:=k to i do begin p:=p+1;e[p]:=a[mb] 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 a[ii]:=e[ii];//令a包含e中的前i个元素; for jj:=1 to j do b[jj]:=e[i+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(e[i]); sort(e,n); for i:=1 to n do write(e[i], ); end. 算法思考与改进: 【改进一】按照下述过程对以上伪代码进行细化:当集合E被化分成两个子集合时,可以不必把两个子集合的元素分别复制到A和B中,只需简单地在集合E中保持两个子集合的左右

文档评论(0)

fengruiling + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档