#include <stdio.h>
int merge_inversion(int A[],int p,int q,int r)
{
int n1,n2,i,j,k,num=0;
n1=q-p+1;
n2=r-q;
int L[10],R[10];
for(i=0;i!=n1;++i)
L[i]=A[p+i];
for(j=0;j!=n2;++j)
R[j]=A[q+j+1];
L[n1]=1000;
R[n2]=1000;
bool counted=false;
for(k=p,i=0,j=0;k<=r;++k)
{
if(counted==false&&R[j]<L[i])
{
num=num+n1-i;
counted=true;
}
if(L[i]<=R[j])
{
A[k]=L[i];
i=i+1;
}
else
{
A[k]=R[j];
j=j+1;
counted=false;
}
}
return num;
}
int count_inversion(int A[],int p,int r)
{
int num=0;
if(p<r)
{
int q=(p+r)/2;
num=num+count_inversion(A,p,q);
num=num+count_inversion(A,q+1,r);
num=num+merge_inversion(A,p,q,r);
}
return num;
}
void main()
{
int A[]={4,5,6,11,10};
int num=count_inversion(A,0,4);
printf("%d\n",num);
}
寻找逆序对的算法,要求运行时间为O(nlgn),算法导论答案
最新推荐文章于 2022-05-02 12:10:15 发布