您的位置:首页 > 其它

逆序对问题(归并)

2015-09-10 14:30 309 查看
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <math.h>

using namespace std;
int z[40005];
int az[40005];//辅助空间

int fun(int l, int r)
{
int sum = 0;
if (r - l <= 1)
{
if (z[l] > z[r])
{
az[l] = z[r];
az[r] = z[l];
z[l] = az[l];//放回
z[r] = az[r];
++sum;
}
else
{
az[l] = z[l];
az[r] = z[r];
}
return sum;
}
int m = (l + r) / 2;
int i = l,j=m+1,zi=l;
sum = fun(l, m) + fun(m + 1, r);
while (i <= m&&j <= r)
{
if (z[i] < z[j])
{
az[zi++] = z[i++];
}
else
{
az[zi++] = z[j++];
sum += m - i + 1;
}
}
while (i > m&&j <= r)
{
az[zi++] = z[j++];
}
while (j > r&&i <= m)
{
az[zi++] = z[i++];
}
for (int i = l; i <= r; ++i)//记得把辅助空间中排好序的数放回原数组
{
z[i] = az[i];
}
return sum;
}

int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
for (int i = 0; i < n; ++i)
{
scanf("%d", &z[i]);
}
printf("%d\n", fun(0, n - 1));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: