// C++ program to Count
// Inversions in an array
// using Merge Sort
#include <bits/stdc++.h>
using namespace std;
int _mergeSort(int arr[], int temp[], int left, int right);
int merge(int arr[], int temp[], int left, int mid, int right);
/* This function sorts the input array and returns the
number of inversions in the array */
int mergeSort(int arr[], int array_size)
{
int temp[array_size];
return _mergeSort(arr, temp, 0, array_size - 1);
}
/* An auxiliary recursive function that sorts the input array and
returns the number of inversions in the array. */
int _mergeSort(int arr[], int temp[], int left, int right)
{
int mid, inv_count = 0;
if (right > left) {
/* Divide the array into two parts and
call _mergeSortAndCountInv()
for each of the parts */
mid = (right + left) / 2;
/* Inversion count will be sum of
inversions in left-part, right-part
and number of inversions in merging */
inv_count += _mergeSort(arr, temp, left, mid);
inv_count += _mergeSort(arr, temp, mid + 1, right);
/*Merge the two parts*/
inv_count += merge(arr, temp, left, mid + 1, right);
}
return inv_count;
}
/* This funt merges two sorted arrays
and returns inversion count in the arrays.*/
int merge(int arr[], int temp[], int left,
int mid, int right)
{
int i, j, k;
int inv_count = 0;
i = left; /* i is index for left subarray*/
j = mid; /* j is index for right subarray*/
k = left; /* k is index for resultant merged subarray*/
while ((i <= mid - 1) && (j <= right)) {
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
}
else {
temp[k++] = arr[j++];
/* this is tricky -- see above
explanation/diagram for merge()*/
inv_count = inv_count + (mid - i);
}
}
/* Copy the remaining elements of left subarray
(if there are any) to temp*/
while (i <= mid - 1)
temp[k++] = arr[i++];
/* Copy the remaining elements of right subarray
(if there are any) to temp*/
while (j <= right)
temp[k++] = arr[j++];
/*Copy back the merged elements to original array*/
for (i = left; i <= right; i++)
arr[i] = temp[i];
return inv_count;
}
// Driver code
int main()
{
int arr[] = { 1, 20, 6, 4, 5 };
int n = sizeof(arr) / sizeof(arr[0]);
int ans = mergeSort(arr, n);
cout << " Number of inversions are " << ans;
return 0;
}
// This is code is contributed by rathbhupendra
Ly8gQysrIHByb2dyYW0gdG8gQ291bnQgCi8vIEludmVyc2lvbnMgaW4gYW4gYXJyYXkgCi8vIHVzaW5nIE1lcmdlIFNvcnQgCiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPiAKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgCgppbnQgX21lcmdlU29ydChpbnQgYXJyW10sIGludCB0ZW1wW10sIGludCBsZWZ0LCBpbnQgcmlnaHQpOyAKaW50IG1lcmdlKGludCBhcnJbXSwgaW50IHRlbXBbXSwgaW50IGxlZnQsIGludCBtaWQsIGludCByaWdodCk7IAoKLyogVGhpcyBmdW5jdGlvbiBzb3J0cyB0aGUgaW5wdXQgYXJyYXkgYW5kIHJldHVybnMgdGhlIApudW1iZXIgb2YgaW52ZXJzaW9ucyBpbiB0aGUgYXJyYXkgKi8KaW50IG1lcmdlU29ydChpbnQgYXJyW10sIGludCBhcnJheV9zaXplKSAKeyAKCWludCB0ZW1wW2FycmF5X3NpemVdOyAKCXJldHVybiBfbWVyZ2VTb3J0KGFyciwgdGVtcCwgMCwgYXJyYXlfc2l6ZSAtIDEpOyAKfSAKCi8qIEFuIGF1eGlsaWFyeSByZWN1cnNpdmUgZnVuY3Rpb24gdGhhdCBzb3J0cyB0aGUgaW5wdXQgYXJyYXkgYW5kIApyZXR1cm5zIHRoZSBudW1iZXIgb2YgaW52ZXJzaW9ucyBpbiB0aGUgYXJyYXkuICovCmludCBfbWVyZ2VTb3J0KGludCBhcnJbXSwgaW50IHRlbXBbXSwgaW50IGxlZnQsIGludCByaWdodCkgCnsgCglpbnQgbWlkLCBpbnZfY291bnQgPSAwOyAKCWlmIChyaWdodCA+IGxlZnQpIHsgCgkJLyogRGl2aWRlIHRoZSBhcnJheSBpbnRvIHR3byBwYXJ0cyBhbmQgCgkJY2FsbCBfbWVyZ2VTb3J0QW5kQ291bnRJbnYoKSAKCQlmb3IgZWFjaCBvZiB0aGUgcGFydHMgKi8KCQltaWQgPSAocmlnaHQgKyBsZWZ0KSAvIDI7IAoKCQkvKiBJbnZlcnNpb24gY291bnQgd2lsbCBiZSBzdW0gb2YgCgkJaW52ZXJzaW9ucyBpbiBsZWZ0LXBhcnQsIHJpZ2h0LXBhcnQgCgkJYW5kIG51bWJlciBvZiBpbnZlcnNpb25zIGluIG1lcmdpbmcgKi8KCQlpbnZfY291bnQgKz0gX21lcmdlU29ydChhcnIsIHRlbXAsIGxlZnQsIG1pZCk7IAoJCWludl9jb3VudCArPSBfbWVyZ2VTb3J0KGFyciwgdGVtcCwgbWlkICsgMSwgcmlnaHQpOyAKCgkJLypNZXJnZSB0aGUgdHdvIHBhcnRzKi8KCQlpbnZfY291bnQgKz0gbWVyZ2UoYXJyLCB0ZW1wLCBsZWZ0LCBtaWQgKyAxLCByaWdodCk7IAoJfSAKCXJldHVybiBpbnZfY291bnQ7IAp9IAoKLyogVGhpcyBmdW50IG1lcmdlcyB0d28gc29ydGVkIGFycmF5cyAKYW5kIHJldHVybnMgaW52ZXJzaW9uIGNvdW50IGluIHRoZSBhcnJheXMuKi8KaW50IG1lcmdlKGludCBhcnJbXSwgaW50IHRlbXBbXSwgaW50IGxlZnQsIAoJCWludCBtaWQsIGludCByaWdodCkgCnsgCglpbnQgaSwgaiwgazsgCglpbnQgaW52X2NvdW50ID0gMDsgCgoJaSA9IGxlZnQ7IC8qIGkgaXMgaW5kZXggZm9yIGxlZnQgc3ViYXJyYXkqLwoJaiA9IG1pZDsgLyogaiBpcyBpbmRleCBmb3IgcmlnaHQgc3ViYXJyYXkqLwoJayA9IGxlZnQ7IC8qIGsgaXMgaW5kZXggZm9yIHJlc3VsdGFudCBtZXJnZWQgc3ViYXJyYXkqLwoJd2hpbGUgKChpIDw9IG1pZCAtIDEpICYmIChqIDw9IHJpZ2h0KSkgeyAKCQlpZiAoYXJyW2ldIDw9IGFycltqXSkgeyAKCQkJdGVtcFtrKytdID0gYXJyW2krK107IAoJCX0gCgkJZWxzZSB7IAoJCQl0ZW1wW2srK10gPSBhcnJbaisrXTsgCgoJCQkvKiB0aGlzIGlzIHRyaWNreSAtLSBzZWUgYWJvdmUgCgkJCWV4cGxhbmF0aW9uL2RpYWdyYW0gZm9yIG1lcmdlKCkqLwoJCQlpbnZfY291bnQgPSBpbnZfY291bnQgKyAobWlkIC0gaSk7IAoJCX0gCgl9IAoKCS8qIENvcHkgdGhlIHJlbWFpbmluZyBlbGVtZW50cyBvZiBsZWZ0IHN1YmFycmF5IAooaWYgdGhlcmUgYXJlIGFueSkgdG8gdGVtcCovCgl3aGlsZSAoaSA8PSBtaWQgLSAxKSAKCQl0ZW1wW2srK10gPSBhcnJbaSsrXTsgCgoJLyogQ29weSB0aGUgcmVtYWluaW5nIGVsZW1lbnRzIG9mIHJpZ2h0IHN1YmFycmF5IAooaWYgdGhlcmUgYXJlIGFueSkgdG8gdGVtcCovCgl3aGlsZSAoaiA8PSByaWdodCkgCgkJdGVtcFtrKytdID0gYXJyW2orK107IAoKCS8qQ29weSBiYWNrIHRoZSBtZXJnZWQgZWxlbWVudHMgdG8gb3JpZ2luYWwgYXJyYXkqLwoJZm9yIChpID0gbGVmdDsgaSA8PSByaWdodDsgaSsrKSAKCQlhcnJbaV0gPSB0ZW1wW2ldOyAKCglyZXR1cm4gaW52X2NvdW50OyAKfSAKCi8vIERyaXZlciBjb2RlIAppbnQgbWFpbigpIAp7IAoJaW50IGFycltdID0geyAxLCAyMCwgNiwgNCwgNSB9OyAKCWludCBuID0gc2l6ZW9mKGFycikgLyBzaXplb2YoYXJyWzBdKTsgCglpbnQgYW5zID0gbWVyZ2VTb3J0KGFyciwgbik7IAoJY291dCA8PCAiIE51bWJlciBvZiBpbnZlcnNpb25zIGFyZSAiIDw8IGFuczsgCglyZXR1cm4gMDsgCn0gCgovLyBUaGlzIGlzIGNvZGUgaXMgY29udHJpYnV0ZWQgYnkgcmF0aGJodXBlbmRyYSAK