采用归并排序思想解决逆序对数问题

来源:互联网 发布:提高英语水平的软件 编辑:程序博客网 时间:2024/06/06 01:44
//归并排序解逆序对数问题public class MergeSort {static int count=0;public static void mergeSort(int[] arr,int p,int r){if (p<r){int q=(p+r)/2;mergeSort(arr,p,q);mergeSort(arr,q+1,r);merge(arr,p,q,r);}}public static void merge(int[] arr,int p,int q,int r){int n1=q-p+1;int n2=r-q;int[] arrL=new int[n1+1];int[] arrR=new int[n2+1];for (int i=0;i<n1 ;i++ ){arrL[i]=arr[p+i];}for (int j=0;j<n2 ;j++ ){arrR[j]=arr[q+j+1];}arrL[n1]=65535;arrR[n2]=65535;int x=0,y=0;for (int k=p;k<=r ;k++ ){if (arrL[x]<=arrR[y]){arr[k]=arrL[x];x++;}else{arr[k]=arrR[y];count=count+n1-x;//若arrL[x]>arrR[y],arrL中大于等于arrL[x]的数都比arrR[y]大,都与arrR[y]是逆序对for (int m=x;m<n1 ;m++ ){System.out.println("["+arrL[m]+","+arrR[y]+"]");}y++;}}}public static void main(String[] args) {int[] arr={2,3,8,6,1};mergeSort(arr,0,arr.length-1);System.out.println("count:"+count);}}[6,1][2,1][3,1][8,1][8,6]count:5

1 0
原创粉丝点击