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

来源:互联网 发布:彩票app源码下载 编辑:程序博客网 时间:2024/05/17 23:18

计算逆数对个数

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());}}
跟归并排序相比就加了两行代码

结果如图:



原创粉丝点击