逆序对的数量

归并排序模板题

相关文章

//采用归并排序,归并的过程可以算出逆序对的个数

//所有的逆序对个数 = 
                        /*
                        排序后,两个数都在左边的逆序对数
                        排序后,两个数都在右边的逆序对数
                        如果一个数在左边,一个数在右边,在归并的过程中
                        */
//左边 <= 右边,正常归并。如果左边 > 右边
//那么左边往右的所有数都可以和右边的第一个数构成逆序对
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main{
    static int n;
    static final int N = 100010;
    static int[] a = new int[N];
    static int[] t = new int[N];
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String[] args)throws IOException {
        n = Integer.parseInt(in.readLine());
        String[] data = in.readLine().split(" ");
        
        //读取数据
        for (int i = 0; i < n; i++) a[i] = Integer.parseInt(data[i]);
        
        //调用归并排序得到结果
        long res = merge_sort(a,0,n - 1);
        System.out.println(res);
        in.close();
    }
    public static long merge_sort(int a[],int l,int r){
        
        //分治结束条件
        if (l >= r) return 0;
        long res = 0;
        
        int mid = l + r >> 1;
        res = merge_sort(a,l,mid) + merge_sort(a,mid + 1,r);
        
        //归并算最终结果,当a[i] > a[j] 时要特殊处理
        int k = 0,i = l,j = mid + 1;
        while (i <= mid && j <= r){
            if (a[i] <= a[j]) t[k++] = a[i++];
            else {
                t[k++] = a[j++];
                
                //相当于计算[i,mid]之间有多少个数
                res += mid - i + 1;
            }
        }
        
        //剩余的数直接放入即可
        while (i <= mid) t[k++] = a[i++];
        while (j <= r) t[k++] = a[j++];
        
        //最后将排序的数还给a[]
        for(i = l,j = 0;i <= r;i++,j++) a[i] = t[j];
        
        return res;
    }
}
相关推荐
菠菠萝宝2 分钟前
【Java八股文】10-数据结构与算法面试篇
java·开发语言·面试·红黑树·跳表·排序·lru
不会Hello World的小苗8 分钟前
Java——链表(LinkedList)
java·开发语言·链表
陈无左耳、20 分钟前
HarmonyOS学习第3天: 环境搭建开启鸿蒙开发新世界
学习·华为·harmonyos
curemoon36 分钟前
理解都远正态分布中指数项的精度矩阵(协方差逆矩阵)
人工智能·算法·矩阵
Allen Bright42 分钟前
【Java基础-46.3】Java泛型通配符详解:解锁类型安全的灵活编程
java·开发语言
柃歌1 小时前
【UCB CS 61B SP24】Lecture 7 - Lists 4: Arrays and Lists学习笔记
java·数据结构·笔记·学习·算法
柃歌1 小时前
【UCB CS 61B SP24】Lecture 4 - Lists 2: SLLists学习笔记
java·数据结构·笔记·学习·算法
干炒 牛河1 小时前
数据结构:双链表list
数据结构·list
是姜姜啊!1 小时前
redis的应用,缓存,分布式锁
java·redis·spring
梨落秋溪、1 小时前
输入框元素覆盖冲突
java·服务器·前端