java实现通过归并排序计算数组逆数对个数

计算逆数对个数

public class Inv_numpair {
	
	private int count=0;     //逆数对的数量
	
	public static int[] geneateArrays(int n){
		int arr[]=new int[n];
		for(int i=0;i<n;i++){
			arr[i]=new Random().nextInt(n)+1;
		}
		return arr;
	}
	
	public  void mergesort(int[] arr,int n){
		__mergesort(arr,0,n-1);
	}
	
    public  void __mergesort(int[] arr,int l,int r){
		
     	if(l>=r)      
  		   return;
				
		int mid=(l+r)/2;
		__mergesort(arr,l,mid);
		__mergesort(arr,mid+1,r);
		if(arr[mid]>arr[mid+1])     //若arr[mid]<arr[mid+1],则数组已经有序,if判断下减少了归并步骤
		    __merge(arr,l,mid,r);
	}
	//将arr[l,mid]和arr[mid+1,r]两个部分进行归并
	public  void __merge(int[] arr,int l,int mid,int r){
		int aux[]=new int[r-l+1];
		for(int i=l;i<=r;i++){
			aux[i-l]=arr[i];   //i-l:减去偏移量
		}
		int i=l,j=mid+1;  //分别指向两个数组的开头
		for(int k=l;k<=r;k++){
			
			if(i>mid){   //若aux[]左半边的元素都访问完了,则将aux右半边剩余元素赋值回arr[]
				arr[k]=aux[j-l];
				j++;
			}
			else if(j>r){  //若aux[]右半边的元素都访问完了,则将aux左半边剩余元素赋值回arr[]
				arr[k]=aux[i-l];
				i++;
			}
			else if(aux[j-l]<aux[i-l]){ //在aux[]中比较后,将正确结果赋值回arr[]
				count=count+mid-i+1;
				arr[k]=aux[j-l];
				j++;
			}else{       //aux[i-l]<=aux[j-l]
				arr[k]=aux[i-l];
				i++;
			}
			
		}
	}
	
	public int count(){
		return count;
	}
	
	
	public static void main(String[] args) {
		int arr[] =MAIN.geneateArrays(12);
		for(int i=0;i<arr.length;i++){
			System.out.print(" "+arr[i]);
		}
		Inv_numpair in=new Inv_numpair();
		in.mergesort(arr,arr.length);
		System.out.println();
		System.out.println("逆数对的数量: "+in.count());
		
	}

}
跟归并排序相比就加了两行代码

结果如图:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值