逆序对的数量

归并排序模板题

相关文章

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

//所有的逆序对个数 = 
                        /*
                        排序后,两个数都在左边的逆序对数
                        排序后,两个数都在右边的逆序对数
                        如果一个数在左边,一个数在右边,在归并的过程中
                        */
//左边 <= 右边,正常归并。如果左边 > 右边
//那么左边往右的所有数都可以和右边的第一个数构成逆序对
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 分钟前
在linux服务器上DNS正常,但是java应用调用第三方解析域名报错
java·linux·服务器
JustDI-CM4 分钟前
AI学习笔记-提示词工程
人工智能·笔记·学习
悟纤4 分钟前
学习与专注音乐流派 (Study & Focus Music):AI 音乐创作终极指南 | Suno高级篇 | 第33篇
大数据·人工智能·深度学习·学习·suno·suno api
爱写bug的野原新之助5 分钟前
加密摘要算法MD5、SHA、HMAC:学习笔记
笔记·学习
YuTaoShao8 分钟前
【LeetCode 每日一题】3634. 使数组平衡的最少移除数目——(解法一)排序+滑动窗口
算法·leetcode·排序算法
波波00715 分钟前
每日一题:.NET 的 GC是如何分代工作的?
算法·.net·gc
撩得Android一次心动18 分钟前
Android LiveData 全面解析:使用Java构建响应式UI【源码篇】
android·java·android jetpack·livedata
组合缺一22 分钟前
Solon AI (Java) v3.9 正式发布:全能 Skill 爆发,Agent 协作更专业!仍然支持 java8!
java·人工智能·ai·llm·agent·solon·mcp
风暴之零25 分钟前
变点检测算法PELT
算法
深鱼~25 分钟前
视觉算法性能翻倍:ops-cv经典算子的昇腾适配指南
算法·cann