如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4。给出一个整数序列,求该序列的逆序数。
第2 - N + 1行:序列中的元素(0 <= A i <= 10^9)
4 2 4 3 1
4思路:归并思想:将整个序列分成两部分,分别递归将这两部分排好序之后,再将两个有序的序列合并为一个有序的序列。将两个各自有序的序列合并,若前面序列a[i]大于后面序列的a[j],说明 i 开始的所有数都比第二个序列的 数a[j]要大,累加计算逆序数
Code:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static long a[]=new long[50001];
static long b[]=new long[50001];
static long num=0;
static void merger(long a[],int p,int mid,int r){
int i=p,j=mid+1;
int k=p;
while(i<=mid && j<=r){
if(a[i]<=a[j])b[k++]=a[i++];
else{
b[k++]=a[j++];
num+=mid-i+1; //!!!
}
}
while(i<=mid)b[k++]=a[i++];
while(j<=r)b[k++]=a[j++];
for(i=p;i<=r;i++)
a[i]=b[i];
}
static void mergerSort(long a[],int p,int r){
if(p<r){
int mid=(p+r)/2;
mergerSort(a,p,mid);
mergerSort(a,mid+1,r);
merger(a,p,mid,r);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
Arrays.fill(a,0);
for(int i=0;i<n;i++)
a[i]=scan.nextLong();
mergerSort(a,0,n-1);
System.out.println(num);
}
}