题目描述:
分析:
可以利用归并排序,只要在排序的过程中出现左边的值大于右边的值时打印出这对数字。(就是归并算法,只是多了一句打印的语句而已。)
java代码实现 (时间复杂度o(n*lgn)):
public static void sort(int[] obs) { //归并排序算法。
sort(obs,0,obs.length-1) ;
}
private static void sort(int[]obs, int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
sort(obs,left, mid);
sort(obs,mid + 1, right);
mergeSort(obs,left, mid, right);
}
}
private static void mergeSort(int[]obs, int left, int mid, int right) {
int[] tempObj = new int[obs.length];
int _left = left ;
int _mid = mid+1 ;
int temp = left ;
while(_left <=mid && _mid <=right) {
if(obs[_left] <= obs[_mid]) {
tempObj[temp++] = obs[_left++];
} else {
System.out.print("[" + obs[_left] + "," + obs[_mid] + "]"); //添加一句打印就能求出逆序对,
tempObj[temp++] = obs[_mid++];
}
}
while(_left<=mid) {
tempObj[temp++] = obs[_left++];
}
while(_mid<=right) {
tempObj[temp++] = obs[_mid++];
}
while(left <= right) {
obs[left] = tempObj[left++] ;
}
}
测试:
public static void main(String[] args) throws FileNotFoundException {
int []obs = {7,5,6,4};
MergeSort.sort(obs);
}
输出:[7,5][6,4][5,4][7,6]