逆序对问题
描述
在一个数组中,左边的数如果比右边的数大,则这两个数构成一个逆序对,请打印所有逆序对.
逆序对问题使用归并排序的思想,在合并的时候,如果左边指针p1指向的数比右边指针p2指向的数要大,那么p1到中间位置的所有数都会比p2指针指向的数要大,这些都会是逆序对。
public class Reverse {
public static void reverse(int[] arr){
if(arr == null || arr.length < 2){
return;
}
mergeSort(arr,0,arr.length - 1);
}
private static void mergeSort(int[] arr, int L, int R) {
if(L == R){
return;
}
int mid = L + ((R - L) >> 1);
mergeSort(arr,L,mid);
mergeSort(arr,mid + 1,R);
merge(arr,L,mid,R);
}
private static void merge(int[] arr, int l, int mid, int r) {
int[] help = new int[r - l + 1];
int p1 = l;
int p2 = mid + 1;
int current = 0;
while(p1 <= mid && p2 <= r){
if(arr[p1] > arr[p2]){ //p1指针右边的数比p2都要打
for(int i = p1;i <= mid;i++)
System.out.println("["+arr[i]+","+arr[p2]+"]"); //打印逆序对
}
help[current++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
}
while (p1 <= mid){
help[current++] = arr[p1++];
}
while (p2 <= r){
help[current++] = arr[p2++];
}
for (int i = 0;i < help.length;i++){
arr[l + i] = help[i];
}
}
}