Count Inversions In An Array
Brute force
Merge Sort (Divide and Conquer)
// Time: O(NlogN)
// Space: O(N)
long long _mergeSort(vector<int> &A, vector<int> &tmp, int start, int end) {
if (start + 1 >= end) return 0;
long long mid = (start + end) / 2, cnt = 0;
cnt += _mergeSort(A, tmp, start, mid);
cnt += _mergeSort(A, tmp, mid, end);
for (int i = start, j = mid, k = 0; i < mid || j < end; ++k) {
if (i >= mid || (j < end && A[j] < A[i])) {
tmp[k] = A[j++];
cnt += mid - i;
} else tmp[k] = A[i++];
}
for (int i = start; i < end; ++i) A[i] = tmp[i - start];
return cnt;
}
long long mergeSort(vector<int> &A, int start, int end) {
vector<int> tmp(A.size());
return _mergeSort(A, tmp, start, end);
}
long long countInversions(vector<int>& A) {
return mergeSort(A, 0, A.size());
}Last updated