归并排序的思想就是对数组分别排序后合并,利用这个思想我们可以再合并是进行逆序对判断。只需要将归并排序做一些小的改动就可以实现求逆序对。
#include<iostream>
using namespace std;
const int N = 1e5 + 5;
int a[N],temp[N];
int n;
int cnt=0;//逆序对数量
void merge_sort(int l,int r) {
if (l >= r) {
return;
}
int mid = l + r >> 1;
merge_sort(l, mid);
merge_sort(mid + 1, r);
int i = l, j = mid + 1,k=0;
while (i <= mid && j <= r) {
if (a[i] < a[j]) temp[k++] = a[i++];
else {
temp[k++] = a[j++];
cnt += mid - i + 1;//记录逆序对
}
}
while (i <= mid) temp[k++] = a[i++];//清除余下的数
while (j <= r) temp[k++] = a[j++];//清除余下的数
for (int i = l, k = 0; i <= r; i++, k++)
a[i] = temp[k];
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
merge_sort(0,n-1);
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
cout << endl;
cout << "Reverse order pair:"<<cnt << endl;
return 0;
}