您的位置:首页 > 其它

归并排序求逆序对

2018-02-02 20:21 225 查看
感觉写的很不错的板子

void sort(int *s,int l,int r)
{
if(l==r) return;    //区间长度为1时返回

int mid = l+r>>1;   //对左右区间进行排序
sort(s,l,mid);
sort(s,mid+1,r);

int a[mid-l+1],b[r-mid],l1,l2,i,j,k;        //复制左右区间
l1 = 0;l2 = 0;k = l;
for(i = l;i <= mid;i ++)   a[++l1] = s[i];
for(i = mid+1;i <= r;i ++) b[++l2] = s[i];

i = 1;j = 1;                                //合并放入原数组
while(i<=l1&&j<=l2)
{
if(a[i]<=b[j]) s[k++] = a[i++];
else
{
s[k++] = b[j++];
ans+=(l1-i+1);
}
}
while(i<=l1) s[k++] = a[i++];
while(j<=l2) s[k++] = b[j++];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: