逆序对的个数

来源:互联网 发布:百旺税控软件 编辑:程序博客网 时间:2024/05/22 03:48

对于数组A[1...n],若有i<j且A[i]>A[j],则对偶(i,j)称为A的一个逆序对。求数组中逆序对个数,很简单的思路是每个数和后面的数比较,这样需要(n^2)的时间,如果采用归并排序的思想最坏情况下需要O(nlgn)。

1.分解A[low...mid]和A[mid+1...high]

2.求解

3.合并,数组A[low...mid]和A[mid+1...high]分别都是有序的,设置两个指针,i指向mid,j指向high,如果A[i]>A[j],则A[i]>A[mid+1...high],所以逆序对的个数为j-(mid+1)+1,将A[i]放入数组tmp[]中,i前移;如果A[i]<A[j],将A[j]放入数组中,j前移。

#include<iostream>using namespace std;int MergeArry(int arry[],int low,int mid,int high){int i=mid,j=high;int k=0,count=0,tmp[100];while(i>=low&&j>mid){if(arry[i]>arry[j]){tmp[k++]=arry[i--];count+=j-mid;}elsetmp[k++]=arry[j--];}while(i>=low)tmp[k++]=arry[i--];while(j>mid)tmp[k++]=arry[j--];for(i=0;i<k;i++)arry[high-i]=tmp[i];return count;}int Inver(int arry[],int low,int high){int sum=0;if(low<high){int mid=(low+high)/2;sum+=Inver(arry,low,mid); //计算左边逆序对数sum+=Inver(arry,mid+1,high);  //计算右边逆序对数sum+=MergeArry(arry,low,mid,high); //合并后的逆序对数}return sum;}int main(){int n,*arry,*tmp;cin>>n;arry=new int[n];for(int i=0;i<n;i++)cin>>arry[i];cout<<Inver(arry,0,n-1)<<endl;return 0;}

算法同上一篇相同


原创粉丝点击