问题
给你一串数字,判断有多少个逆序
例如:(2,3,1),(2,1),(3,1)就是两个逆序,逆序数为2
代码
public class Test {
private static final int[] temp=new int[30];
private static int count=0;
public static void main(String[] args)
{
int[] a={8,4,5,7,1,3,6,2};
Partition(a,0,a.length-1);
System.out.println("逆序个数为:"+count);
}
public static void Partition(int[] a,int left,int right)
{
if(left<right)
{
int mid=(left+right)/2;
Partition(a,left,mid);
Partition(a,mid+1,right);
Merge(a,left,mid,right);
}
}
public static void Merge(int[] a,int left,int mid,int right)
{
int l=left;
int m=mid+1;
int i=0;
while(l<=mid&&m<=right)
{
if(a[l]<a[m])
{
temp[i++]=a[l++];
}
else
{
temp[i++]=a[m++];
count+=mid-l+1;
}
}
while(l<=mid)//此时右边已经填完了,但是左边莫得,填进去
{
temp[i++]=a[l++];
}
while(m<=right)//此时左边已经填完了,但是右边莫得,填进去
{
temp[i++]=a[m++];
}
for(int j=0;j<i;j++)
{
a[left++]=temp[j];//将排序后的数组重新赋值到原来数组中
}
}
}
就是通过递归,折半,折半,然后拆成一个一个的,然后进行排序,先做到局部的有序,然后此时的count=mid-l+1就能有效统计逆序对数,之前用的count++,就是少了局部排序后的逆序对数
zxrdl是真nm无敌蛇皮宇宙爆炸强的离谱,我也是菜得离谱