逆序对的数量(归并排序求解)

给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。java

逆序对的定义以下:对于数列的第 i 个和第 j 个元素,若是知足 i < j 且 a[i] > a[j],则其为一个逆序对;不然不是。spa

输入格式

第一行包含整数n,表示数列的长度。code

第二行包含 n 个整数,表示整个数列。xml

输出格式

输出一个整数,表示逆序对的个数。blog

数据范围

1n1000001≤n≤100000class

输入样例:

6
2 3 4 5 6 1

输出样例:



5
import java.util.Scanner;

public class Main {
         static long cnt=0;
         static int b[]=new int[100005];
         static int a[]=new int[100005];
         public static void merge_sort(int a[],int l,int r){
               if(l>=r) return;
               int mid=l+r>>1;
               merge_sort(a,l,mid);
               merge_sort(a,mid+1,r);
               int k=l,i=l,j=mid+1;
               while(i<=mid&&j<=r){
                     if(a[i]>a[j]){
                           b[k++]=a[j++];
                           cnt+=(mid-i+1);
                     }
                     else b[k++]=a[i++];
               }
               while(i<=mid) b[k++]=a[i++];
               while(j<=r) b[k++]=a[j++];
               for(int t=l;t<=r;t++) a[t]=b[t];
         }
         public static void main(String[] args) {
              Scanner scan=new Scanner(System.in);
              int n=scan.nextInt();
              for(int i=0;i<n;i++) a[i]=scan.nextInt();
              merge_sort(a,0,n-1);
              System.out.println(cnt);
        }
}
相关文章
相关标签/搜索