您的位置:首页 > 其它

归并求逆序对

2017-08-17 21:48 183 查看
求这个逆序对只需要在归并排序的代码中加一句即可。

感觉自己有点说不清楚,随手附上别人的详细解释,请戳:详细介绍

#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;

int a[1000000];
int b[1000000];
int sum = 0;

void merge(int l, int mid, int r)
{

int p1 = l;
int p2 = mid + 1;
for(int i = l; i <= r; i++)
{
if(p1 <= mid && (p2 > r || (a[p1] <= a[p2])))
{
b[i]=a[p1];
p1++;
}
else
{
b[i] = a[p2];
p2++;
sum+=mid-p1+1;
}
}
for(int i = l; i <= r;i++)
{
a[i] = b[i];
}
}
void erfen(int l,int r)
{
int mid = (l + r) >> 1;
if(l < r)
{
erfen(l, mid);
erfen(mid + 1, r);
}
merge(l,mid,r);
}
int main()
{
int n;
printf("请输入你要输入的数字的个数:");
scanf("%d",&n);
for(int i = 1; i <= n;i++)
{
scanf("%d",&a[i]);
}
erfen(0,n);
printf("从小到大输出为:");
for(int i = 1; i <= n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
printf("%d\n",sum);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: