Description
In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted in ascending order. For the input sequence
9 1 0 5 4 ,
Ultra-QuickSort produces the output
0 1 4 5 9 .
Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a given input sequence.
Input
The input contains several test cases. Every test case begins with a line that contains a single integer n < 500,000 – the length of the input sequence. Each of the the following n lines contains a single integer 0 ≤ a[i] ≤ 999,999,999, the i-th input sequence element. Input is terminated by a sequence of length n = 0. This sequence must not be processed.
Output
For every input sequence, your program prints a single line containing an integer number op, the minimum number of swap operations necessary to sort the given input sequence.
Sample Input
5
9
1
0
5
4
3
1
2
3
0
Sample Output
6
0
就是求逆序对
详情看前面讲解如何求逆序对,(分类:排序-》归并排序与逆序对)
CODE
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 500100;
long long cnt;
int A[maxn], T[maxn];
void merge_sort(int* A, int x,int y, int* T)
{
if(y-x > 1)
{
int m = x + (y-x)/2;
int p = x, q = m, i = x;//p为合并时左边下标,q为右边下标
merge_sort(A, x, m, T);//左边排序
merge_sort(A, m, y, T);//右边排序
while(p < m || q < y){//只要有一个序列非空就要继续合并数组
if(q >= y || (p < m && A[p] <= A[q]))//如果
T[i++] = A[p++];//从左边数组复制到临时空间
else
{
T[i++] = A[q++];//从右边数组复制到临时空间
cnt +=m-p;
}
}
for(i = x; i < y; i++)
A[i] = T[i];//从辅助空间复制回A数组
}
}
int main()
{
int n;
while(cin >> n && n)
{
for(int i = 0; i < n; i++)
cin >> A[i];
cnt = 0;
merge_sort(A,0,n,T);
cout << cnt << endl;
}
return 0;
}