您的位置:首页 > 其它

2299 归并排序

2011-05-24 21:04 99 查看
#include<iostream>
using namespace std;
#define max 5000005
int n,a[max],t[max];
long long sum;
void Merge(int x,int mid,int y)
{
int p=0;
int i=x,j=mid+1;
while(i<=mid && j<=y)
{
if(a[i]>a[j])
{
t[p++]=a[j++];
sum+=mid-i+1;//why?因为如果a[i] > a[j]的话,那么a[i]到a[m]之间的所有数都可以和a[j]构成逆序对。这句 是本题的核心。
//j-i是错的,这是只能用中间那个数
}
else
{
t[p++]=a[i++];
}
}
while(i<=mid) t[p++]=a[i++];
while(j<=y) t[p++]=a[j++];
for(int m=x;m<=y;m++)
a[m]=t[m-x];

}

void Mergesort(int i,int j)
{

if(j>i)
{
int mid=(i+j)/2;
Mergesort(i,mid);
Mergesort(mid+1,j);
Merge(i,mid,j);
}
}
int main()
{
while(cin>>n,n)
{
for(int i=0;i<n;i++)
cin>>a[i];
a
=0;
sum=0;
Mergesort(0,n-1);
cout<<sum<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: