归并排序求逆序对kl

const inf=maxlongint shr 1;
type ti=array[0..1000]of longint;
var n,i:longint;
    a:ti;

function sort(a:ti;l,r:longint):longint;
var b,c:ti;
function MERGE_SORT(l,r:longint):longint;
var mid,i,t1,t2,t:longint;
begin
  MERGE_SORT:=0;
  if l<>r then
    begin
      mid:=(l+r) shr 1;
      MERGE_SORT(l,mid);
      MERGE_SORT(mid+1,r);
      for i:=1 to mid-l+1 do b[i]:=a[l+i-1];
      for i:=1 to r-mid do c[i]:=a[mid+i];
      b[mid-l+2]:=inf;
      c[r-mid+1]:=inf;
      i:=l;
      t1:=1;
      t2:=1;
      t:=0;
      while i<=r do
        begin
          if b[t1]<=c[t2] then
            begin
              a[i]:=b[t1];
              inc(t1);
            end
              else
            begin
              a[i]:=c[t2];
              inc(t2);
              inc(t,mid-t1+1);
            end;
          inc(i);
        end;
    end;
  inc(MERGE_SORT,t);
end;
begin
  exit(MERGE_SORT(l,r));
end;

begin
  readln(n);
  for i:=1 to n do read(a[i]);
  sort(a,1,n);
  for i:=1 to n do write(a[i],' ');
  readln;
  readln
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值