-
例4.归并排序(mergesort.pas) pku 2299
归并排序(Merge Sort)是利用"归并"技术来进行排序。归并是指将若干个已排序的子文件合并成一个有序的文件。
解法一:自顶向下进行归并。
采用分治法进行自顶向下的算法设计,形式更为简洁。
它的基本思想是:将待排序的数列分成两个小的数列,先对两个子集进行排序,然后进行两个有序子集的合并,形成排序后的数一列,然后对子的处理方法与刚才的处理方法是一致的,直到子集中只存在一个整数为止。 -
这道题目其实额嗯嗯,我也不知道该如何说,用分治来做,
-
其实这道题肯定会有人问为什么不用快排,其实归并有好处,也提高马(马子好像错了???!!!)代码的能力。
-
程序如下
-
const
-
maxn=10000; type arr=array[1..maxn] of longint; var a:arr; n:longint; procedure init; var i:longint; begin readln(n); for i:=1 to n do read(a[i]); end; procedure prant; var i:longint; begin for i:=1 to n do write(a[i],' '); end; procedure aa(l,mid,r:longint); var i,j,k,p:longint; t:arr; begin i:=l; j:=mid+1; p:=0; while (i<=mid) and (j<=r) do if a[i]<a[j] then begin inc(p); t[p]:=a[i]; inc(i); end else begin inc(p); t[p]:=a[j]; inc(j); end; for k:=i to mid do begin inc(p); t[p]:=a[k]; end; for k:=j to r do begin inc(p); t[p]:=a[k]; end; for k:=l to r do a[k]:=t[k-l+1]; end; procedure aaa(l,r:longint); var mid:longint; begin if l>=r then exit; mid:=(l+r) div 2; aaa(l,mid); aaa(mid+1,r); aa(l,mid,r); end; begin init; aaa(1,n); prant; end.
例4.归并排序(mergesort.pas) pku 2299
最新推荐文章于 2022-06-20 14:00:00 发布