-
Notifications
You must be signed in to change notification settings - Fork 0
/
Count_Inversions.cpp
44 lines (41 loc) · 1.18 KB
/
Count_Inversions.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class Solution {
public:
// Function to count inversions in the array.
int countAndMerge(vector<int>& arr, int l, int m, int r) {
int n1 = m - l + 1, n2 = r - m;
vector<int> left(n1), right(n2);
for (int i = 0; i < n1; i++)
left[i] = arr[i + l];
for (int j = 0; j < n2; j++)
right[j] = arr[m + 1 + j];
int res = 0;
int i = 0, j = 0, k = l;
while (i < n1 && j < n2) {
if (left[i] <= right[j])
arr[k++] = left[i++];
else {
arr[k++] = right[j++];
res += (n1 - i);
}
}
while (i < n1)
arr[k++] = left[i++];
while (j < n2)
arr[k++] = right[j++];
return res;
}
int countInv(vector<int>& arr, int l, int r){
int res = 0;
if (l < r) {
int m = (r + l) / 2;
res += countInv(arr, l, m);
res += countInv(arr, m + 1, r);
res += countAndMerge(arr, l, m, r);
}
return res;
}
int inversionCount(vector<int> &arr) {
int n= arr.size();
return countInv(arr, 0, n-1);
}
};