题目
一个数列,如果左边的数大,右边的数小,则称这两个数为一个逆序对。求出一个数列中右多少个逆序对。
解法1
暴力遍历所有可能的数对。
java
package com.company;
public class Test17 {
public static void main(String[] args) {
int[] arr={1 ,4 ,9, 6 ,2, 8, 7 ,3 ,5};
int count=0;
for (int i = 0; i < arr.length; i++) {
for (int j = i+1; j < arr.length; j++) {
if(arr[i]>arr[j]){
count++;
}
}
System.out.println(count);
}
System.out.println(count);
}
}
解法2
在归并排序的过程中,如果左半部分的数大于右半部分的数,则出现了逆序对,并且不止一个。
java
package com.company;
import java.util.Arrays;
public class Test18 {
public static int count=0;
public static void main(String[] args) {
int[] arr={1 ,4 ,9, 6 ,2, 8, 7 ,3 ,5};
sort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
System.out.println(count);
}
public static void sort(int[] arr,int fromIndex,int toIndex){
if(toIndex-fromIndex<=0){
return;
}
int mid=(fromIndex+toIndex)/2;
sort(arr,fromIndex,mid);
sort(arr,mid+1,toIndex);
int[] help=new int[toIndex-fromIndex+1];
int i=mid,j=toIndex,k=help.length-1;
while(i>=fromIndex && j>=mid+1){
if(arr[i]>arr[j]){
count=count+(j-mid);
help[k]=arr[i];
k--;
i--;
}else{
help[k]=arr[j];
k--;
j--;
}
}
System.out.println(count);
while(i>=fromIndex){
help[k]=arr[i];
k--;
i--;
}
while(j>=mid+1){
help[k]=arr[j];
k--;
j--;
}
i=fromIndex;
k=0;
for (int l = fromIndex; l <=toIndex ; l++) {
arr[l]=help[l-fromIndex];
}
}
}