c++ 逆序对
Posted lja001162
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ 逆序对相关的知识,希望对你有一定的参考价值。
c++ 求逆序对
例如数组(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这个公式,我是这么理解的
以上是关于c++ 逆序对的主要内容,如果未能解决你的问题,请参考以下文章