#include <stdio.h>
#include <stdlib.h>
// Merge two sorted halves and count inversions
long long merge(int arr[], int temp[], int left, int mid, int right) {
int i = left; // start of left subarray
int j = mid + 1; // start of right subarray
int k = left; // start of temp array
long long inv_count = 0;
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++]; // take from left
} else {
temp[k++] = arr[j++]; // take from right
inv_count += (mid - i + 1); // count inversions
}
}
while (i <= mid) {
temp[k++] = arr[i++]; // copy remaining left
}
while (j <= right) {
temp[k++] = arr[j++]; // copy remaining right
}
for (int idx = left; idx <= right; idx++) {
arr[idx] = temp[idx]; // copy back to original
}
return inv_count;
}
// Recursive merge sort that counts inversions
long long mergeSort(int arr[], int temp[], int left, int right) {
long long inv_count = 0;
if (left < right) {
int mid = left + (right - left) / 2;
inv_count += mergeSort(arr, temp, left, mid); // left half
inv_count += mergeSort(arr, temp, mid + 1, right); // right half
inv_count += merge(arr, temp, left, mid, right); // merge and count
}
return inv_count;
}
int main() {
int arr[] = {2, 4, 1, 3, 5};
int n = sizeof(arr) / sizeof(arr[0]);
int *temp = (int *)malloc(n * sizeof(int));
long long result = mergeSort(arr, temp, 0, n - 1);
free(temp);
// Print sorted array
for (int i = 0; i < n; i++) {
printf("%d", arr[i]);
if (i < n - 1) printf(" -> ");
}
printf(" -> null\n");
// Print inversion count
printf("Total inversions: %lld\n", result);
return 0;
}if (arr[i] <= arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; inv_count += (mid - i + 1); }
merge step: count inversions when right element is smaller than left
inv_count += mergeSort(arr, temp, left, mid); inv_count += mergeSort(arr, temp, mid + 1, right); inv_count += merge(arr, temp, left, mid, right);
divide array, count inversions in halves and merge step
1 -> 2 -> 3 -> 4 -> 5 -> null
Total inversions: 3