POJ2299——Ultra-QuickSort

View Code
#include<stdio.h>
#define N 500001
__int64 op;
int b[N], a[N];
void copy(int *a, int *b, int l, int r)
{
int i;
for(i=l;i<=r;++i)
{
a[i] = b[i];
}
}
int Merge(int *a, int l,int mid,int r)
{
int i = l;
int j = mid+1;
while(i <= mid && j <= r)
{
if(a[i] < a[j])
{
b[l++] = a[i++];
}
else
{
b[l++] = a[j++];
op += mid-i+1;
}
}
while(i<=mid)
{
b[l++] = a[i++];
}
while(j<=r)
{
b[l++] = a[j++];
}
return 0;
}
int Merge_Sort(int *a, int l,int r)
{
int mid;
if(l<r)
{
mid=(l+r)/2;
Merge_Sort(a, l, mid);
Merge_Sort(a, mid+1,r);
Merge(a, l, mid, r);
copy(a, b, l, r);
}
return 0;
}
int main()
{
int n,i;
while(scanf("%d",&n) != EOF && n)
{
op = 0;
for(i=0;i<n;i++)
{
scanf("%d",a+i);
}
Merge_Sort(a, 0,n-1);
printf("%I64d\n", op);
}
return 0;
}


题目大意:使用交换相邻元素的方法对数组排序,求最小的交换次数;

 

开始想用交换排序,发现数据是50w,伤不起啊==!继续用qsort,各种尝试各种WA啊( ⊙ o ⊙ )!

无奈用自己还不太熟的归并试试,A了……,对原来qsort的数据进行测试,发现2 3 1就不对了 T T!

上网找结题报告,貌似正常的做法是“树状数组+离散化”,不懂,以后再研究吧!!

参考代码:

 

posted @ 2011-11-22 20:47  1050768624  阅读(158)  评论(0编辑  收藏  举报