利用归并排序求逆序对数量

//逆序对数量
#include
using namespace std;
using ll = long long;
const int N = 1e5 + 9;
ll n, a[N], tmp[N];

ll merge_sort(ll l, ll r)
{
	if (l >= r) return 0;
	ll mid = l + r >> 1;
	ll res = 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]) tmp[k++] = a[i++];
		else
		{
			i后面的数都满足条件:>j
			res += mid - i + 1;//逆序对数量
			tmp[k++] = a[j++];
		}
	}
	//剩下的直接加入
	while (i <= mid) tmp[k++] = a[i++];
	while (j <= r) tmp[k++] = a[j++];
	//传入原数组
	for (i = l, j = 0; i <= r; ++i, ++j) a[i] = tmp[j];
	return res;
}

int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin >> n;
	for (int i = 1; i <= n; ++i) cin >> a[i];
	cout << merge_sort(1 , n);
	return 0;
}

你可能感兴趣的:(c++,算法)