//归并排序解逆序对数问题
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
采用归并排序思想解决逆序对数问题
最新推荐文章于 2019-08-19 14:53:24 发布