Inversion Count
#include <iostream>#include <vector>using namespace std;
// Function to merge two sorted subarrays and count inversionslong long merge(vector<long long> &arr, int s, int e) { int mid = s + (e - s) / 2; // Calculate mid-point
int len1 = mid - s + 1; // Size of left subarray int len2 = e - mid; // Size of right subarray
vector<long long> left(len1); vector<long long> right(len2);
// Copy data into left and right subarrays for (int i = 0; i < len1; i++) left[i] = arr[s + i]; for (int i = 0; i < len2; i++) right[i] = arr[mid + 1 + i];
long long inversions = 0; int i = 0, j = 0, k = s;
// Merging and counting inversions while (i < len1 && j < len2) { if (left[i] <= right[j]) { arr[k++] = left[i++]; } else { arr[k++] = right[j++]; inversions += (len1 - i); // Elements left in left subarray are greater than right[j] } }
// Copy remaining elements from left subarray while (i < len1) { arr[k++] = left[i++]; }
// Copy remaining elements from right subarray while (j < len2) { arr[k++] = right[j++]; }
return inversions; // Return total inversions counted in this merge step}
// Recursive function to implement merge sort and count inversionslong long mergeSort(vector<long long> &arr, int s, int e) { if (s >= e) return 0; // Base case: when only one element is left
int mid = s + (e - s) / 2; long long inversions = 0;
// Count inversions in left half inversions += mergeSort(arr, s, mid);
// Count inversions in right half inversions += mergeSort(arr, mid + 1, e);
// Count inversions while merging inversions += merge(arr, s, e);
return inversions;}
// Function to count total inversions in the arraylong long inversionCount(vector<long long> &arr) { return mergeSort(arr, 0, arr.size() - 1);}
// Driver functionint main() { int n; cout << "Enter the size of the array: "; cin >> n;
vector<long long> arr(n); cout << "Enter the elements of the array: "; for (int i = 0; i < n; i++) { cin >> arr[i]; }
long long result = inversionCount(arr); cout << "Total Inversions: " << result << endl;
return 0;}
Example Walkthrough:
Input:
Enter the size of the array: 4Enter the elements of the array: 8 4 2 1
- Splitting Phase (Recursive Calls)
Left: [8, 4] Right: [2, 1]Left: [8] [4] Right: [2] [1]
- Merging Phase
Merging [8] and [4] → [4, 8] (1 inversion: (8,4))Merging [2] and [1] → [1, 2] (1 inversion: (2,1))Merging [4, 8] and [1, 2] → [1, 2, 4, 8]Additional 4 inversions: (4,1), (4,2), (8,1), (8,2)
- Total Inversions:
1 + 1 + 4 = 6
Output:
Total Inversions: 6