当前位置: 代码迷 >> 综合 >> 构成逆序对
  详细解决方案

构成逆序对

热度:71   发布时间:2024-01-21 09:41:41.0

var i,j,n,total,k:longint;//integer;
    a,b,c:array[1..100] of integer;
procedure msort(l,r:longint);

var

i,j,mid,k:longint;

begin

if (l=r) then exit;

mid:=(l+r) shr 1;

msort(l,mid);            //让左右子序列有序

msort(mid+1,r);

for i:=l to r do

    c[i]:=b[i];

i:=l;j:=mid+1;


for k:=l to r do

    begin

      if (i<=mid) and ((c[i]<=c[j]) or (j>r)) then

        begin

          b[k]:=c[i];

          inc(i);

        end

        else

          begin

            b[k]:=c[j];

            inc(total,mid-i+1);       //统计核心 当前右元素与所有未输出的左元素构成逆序对

            inc(j);

          end;

    end;

end;

 

begin

{读入数据}

Total:=0;
readln(n);
for i := 1 to n do read(b[i]);
readln;

msort(1,n);
for i := 1 to n do write(b[i], ' ');
writeln;
// writeln(total);     

end.

 

  相关解决方案