逆序對的數量(歸併排序求解)

給定一個長度爲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);
        }
}
相關文章
相關標籤/搜索