逆序对的求解逆序对个数问题
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个逆序对数组”的求解思路与算法示例
2021-06-01:K个逆序对数组。给出两个整数 n 和 k,找出所有包含从 1 到 n 的数字,且恰好拥有 k 个逆序对的不同的数组的个数。逆序对的定义如下:对于数组的第i个和第 j个元素,如果满