逆序对的求解逆序对个数问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了逆序对的求解逆序对个数问题相关的知识,希望对你有一定的参考价值。

参考技术A

方法一:最原始的方法,利用两重循环进行枚举。该算法的时间复杂度为O(n^2)。
C++代码如下: int count_inversion(int *a, int N)    int count = 0;    int i, j;    for(i=0; i<N-1; i++)        for(j=i+1; j<N; j++)            if(a[i]>a[j])            count++;    return count;Pascal代码如下: var  i,j,k,n:longint;  a:array[1..1000000] of longint;begin  readln(n);  for i:=1 to n do read(a[i]);  k:=0;  for i:=1 to n-1 do  for j:=i+1 to n do  if a[i]>a[j] then inc(k);  writeln(k);end.方法二:利用归并排序的思想求解逆序对的个数,这是解决该问题的一种较为高效的算法。该算法的时间复杂度为O(nlogn)。
C++代码如下: void merge_inversion(int *a, int l, int m, int r)    int i, j, k;    int n1 = m-l+1;    int n2 = r-m;    int *L = (int*)calloc(n1, sizeof(int));    int *R = (int*)calloc(n2, sizeof(int));    for(i=l; i<=m; i++)        L[i-l] = a[i];    for(j=m+1; j<=r; j++)        R[j-m-1]=a[j];    i = 0;    j = 0;    for(k=l; k<=r; k++)            if(i<n1&&j<n2)                    if(L[i]<R[j])                            a[k]=L[i++];                globa_count+=n2-1-j+1;                        else            a[k]=R[j++];                else        break;        //process if one part terminately early    if(i==n1 && j<n2)        while(j<n2)            a[k++] = R[j++];    if(i<n1 && j==n2)        while(i<n1)            a[k++] = L[i++];    free(L);    free(R);Pascal代码如下: Type arr=array[1..1000000]of longint;Var i,n:longint;    k:int64;    a,b:arr;Procedure merge(var a:arr;l,x,r:longint); var i,j,p:longint;//p:position 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);    inc(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:longint); var x:longint; 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.

以上是关于逆序对的求解逆序对个数问题的主要内容,如果未能解决你的问题,请参考以下文章

树状数组求逆序对

数组的逆序对

一道编程题:求逆序对的个数

数据结构与算法之深入解析“K个逆序对数组”的求解思路与算法示例

luogu 5426

2021-06-01:K个逆序对数组。给出两个整数 n 和 k,找出所有包含从 1 到 n 的数字,且恰好拥有 k 个逆序对的不同的数组的个数。逆序对的定义如下:对于数组的第i个和第 j个元素,如果满