Count Inversions in an Array?
int MergeSortAndCount(int[] arr, int[] temp, int left, int right)
int invCount = 0;
if (right > left)
int mid = (right + left) / 2;
invCount += MergeSortAndCount(arr, temp, left, mid);
invCount += MergeSortAndCount(arr, temp, mid + 1, right);
invCount += Merge(arr, temp, left, mid + 1, right);
return invCount;
int Merge(int[] arr, int[] temp, int left, int mid, int right)
int i = left, j = mid, k = left;
int invCount = 0;
while (i <= mid - 1 && j <= right)
if (arr[i] <= arr[j])
temp[k++] = arr[i++];
else
temp[k++] = arr[j++];
invCount += (mid - i); // Count inversions
while (i <= mid - 1)
temp[k++] = arr[i++];
Follow on:
while (j <= right)
temp[k++] = arr[j++];
for (int idx = left; idx <= right; idx++)
arr[idx] = temp[idx];
return invCount;
Explanation:
Using a modified merge sort to count pairs where arr[i] > arr[j] for i < j efficiently.