当前位置: 首页 > news >正文

归并排序-逆序对

之前的文章里有写归并排序的最小和问题(归并排序-最小和-CSDN博客),逆序对问题其实跟最小和问题的本质一样:

逆序对:给定一个数据,从左往右,从第一个数开始,它右边每一个比它小的都能和它组成一个逆序对,比如{3, 4, 1, 2},对于3来说右边比它小的只有1,2,对于4来说,比它小的也只有1,2,对于1和2来说右边没有比它们自己小的,所以最终的逆序对是4,而{3, 4, 2,1}的逆序对则是5,因为2的右边有一个1比它小

最小和的解法过程中是寻找每一个数右边数组中比左边数组中大的数据有几个,而逆序对则寻找每一个数右边数组中比左边数组中小的数据有几个,只是在比较和拷贝的时候要从数组的最后一位开始,而不是下标为0的位置开始,由于思想同最小和是差不多的,这里就不细讲了,直接看代码:

public static void main(String[] args) {int arr[] = new int[]{3, 4, 1, 2};int length = arr.length;System.err.println(process(arr, 0, length - 1));for (int i = 0; i < length; i++) {System.err.println(arr[i]);}}private static int process(int arr[], int start, int end) {if (start == end) {return 0;}int middle = start + ((end - start) >> 1);//0 1return process(arr, start, middle) +process(arr, middle + 1, end) +merge(arr, start, middle, end);}/*** 核心逻辑就是对于右边数组中要严格比左边数组的数据小,满足条件就拷贝左边的数据* @param arr* @param start* @param middle* @param end* @return*/private static int merge(int arr[], int start, int middle, int end) {int result = 0;int[] help = new int[end - start + 1];int i = help.length - 1;int index1 = middle;int index2 = end;while (index1 >= start && index2 >= middle + 1) {result = result + (arr[index2] < arr[index1] ? (index2 - middle) : 0);help[i--] = arr[index2] < arr[index1] ? arr[index1--] : arr[index2--];}while (index1 >= start) {help[i--] = arr[index1--];}while (index2 >= middle + 1) {help[i--] = arr[index2--];}int length = help.length;for (int i1 = 0; i1 < length; i1++) {arr[start + i1] = help[i1];}return result;}

http://www.lryc.cn/news/287484.html

相关文章:

  • 爬虫笔记(二):实战58二手房
  • 一站式VR全景婚礼的优势表现在哪里?
  • 【硅谷甄选】强制使用 pnpm 包管理器工具
  • PHP AES加解密系列
  • QT基础篇(13)QT5数据库
  • ctfshow信息收集(web1-web20)
  • 从零学习Hession RPC
  • 实施精细化管理的六大关键步骤
  • QT+C++环境调用python函数可以进入python环境和模块,但是调用功能函数错误
  • 2024.1.24力扣每日一题——美丽塔I
  • 视频监控平台EasyCVR增加fMP4流媒体视频格式及其应用场景介绍
  • 使用Python的pygame库实现迷宫游戏
  • Linux新手村必备!这些常用操作命令你掌握了吗?
  • ReactNative进阶(三十六):iPad横屏适配
  • jsx中使用插槽
  • CentOS服务器拒绝SSH登录
  • React16源码: React中的completeUnitOfWork的源码实现
  • uniapp移动端——企业微信H5调用jssdk实现扫一扫,通过weixin-java-cp获取ticket签名,配置config
  • 【前端基础--1】
  • E2 Mysql的基本操作和用户权限
  • TCP 的三次握手和四次挥手
  • mybatisplus做SQL拦截添加自定义排序
  • 代码随想录算法训练营第29天(回溯算法05 | * 491.递增子序列 * 46.全排列 * 47.全排列 II
  • mac docker desktop被禁用了,如何使用虚拟机lima运行docker
  • sublime text 开启vim模式
  • JS词法结构
  • 程序媛的mac修炼手册-- 如何用Python节省WPS会员费
  • ASP.NET Core NE8实现HTTP Upgrade和HTTP CONNECT代理服务器
  • apipost和curl收不到服务器响应的HTTP/1.1 404 Not Found
  • javascript:计算一个坐标数组的最小值点、最大值点、中心点