打印所有的逆序对,并求出逆序对的总数。
package class02P;
import java.util.Arrays;
public class Code02P_ReversePair {
public static int ReversePair(int[] arr){
if(arr == null && arr.length < 2) return 0;
return MergeSort(arr, 0, arr.length - 1);
}
public static int MergeSort(int[] arr, int l, int r){
if(l == r) return 0;
int mid = l +((r - l) >> 1);
return MergeSort(arr, l, mid )
+ MergeSort(arr,mid + 1, r)
+ Merge(arr, l, mid, r);
}
public static int Merge(int[] arr, int l, int m, int r){
int[] help = new int[r - l + 1];
int p1 = l, p2 = m + 1;
int i = 0;
int result = 0;
while(p1 <= m && p2 <= r){
if(arr[p1] <= arr[p2]){
help[i ++] = arr[p2 ++];
}
else{
result ++;
System.out.println("逆序对:" + arr[p1] + " " + arr[p2]);
help[i ++] = arr[p2 ++];
}
}
if(m - p1 > 0){
result += (m - p1) * (r - m);
for(int j = p1 + 1; j <= m; j ++){
for (int k = m + 1; k <= r; k++) {
System.out.println("逆序对:" + arr[j] + " " + arr[k]);
}
}
}
while(p1 <= m){
help[i ++] = arr[p1 ++];
}
while(p2 <= r){
help[i ++] = arr[p2 ++];
}
for (i = 0; i < help.length; i++) {
arr[l + i] = help[i];
}
return result;
}
public static void main(String[] args) {
int[] arr = new int[5];
for (int i = 0; i < 5; i++) {
arr[i] = 5 - i;
}
int a = ReversePair(arr);
System.out.println(a);
}
}



