POJ 2299 Ultra-QuickSort(归并排序)

//求逆序数对 #include<iostream> using namespace std; const int MAXN = 500001; long long int A[MAXN],T[MAXN],cnt; void merge_sort(long long int *A,int x,int y,long long int *T,long long int &cnt)//归并排序 { if(y-x > 1) { int m = x + (y-x)/2;//划分过程 int p = x,q = m,i = x; merge_sort(A,x,m,T,cnt);//递归求解[x,m) merge_sort(A,m,y,T,cnt);//递归求解[m,y) while(p < m || q < y)//合并过程,条件为:只要有一个序列非空,就继续合并 { if(q >= y || (p < m && A[p] <= A[q]))//第二个序列为空或者第二个序列非空且A[p] <= A[q],则复制A[p] T[i++] = A[p++];//复制左半数组 else { T[i++] = A[q++];//复制又半数组 cnt += m-p;//加上左边数组元素个数,由于归并排序是从小到大运行,所以左边没来得及复制的元素个数即为逆序数 } } for(int i = x;i < y;++i)//从辅助空间复制回A数组 A[i] = T[i]; } } int main() { int n; while(cin >> n) { cnt = 0; if(n == 0)break; for(int i = 0;i < n;++i) cin >> A[i]; merge_sort(A,0,n,T,cnt); cout << cnt << endl; } return 0; } 

你可能感兴趣的:(merge)