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
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
long long int a[500010],temp[500010];
long long int ans,n;
void mergearray(int s,int e){
if(s==e) //等于退出
return;
int i;
int mid=(s+e)>>1;//右移,相当于(s+e)/2
int l=s, r=mid+1, k=s;
while(l<=mid&&r<=e){
if(a[l]<=a[r]){
temp[k]=a[l++];
} else {
temp[k]=a[r++];
ans+=mid-l+1;//需要移动的位移差
}
k++;
}
//把遗漏的加到数组里
while(l<=mid)
temp[k++]=a[l++];
while(r<=e)
temp[k++]=a[r++];
for(i=s;i<=e; i++)
a[i]=temp[i];
return ;
}
void sortd(int s,int e){
if(s>=e)
return;
int mid=(s+e)>>1;
sortd(s,mid);//左递归合并
sortd(mid+1,e);//右递归合并
mergearray(s,e);//合并细化(排序)后的数组
return;
}
int main(){
int i,j,k;
while(~scanf("%d",&n) && n){
ans=0;
for(i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
sortd(1,n);
printf("%lld\n",ans);
}
return 0;
}
一个很好的归并排序https://blog.csdn.net/MoreWindows/article/details/6678165