标签:turn png img oid 元素 bit info cout lse
例如数组(3,1,4,5,2)的逆序对有(3,1)(3,2)(4,2)(5,2)共4个
逆序对就是左边的元素比右边的大,那么左边的元素和右边的元素就能产生逆序对
代码跟归并排序差不多
#include <bits/stdc++.h>
using namespace std;
int a[100];
int r[100];
int ans = 0;
void sort(int s,int t)
{
if (s == t)
return ;
else
{
int mid = (s + t) / 2;
sort(s,mid);//排序mid前面部分
sort(mid + 1,t);//排序好mid后面部分
int i = s,j = mid + 1,k = s;
while (i <= mid && j <= t)
{
if (a[i] <= a[j])
{
r[k] = a[i];
k ++;
i ++;
}
else
{
r[k] = a[j];
k ++;
j ++;
//ans += mid - i + 1;
ans = ans + mid - i + 1;//逆序对个数公式
}
}
while (i <= mid)
{
r[k] = a[i];
k ++;
i ++;
}
while (j <= t)
{
r[k] = a[j];
k ++;
j ++;
}
for (int i = s;i <= t;i ++)
a[i] = r[i];
}
}
int main()
{
int n;
cin >> n;
for (int i = 1;i <= n;i ++)//输入
{
cin >> a[i];
}
sort(1,n);
cout << ans << endl;//ans就是逆序对的个数
cout << endl;
return 0;
}
对于ans = ans + mid - i + 1这个公式,我是这么理解的
标签:turn png img oid 元素 bit info cout lse
原文地址:https://www.cnblogs.com/LJA001162/p/11099792.html