import java.util.*; public class InversionPair { public static int inversion(int[] a, int low, int mid, int high) { int count = 0; int left_size = mid-low+2; int[] left = new int[left_size]; for(int i=0; i<left_size-1; i++) { left[i]=a[low+i]; } left[left_size-1]=Integer.MAX_VALUE; int right_size = high-mid+1; int[] right = new int[right_size]; for(int i=0; i<right_size-1; i++) { right[i]=a[mid+1+i]; } right[right_size-1]=Integer.MAX_VALUE; int size = high-low+1; int p=0, q=0; left_size--; right_size--; for(int i=0; i<size; i++) { if(left[p]>right[q]) { if(left[p]!=Integer.MAX_VALUE) { count += left_size-p; } a[i+low]=right[q++]; } else { a[i+low]=left[p++]; } } return count; } public static int inversionCount(int[] a, int low, int high) { if(low==high) { return 0; } int mid = low + (high-low)/2; int count = inversionCount(a, low, mid); count += inversionCount(a, mid+1, high); count += inversion(a, low, mid, high); return count; } public static void main(String[] args) { int[] a = {2,3,8,6,1,0}; System.out.println("Origin: " + Arrays.toString(a)); int count = inversionCount(a, 0, a.length-1); System.out.println("Sorted: " + Arrays.toString(a)); System.out.println("Inversion Count=" + count); } }