void merge(int Array[],int l,int m,int r)
{
int temp[100110];
int i=l,j=m+1,k=0;
while(i<=m&&j<=r)
{
if(Array[i]<=Array[j])
{
temp[k++]=Array[i];
i++;
}
else
{
temp[k++]=Array[j];
j++;
ans+=(m-i+1); //求逆序数的关键
}
}
while(i<=m) {temp[k++]=Array[i];i++;}
while(j<=r) {temp[k++]=Array[j];j++;}
for(i=l,j=0;i<=r&&j<k;i++,j++)
{
Array[i]=temp[j];
}
}
void mergesort(int Array[],int l,int r)
{
if(l>=r) return;
int m=(l+r)/2;
mergesort(Array,l,m);
mergesort(Array,m+1,r);
merge(Array,l,m,r);
}
归并排序
最新推荐文章于 2016-09-17 23:46:53 发布