- 1、本文档共7页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)