Ultra-QuickSort
Time Limit: 7000MS | Memory Limit: 65536K | |
Total Submissions: 54525 | Accepted: 20039 |
Description

Ultra-QuickSort produces the output
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
n比较大,冒泡,暴力找都会超时
So,现学的归并排序
归并排序模板
void merge_sort(long long a[],int x,int y,long long t[]) //t是临时数组
{
if(y-x>1) //如果分到还剩一个数,递归停止
{
int m=x+(y-x)/2;
int p=x,q=m,i=x;
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++];
ct+=m-p;//求逆序对(如果右边的大于左边的,就是逆序)
}
}
for(i=x;i<y;i++)
a[i]=t[i];//整合到源数组
}
}
AC代码(注意long long)
#include <stdio.h>
long long a[512345],t[512345];
long long ct;
void merge_sort(long long a[],int x,int y,long long t[])
{
if(y-x>1)
{
int m=x+(y-x)/2;
int p=x,q=m,i=x;
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++];
ct+=m-p;
}
}
for(i=x;i<y;i++)
a[i]=t[i];
}
}
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
ct=0;
for(int i=0;i<n;i++)
{
scanf("%lld",&a[i]);
}
merge_sort(a,0,n,t);
printf("%lld\n",ct);
}
}