题目描述
给定一个整数序列,求逆序对的个数
主要思路
将整个序列分为左右两边的序列,左右两序列都已按从小到大的顺序排列,此时逆序对的个数即加上左侧序列大于右侧序列的逆序对数。
如左侧为(2,4,6),右侧为(1,3,5),通过循环发现 2>1,则易得后面的4,6均可与1形成逆序对(因为是按升序排列),基于此可写出代码
代码呈现
#include<bits/stdc++.h> //万能头文件
using namespace std;
#define N 1005000;
int a[N], b[N]; //b[N]为辅助数组
long long cnt = 0;
void merge(int l, int r){
if(r > l){
int mid = (l + r) >> 1;
int i = l, p = l, q = mid + 1;
merge(l, mid);//递归调用
merge(mid + 1, r);//递归调用
while(p <= mid || q <= r){//左右序列都未遍历完
if(q > r || (p <= mid && a[p] <= a[q]))
b[i++] = a[p++];
else{
b[i++] = a[q++];
cnt += mid - p + 1;
}
}
for(i = l; i <= r; i++)
a[i] = b[i]; //排好序
}
}
int main()
{
int n;
cin >> n;
for(int i = 1 ; i <= n; i ++)
cin >> a[i];
cnt = 0;
merge(1 , n);
cout << cnt <<endl;
}
到此,归并求逆序对算法结束。