归并排序的原理不需多说,就在此提一下怎么在归并排序的过程中求逆序对。
先贴代码:
#pragma warning (disable :4996)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
long long int buf[500005];//原序列
long long int cnt;//记录逆序对个数
long long int temp[500005];//归并过程中的临时数组
void Merge(int l, int m, int r) {
int i = l, j = m + 1;
int p = 0;
while (i <= m&&j <= r) {
if (buf[i] <= buf[j]) {
temp[p++] = buf[i++];
}
else {
temp[p++] = buf[j++];
cnt += m - i + 1;//记录逆序对个数
}
}
while (i <= m) {
temp[p++] = buf[i++];
}
while (j <= r) {
temp[p++] = buf[j++];
}
j = 0;
for (int i = l; i <= r; i++) {//把排好的序列复制回原序列
buf[i] = temp[j++];
}
}
void Mergesort(int l, int r) {
if (l<r) {
int m = l + (r - l) / 2;
Mergesort(l, m);
Mergesort(m + 1, r);
Merge(l, m, r);
}
}
int main() {
int n;
cin >> n;
for (int i = 0; i<n; i++) {
scanf("%d", &buf[i]);//数据量大,用scanf输入速度更快
}
Mergesort(0, n - 1);
cout << cnt;
return 0;
}
现在讲一下cnt += m - i + 1;这一步: