题目
逆序对的数量
思路
在归并排序的基础上求逆序数,如果l-mid中的数大于mid+1-r中的数,则i和i之后的所有数都是指针j所指数的逆序数。与归并算法不同的是,本题需要有返回值,返回逆序数的数量。
代码
#include<iostream>
using namespace std;
typedef long long ll;
const int N = 100010;
int n;
int a[N], temp[N];
ll merge_sort(int l, int r)
{if (l >= r){return 0;}int mid = (l + r) / 2;ll sum=merge_sort(l, mid)+merge_sort(mid + 1, r);int k = 0, i = l, j = mid + 1;while (i <= mid && j <= r){if (a[i] <= a[j]){temp[k++] = a[i++];}else{temp[k++] = a[j++];sum = sum + mid - i + 1;}}while (i <= mid){temp[k++] = a[i++];}while (j <= r){temp[k++] = a[j++];}for (int i = l, j = 0;i <= r;i++, j++){a[i] = temp[j];}return sum;
}
int main()
{cin >> n;for (int i = 0;i < n;i++){cin >> a[i];}cout << merge_sort(0, n - 1) << endl;return 0;
}