逆序对的数量

归并排序模板题

相关文章

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

//所有的逆序对个数 = 
                        /*
                        排序后,两个数都在左边的逆序对数
                        排序后,两个数都在右边的逆序对数
                        如果一个数在左边,一个数在右边,在归并的过程中
                        */
//左边 <= 右边,正常归并。如果左边 > 右边
//那么左边往右的所有数都可以和右边的第一个数构成逆序对
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;
    }
}
相关推荐
却道天凉_好个秋几秒前
计算机网络:CDN
学习·音视频·cdn
大熊背12 分钟前
树莓派相机自动白平衡详解(二)
算法·白平衡·isppipeline
圆奋奋16 分钟前
FreeRTOS学习(十)- 最核心的内容:优先级抢占式调度 + 上下文切换
学习·freertos
Scabbards_30 分钟前
面试Leetcode - 算法合集
算法·leetcode·面试
chuan.bai35 分钟前
Java RAG 实战附录:qwen3 与 bge-m3 模型切换指南
java·人工智能·算法
wuyk55536 分钟前
7.AVL 树:第一个自平衡二叉搜索树
开发语言·stm32·单片机·算法
程序猿炎义36 分钟前
【llm-algo-leetcode学习笔记】显存与性能认知底座
笔记·学习·leetcode
SL_staff37 分钟前
销售知识管理的断点分析与技术解法:从3天找话术到秒级检索
java·开源·github
荣码38 分钟前
向量数据库选型:4种方案全测了,选错重来成本最高
java·python
rannn_11140 分钟前
【力扣hot100】二叉树专题+总结
java·算法·leetcode·二叉树