逆序对的数量

归并排序模板题

相关文章

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

//所有的逆序对个数 = 
                        /*
                        排序后,两个数都在左边的逆序对数
                        排序后,两个数都在右边的逆序对数
                        如果一个数在左边,一个数在右边,在归并的过程中
                        */
//左边 <= 右边,正常归并。如果左边 > 右边
//那么左边往右的所有数都可以和右边的第一个数构成逆序对
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;
    }
}
相关推荐
Hello娃的1 分钟前
【量子力学】Hohenberg-Kohn 定理
人工智能·算法
忘记9268 分钟前
什么是spring boot
java·spring boot·后端
老马啸西风8 分钟前
成熟企业级技术平台 MVE-010-IGA(Identity Governance & Administration,身份治理与管理)平台
人工智能·深度学习·算法·职场和发展
Hello World呀11 分钟前
Java实现手机号和身份证号脱敏工具类
java·开发语言
曹牧13 分钟前
Java:serialVersionUID
java·开发语言
老马啸西风21 分钟前
成熟企业级技术平台 MVE-010-app 管理平台
人工智能·深度学习·算法·职场和发展
●VON23 分钟前
小V健身助手开发手记(四):打造专属健康空间——以 PersonContent构建统一风格的个人中心
人工智能·学习·openharmony·开源鸿蒙·von
●VON25 分钟前
小V健身助手开发手记(三):用成就点燃坚持——构建可视化激励系统
学习·openharmony·总结·开源鸿蒙·von
Nan_Shu_61430 分钟前
学习:Vue (2)
javascript·vue.js·学习
lzh_2001101234 分钟前
树状数组理解
算法