归并排序

[复制链接]
发表于 2023-12-23 11:53:58 | 显示全部楼层 |阅读模式
归并排序
归并就是将多个有序的数列合成一个有序的数列。将两个有序序列合并为一个有序序列叫二路归并(merge).归并排序就是n长度为1的子序列,两两归并最后变为有序的序列。
1.二路归并
例1:将有序表L1=(1,5,7),L2=(2,3,4,6,8,9,10)合并一个有序表 L.
program gb;
const m=3;n=7;
typearrl1=array[1..m] of integer;
arrl2=array[1..n]of integer;
arrl=array[1..m+n]of integer;
var a:arrl1;
b:arrl2;
c:arrl;
i,j,k,r:integer;
begin
write('Enterl1(sorted):');
for i:=1 to mdo read(a);
write('Enterl2(sorted):');
for i:=1 to ndo read(b);
i:=1;j:=1;k:=0;
while (i<=m)and (j<=n) do
begin
k:=k+1;
ifa<=b[j] then begin c[k]:=a;i:=i+1; end
              else begin c[k]:=b[j];j:=j+1;end;
end;
if i<=m thenfor r:=i to m do c[m+r]:=a[r];
if j<=nthen  for r:=j to n do c[n+r]:=b[r];
writeln('Outputdata:');
for i:=1 to m+ndo write(c:5);
writeln;
end.
2.归并排序
program gbpx;
const maxn=7;
type arr=array[1..maxn] of integer;
var a,b,c:arr;
    i:integer;
procedure merge(r:arr;l,m,n:integer;var r2:arr);
var i,j,k,p:integer;
begin
i:=l;j:=m+1;k:=l-1;
while (i<=m)and (j<=n) do
  begin
   k:=k+1;
   if r<=r[j] then begin r2[k]:=r;i:=i+1 end
                else begin r2[k]:=r[j];j:=j+1 end
  end;
if i<=m then
  for p:=i to m do begin k:=k+1;r2[k]:=r[p] end;
if j<=n then
  for p:=j to n do begin k:=k+1;r2[k]:=r[p] end;
end;
procedure mergesort( var r,r1:arr;s,t:integer);
var k:integer; c:arr;
begin
if s=t then r1:=r else
   begin
    k:=(s+t) div 2;
    mergesort(r,c,s,k);
    mergesort(r,c,k+1,t);
    merge(c,s,k,t,r1)
   end;
end;
begin
write('Enter data:');
for i:= 1 to maxn do
  read(a);
mergesort(a,b,1,maxn);
for i:=1 to maxn do
  write(b:9);
writeln;
end.

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表