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

Posted qdu-lkc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了逆序对的数量(归并排序求解)相关的知识,希望对你有一定的参考价值。

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

逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。

输入格式

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

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

输出格式

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

数据范围

1n1000001≤n≤100000

输入样例:

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);
        }
}

以上是关于逆序对的数量(归并排序求解)的主要内容,如果未能解决你的问题,请参考以下文章

107. 超快速排序归并 / 逆序对的数量

归并排序应用-求逆序对数量

AcWing 788. 逆序对的数量

ACM常见问题之求逆序对

poj2299--归并排序求解逆序对

逆序对