归并排序求逆序对

来源:互联网 发布:微信推广淘宝链接 编辑:程序博客网 时间:2024/05/24 15:38

自己写的归并排序求逆序对,稍多了几行

var
  a,b:array[1..100] of longint;
  n,i,len1,len2,start1,start2,k,tot:longint;

procedure doit(x,y:longint);
var
  p:longint;
  f:boolean;
begin
  if x=y then exit;
  doit(x,x+(y-x) div 2);
  doit(x+(y-x)div 2+1,y);
  if y-x=1 then
    if a[x]>a[y] then begin
      p:=a[x];a[x]:=a[y];a[y]:=p;
      inc(tot);
      exit;
    end;
  start1:=x;
  start2:=x+(y-x) div 2+1;
  p:=0;
  repeat
    while (a[start1]<a[start2]) and (start1<x+(y-x) div 2+1) do begin
   inc(p);
   b[p]:=a[start1];
   inc(start1);
 end;
 if start1=x+(y-x) div 2+1 then break;
 while (a[start2]<=a[start1]) and (start2<y+1) do begin
   inc(p);
   b[p]:=a[start2];
          inc(start2);
          inc(tot,x+(y-x) div 2-start1+1);
 end;
  until (start1=x+(y-x) div 2+1) or (start2=y+1);
  if start1=x+(y-x) div 2+1 then begin
    for k:=start2 to y do begin
      inc(p);
      b[p]:=a[k];
    end;
  end
  else begin
    for k:=start1 to x+(y-x) div 2 do begin
      inc(p);
      b[p]:=a[k];
      //inc(tot,y-x-(y-x) div 2);
    end;
  end;
  for i:=x to y do a[i]:=b[i-x+1];
end;

begin
  readln(n);
  for i:=1 to n do read(a[i]);
  readln;
  tot:=0;
  doit(1,n);
  for i:=1 to n do write(a[i],' ');
  writeln;
  writeln(tot);
  readln;
end.


0 0