逆序对问题(Java实现)归并详解

 更新时间:2026年05月09日 11:52:14   作者:-添砖Java  
文章介绍了计算给定正整数序列中逆序对数量的方法,特别是使用归并排序进行拆分和合并时统计逆序对,通过递归拆分序列,并在合并过程中统计逆序对数量,从而得到整个序列的逆序对总数,此方法能有效处理包含重复数字的序列

题目

对于给定的一段正整数序列,逆序对就是序列中ai>aj,且i<j的有序对;注意序列中可能有重复数字,并分析算法的时间性能。

例如:有6个数字,分别是5,4,2,6,3,1,则逆序对数目是11。

思想

一个乱序的数组,使用归并排序的方法对其进行拆分拆分,最后剩余两个已经排好序的数组(如图1)

  • ​图1:

然后对两个数组再进行归并排序,排序的同时统计逆序对,比如2与1对比可以产生逆序对,则4与1、5与1也能产生逆序对,按照此思路即可统计出所有的逆序对。

代码:

package com.itwyc;

import java.util.*;

public class Main {
    public static long count = 0;   // 逆序对个数
    public static void getCount(int[] nums) {
        if (nums.length > 1) {
            int[] left_temp = getLeftTemp(nums, 0); // 得到左边数组           
            int[] right_temp = getLeftTemp(nums, 1);// 得到右边数组              
            getCount(left_temp); // 将得到的数组继续拆分                                   
            getCount(right_temp);
            merge(nums, left_temp, right_temp);// 归并排序,归并的同时统计逆序对                     
        }
    }

    public static int[] getLeftTemp(int[] temp, int a) {
        int[] current;
        if (a == 0) {
            current = new int[temp.length / 2];
            for (int i = 0; i < temp.length / 2; i++) {
                current[i] = temp[i];
            }
        } else {
            current = new int[temp.length - temp.length / 2];
            for (int i = 0; i < temp.length - temp.length / 2; i++) {
                current[i] = temp[temp.length / 2 + i];
            }
        }
        return current;
    }

    public static void merge(int[] nums, int[] left_temp, int[] right_temp) {
        int index = 0;
        int left = 0;
        int right = 0;
        int left_len = left_temp.length;
        int right_len = right_temp.length;
        while (left < left_len && right < right_len) {// 如果左边的数大于右边的数,则为逆序对                   
            if (left_temp[left] > right_temp[right]) {
                count += (left_len - left);// 如果此数为逆序对,则此数右边的数也为逆序对,因为两个数组内已经排好序                              
                nums[index++] = right_temp[right++];
            } else {
                nums[index++] = left_temp[left++];
            }
        }
        while (left < left_len) {
            nums[index++] = left_temp[left++];
        }
        while (right < right_len) {
            nums[index++] = right_temp[right++];
        }
    }

    public static void main(String[] args) {

        /**
         *  逆序对问题
         */
        int[] nums = {8, 7, 6, 5, 4, 3, 2, 1};
        getCount(nums);
        System.out.println("逆序对有" + count + "个.");
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java实现跨服务器上传文件功能

    Java实现跨服务器上传文件功能

    这篇文章主要为大家详细介绍了Java实现跨服务器上传文件功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • java检查服务器的连通两种方法代码分享

    java检查服务器的连通两种方法代码分享

    这篇文章主要介绍了java检查服务器的连通两种方法代码分享,涉及ping的介绍以及检查服务器连通的两种方法代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Spring中@Autowired和@Resource注解的使用区别详解

    Spring中@Autowired和@Resource注解的使用区别详解

    这篇文章主要介绍了Spring中@Autowired和@Resource注解的使用区别详解,@Autowired默认根据type进行注入,找到与指定类型兼容的 Bean 并进行注入,如果无法通过type匹配到对应的 Bean 的话,会根据name进行匹配,如果都匹配不到则抛出异常,需要的朋友可以参考下
    2023-11-11
  • 关于spring循环依赖问题及解决方案

    关于spring循环依赖问题及解决方案

    这篇文章主要介绍了关于spring循环依赖问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • java file.renameTo返回false的原因及解决方案

    java file.renameTo返回false的原因及解决方案

    这篇文章主要介绍了java file.renameTo返回false的原因及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • SpringBoot使用slf4j日志并输出到文件中的操作方法

    SpringBoot使用slf4j日志并输出到文件中的操作方法

    这篇文章主要介绍了SpringBoot使用slf4j日志并输出到文件中,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Spring使用注解和配置文件配置事务

    Spring使用注解和配置文件配置事务

    这篇文章主要为大家详细介绍了Spring使用注解和配置文件配置事务,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • WebService教程详解(一)

    WebService教程详解(一)

    WebService,顾名思义就是基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求,接下来通过本文给大家介绍WebService教程详解(一),对webservice教程感兴趣的朋友一起学习吧
    2016-03-03
  • 慢sql提前分析预警和动态sql替换-Mybatis-SQL

    慢sql提前分析预警和动态sql替换-Mybatis-SQL

    为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动态替换,从而快速止损
    2025-05-05
  • SWT(JFace)体验之Slider,Scale

    SWT(JFace)体验之Slider,Scale

    SWT(JFace)体验之Slider,Scale实现代码。
    2009-06-06

最新评论