如何求解数组中反序对的个数

package java程序员面试笔试宝典;

import java.util.Arrays;

public class 题8_5_18求解数组中反序对个数 {
	//归并排序算法没有明白,照着敲了一遍,但是结果也不对
	static int count=0;
	public static void main(String[] args) {
		int[] a={10,1,5,3,2,6};
		reverseCount(a);
		System.out.println(Arrays.toString(a));
		mergeSort(a, 0, a.length-1);
		System.out.println();
		System.out.println(Arrays.toString(a));
		System.out.println();
		System.out.println(count);
	}
	
	public static void merge(int[] a,int p,int r){
		int q=(r+p)/2;
		int n1=q-p+1;
		int n2=r-q;
		int[] L=new int[n1];
		int[] R=new int[n2];
		int i=0;
		for (int k=p; i < L.length; i++) {
			L[i]=a[k++];
		}
		for (int j = 0,k=q+1; j < R.length; j++) {
			R[j]=a[k++];
		}
		int j,k;
		for (i = 0,j=0,k=p; i <L.length&&j<R.length; k++) {
			if(L[i]>R[j]){
				a[k]=R[j++];
				count+=q-i+1;
			}else{
				a[k]=L[i++];
			}
		}
		if(i<L.length){
			for ( j = i; j < L.length; j++) {
				a[k++]=L[j];
			}
		}
		if(j<R.length){
			for (i = j; i < R.length; i++) {
				a[k++]=R[i];
			}
		}
	}
	public static void mergeSort(int[] a, int p,int r){
		if(p<r){
			int q=(r+p)/2;
			mergeSort(a, p, q);
			mergeSort(a, q+1, r);
			merge(a,p,r);
		}
	}
	//蛮力法
	public static int reverseCount(int[] a){
		int count=0;
		for (int i = 0; i < a.length-1; i++) {
			for (int j = i+1; j < a.length; j++) {
				if(a[i]>a[j]){
					count++;
				}
			}
		}
		System.out.println(count);
		return count;
	}
}

猜你喜欢

转载自blog.csdn.net/m0_38068868/article/details/81737846
今日推荐