Image Modal

合肥
合肥奥数网

合肥站
奥数网

信息学竞赛常用算法与策略:分治策略(4)

合肥奥数网整理 2013-01-18 14:44:22

  例3:归并排序

      归并就是将多个有序的数列合成一个有序的数列。将两个有序序列合并为一个有序序列叫二路归并(merge).归并排序就是n长度为1的子序列,两两归并最后变为有序的序列。

  程序代码如下:

  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[i]<=r[j] then begin r2[k]:=r[i];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[s]:=r[s] 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[i]);

   mergesort(a,b,1,maxn);

   for i:=1 to maxn do

    write(b[i]:9);

   writeln;

  end.

首页 上一页 下一页 尾页

相关推荐

点击查看更多
重点初中
首页 导航