讨论 / 可以使用归并排序
hackerzwh 2013-01-29 08:49:00
点我顶贴 收藏 删除
#include<cstdio>

const int MAXN=20000+100;

int A[MAXN],T[MAXN];

int n,cnt;

void merge_sort(int* A,int x,int y,int* T)

{

if(y-x<=1)return;

int m=x+(y-x)/2;

merge_sort(A,x,m,T);

merge_sort(A,m,y,T);

int k=x,p=x,q=m;

while(p<m||q<y)

{

if(q>=y||(p<m&&A[p]<=A[q]))T[k++]=A[p++];

else

{

T[k++]=A[q++];

cnt+=m-p;//归并排序到此,左边还没来得及复制到T的那些数就是左边所以比A[q]大的数.加上左边元素个数m-p.

}

}

for(int i=x;i<y;i++)

A[i]=T[i];

}

int main()

{

//freopen("fish.in","r",stdin);

//freopen("fish.out","w",stdout);

scanf("%d",&n);

for(int i=0;i<n;i++)scanf("%d",&A[i]);

merge_sort(A,0,n,T);

//for(int i=0;i<n;i++)printf("%d ",A[i]);

printf("%d\n",cnt);

return 0;

}

查看更多回复
提交回复