Inversion count in Array
Given an array a[]. The task is to find the inversion count of a[]. Where two elements a[i] and a[j] form an inversion if a[i] > a[j] and i < j.
Input: arr[] = {8, 4, 2, 1}
Output: 6
Explanation: Given array has six inversions: (8, 4), (4, 2), (8, 2), (8, 1), (4, 1), (2, 1).
Input: arr[] = {1, 20, 6, 4, 5}
Output: 5
Explanation: Given array has five inversions: (20, 6), (20, 4), (20, 5), (6, 4), (6, 5).
public class InversionCount {
// Main function to count inversions
public static int countInversions(int[] arr) {
return mergeSortAndCount(arr, 0, arr.length - 1);
}
// Modified merge sort
private static int mergeSortAndCount(int[] arr, int left, int right) {
int count = 0;
if (left < right) {
int mid = (left + right) / 2;
count += mergeSortAndCount(arr, left, mid);
count += mergeSortAndCount(arr, mid + 1, right);
count += mergeAndCount(arr, left, mid, right);
}
return count;
}
// Merge step that also counts inversions
private static int mergeAndCount(int[] arr, int left, int mid, int right) {
int[] leftArr = java.util.Arrays.copyOfRange(arr, left, mid + 1);
int[] rightArr = java.util.Arrays.copyOfRange(arr, mid + 1, right + 1);
int i = 0, j = 0, k = left, swaps = 0;
while (i < leftArr.length && j < rightArr.length) {
if (leftArr[i] <= rightArr[j]) {
arr[k++] = leftArr[i++];
} else {
arr[k++] = rightArr[j++];
swaps += (leftArr.length - i); // Count inversions
}
}
// Copy remaining elements
while (i < leftArr.length) {
arr[k++] = leftArr[i++];
}
while (j < rightArr.length) {
arr[k++] = rightArr[j++];
}
return swaps;
}
// Test the function
public static void main(String[] args) {
int[] arr = {2, 4, 1, 3, 5};
int count = countInversions(arr);
System.out.println("Inversion Count = " + count); // Output: 3
}
}
Comments
Post a Comment