level 4
jimmyahacker
楼主
请教一下归并排序中求逆序对的方法为什么是
正确的
(即证明其正确性)。
如如下代码中:
type arr=array[1..1000000]of longint;
var i,n,k:longint;
a:arr;
procedure merge(var a:arr; l,x,r:integer);
var i,j,p:integer;
b:arr;
begin
i:=l; j:=x+1; p:=l;
while p<=r do begin
if (i<=x)and((j>r)or(a[i]<=a[j])) then begin
b[p]:=a[i]; inc(i);
end else begin
b[p]:=a[j]; inc(j);
。
k:=k+x-i+1;。。。。。。。。。。。。。。。。。。。。。。。。。。。。
end;
inc(p);
end;
for i:=l to r do a[i]:=b[i];
end;
procedure msort(var a:arr; l,r:integer);
var x:integer;
begin
if l<>r then begin
x:=(l+r) div 2;
msort(a,l,x);
msort(a,x+1,r);
merge(a,l,x,r);
end;
end;
begin
readln(n);
for i:=1 to n do read(a[i]);
k:=0;
msort(a,1,n);
writeln(k);
end.
点阵+表情中的那一句怎么理解?
2010年08月21日 12点08分
1
正确的
(即证明其正确性)。
如如下代码中:
type arr=array[1..1000000]of longint;
var i,n,k:longint;
a:arr;
procedure merge(var a:arr; l,x,r:integer);
var i,j,p:integer;
b:arr;
begin
i:=l; j:=x+1; p:=l;
while p<=r do begin
if (i<=x)and((j>r)or(a[i]<=a[j])) then begin
b[p]:=a[i]; inc(i);
end else begin
b[p]:=a[j]; inc(j);
。
end;
inc(p);
end;
for i:=l to r do a[i]:=b[i];
end;
procedure msort(var a:arr; l,r:integer);
var x:integer;
begin
if l<>r then begin
x:=(l+r) div 2;
msort(a,l,x);
msort(a,x+1,r);
merge(a,l,x,r);
end;
end;
begin
readln(n);
for i:=1 to n do read(a[i]);
k:=0;
msort(a,1,n);
writeln(k);
end.
点阵+表情中的那一句怎么理解?