逆序对个数

题目

一个数列,如果左边的数大,右边的数小,则称这两个数为一个逆序对。求出一个数列中右多少个逆序对。

解法1

暴力遍历所有可能的数对。

java 复制代码
package com.company;

public class Test17 {
    public static void main(String[] args) {
        int[] arr={1	,4	,9,	6	,2,	8,	7	,3	,5};

        int count=0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = i+1; j < arr.length; j++) {
                if(arr[i]>arr[j]){
                    count++;
                }
            }
            System.out.println(count);
        }
        System.out.println(count);
    }
}

解法2

在归并排序的过程中,如果左半部分的数大于右半部分的数,则出现了逆序对,并且不止一个。

java 复制代码
package com.company;

import java.util.Arrays;

public class Test18 {
    public static int count=0;
    public static void main(String[] args) {
        int[] arr={1	,4	,9,	6	,2,	8,	7	,3	,5};

        sort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
        System.out.println(count);
    }
    public static void sort(int[] arr,int fromIndex,int toIndex){
        if(toIndex-fromIndex<=0){
            return;
        }
        int mid=(fromIndex+toIndex)/2;
        sort(arr,fromIndex,mid);
        sort(arr,mid+1,toIndex);
        int[] help=new int[toIndex-fromIndex+1];
        int i=mid,j=toIndex,k=help.length-1;
        while(i>=fromIndex && j>=mid+1){
            if(arr[i]>arr[j]){
                count=count+(j-mid);

                help[k]=arr[i];
                k--;
                i--;
            }else{
                help[k]=arr[j];
                k--;
                j--;
            }
        }
        System.out.println(count);
        while(i>=fromIndex){
            help[k]=arr[i];
            k--;
            i--;
        }
        while(j>=mid+1){
            help[k]=arr[j];
            k--;
            j--;
        }
        i=fromIndex;
        k=0;
        for (int l = fromIndex; l <=toIndex ; l++) {
            arr[l]=help[l-fromIndex];
        }
    }
}
相关推荐
数聚天成DeepSData7 分钟前
数聚天成 DeepSData 数据价值落地实战指南
java·maven·devops
小小小米粒17 分钟前
阿姆达尔定律(Amdahl‘s Law)
java·开发语言
知彼解己17 分钟前
Java 版本演进
java·开发语言·spring boot
DuHz29 分钟前
论文解读:用于数据分析的极值点对称模态分解方法 (Extreme-point Symmetric Mode Decomposition,ESMD)
论文阅读·算法·信息与通信·信号处理
极客先躯33 分钟前
高级java每日一道面试题-2026年05月11日-实战篇[Docker]-如何容器化金融产品推荐系统?
java·运维·docker·容器·金融·高级面试·金融产品推荐系统
HZZD_HZZD1 小时前
用电负荷聚类分析实战:基于`scikit-learn`的`K-Means`与`DBSCAN`双算法对比、`PCA`降维可视化与智能电表负荷画像全流程
算法·scikit-learn·kmeans
朱容zr3331331 小时前
为什么推荐使用自增主键?使用UUID作为主键的优缺点是什么?
java·运维·数据库·后端·mysql·面试·性能优化
MIngYaaa5201 小时前
2026暑期牛客多校1 2026-7-17
数据结构·算法
wabs6661 小时前
关于图论【卡码网107.寻找存在的路线的思考】
数据结构·算法·图论
半兽先生1 小时前
大模型技术开发与应用——4.大模型提示词工程实战
人工智能·算法