码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-01-12 21:53:08      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:归并   逆序   public   preview   class   return   util   否则   pre   

给定一个长度为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);
        }
}

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

标签:归并   逆序   public   preview   class   return   util   否则   pre   

原文地址:https://www.cnblogs.com/qdu-lkc/p/12184728.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!