/*
Author: 2486
Memory: 3880 KB Time: 360 MS
Language: G++ Result: Accepted
*/
//序列的逆序数即为交换次数,所以求出该序列的逆序数即可
//采用归并排序的思路进行求解,将他们分分划分为两个部分求解
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=500000+5;
int A[maxn],T[maxn];
int n;
long long cnt;
void merge_sort(int *AA,int x,int y,int *NN)
{
if(y-x>1)
{
int m=x+(y-x)/2;
int p=x,q=m,i=x;
merge_sort(AA,x,m,NN);
merge_sort(AA,m,y,NN);
while(p<m||q<y)
{
if(q>=y||(p<m&&A[p]<=A[q]))NN[i++]=A[p++];//如果其中有一个为空的话,要判断正确,
else NN[i++]=A[q++],cnt+=m-p;//加入到了NN数组内的数字一定是比没有加入里面的小,因为,NN里面的都是排好序了的。所以m-p即为所求
}
for(i=x;i<y;i++)A[i]=NN[i];//将值附过去就可以了
}
}
int main() {
while(~scanf("%d",&n),n) {
cnt=0;
for(int i=0; i<n; i++) {
scanf("%d",&A[i]);
}
merge_sort(A,0,n,T);
printf("%I64d\n",cnt);
}
return 0;
}
POJ2299 Ultra-QuickSort
最新推荐文章于 2022-12-15 12:59:42 发布