算法-归并排序-788. 逆序对的数量

题目

给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量。

逆序对的定义如下:对于数列的第 i 个和第 j个元素,如果满足 i<j且 a[i]>a[j],则其为一个逆序对;否则不是。

输入格式

第一行包含整数 n,表示数列的长度。

第二行包含 n个整数,表示整个数列。

输出格式

输出一个整数,表示逆序对的个数。

数据范围

1≤n≤100000,
数列中的元素的取值范围 [1,10的9次方]。

输入样例:
6
2 3 4 5 6 1
输出样例:
5

思路

  1. 采用分治的一个思路:引入归并排序的基本流程:
    1. [L,R]=>>[L,mid],[mid+1,R]
    2. 递归排序[L,mid]和[mid+1,R]
    3. 归并,将左右两个有序序列合并成一个有序序列
  2. 将所有的逆序对分成三大类:两个数同时出现在左半边;两个数同时出现在右半边;一个数出现在左半边,一个数出现在右半边==》假定归并排序的同时可以计算出逆序对的个数
    1. 两个数都在左半边的情况:merge_sort(L,mid)
    2. 两个数都在右半边的情况:merge_sort(mid+1,R)
    3. 一个数在左半边,一个数在右半边:计算出右边每一个数对应的逆序对的个数:s1,s2,s3...sm,相加即可;在归并排序的归并中,双指针进行归并,一个指在左半边,一个指在右半边,所以sj=mid-i+1;
  3. 本题的数据逆序对个数最多的情况是:整个排列是逆序的时候:有(n-1)+(n-2)+...+1,用c++会超过int的范围
  4. 本题的编外题:xmuoj | 正确排名总数

代码

Python代码

# 读入数据
n=int(input())
q=list(map(int,input().split()))
res =0
tmp=[0]*(n+5)
# 归并排序求得逆序对数量
def merge_sort(l,r):# 递归出口if l>=r:return 0mid=(l+r)//2# 两个数都在左半边或者都在右半边的数量res = merge_sort(l,mid)+merge_sort(mid+1,r)i=lj=mid+1k=0# 处理一个数在左半边,一个数在右半边的情况while i<=mid and j<=r:if q[i]<=q[j]:tmp[k]=q[i]k+=1i+=1else :tmp[k]=q[j]k+=1j+=1res+=mid-i+1 # 右半边对应的每一个数存在的逆序对数量# 扫尾工作while i<=mid:tmp[k]=q[i]k+=1i+=1while j<=r:tmp[k]=q[j]k+=1j+=1p=0# 物归原主for i in range(l,r+1):q[i]=tmp[p]p+=1return res
print(merge_sort(0,n-1))

C++代码

#include<iostream>
using namespace std;
typedef long long LL;//注意返回的数据可能会超过INT 的数值范围
const int N=1e6+10;
int n;
int q[N],tmp[N];
LL merge_sort(int l,int r){if(l>=r)return 0;int mid=l+r>>1;//右移一位,相当于取中间值LL res=merge_sort(l,mid)+merge_sort(mid+1,r);//归并过程int k=0,i=l,j=mid+1;while(i<=mid&&j<=r)if(q[i]<=q[j])tmp[k++]=q[i++];//如果是q[i]<q[j],那么排序就不稳定else {tmp[k++]=q[j++];res+= mid-i+1;}//扫尾while(i<=mid)tmp[k++]=q[i++];while(j<=r)tmp[k++]=q[j++];//物归原主for(int i=l,j=0;i<=r;i++,j++)q[i]=tmp[j];return res;
}int main(){cin>>n;for(int i=0;i<n;i++)scanf("%d",&q[i]);cout<<merge_sort(0,n-1)<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/751052.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【渗透测试】redis漏洞利用

redis安装及配置 wget http://download.redis.io/releases/redis-3.2.0.tar.gz tar xzf redis-3.2.0.tar.gz cd redis-3.2.0 make cp /root/redis-6.2.6/redis.conf /usr/local/redis/bin/ cd /usr/local/redis/bin/ vi redis.conf #修改内容如下&#xff1a; #protected-mode …

C语言基础知识笔记

总体上必须清楚的: 1)程序结构是三种: 顺序结构 , 循环结构(三个循环结构), 选择结构(if 和 switch) 2)读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择)。 3)计算机的数据在电脑中保存是以 二进制的形式. 数据存放的位置就是 他的地址. 4)bit是…

【图像分割】使用Otsu 算法及迭代计算最佳全局阈值估计并实现图像分割(代码实现与分析)

本实验要求理解全局阈值分割的概念&#xff0c;并实现文本图像分割。需要大家深入理解Ostu 算法的实现过程及其迭代原理&#xff0c;同时通过学习使用Otsu 算法及其迭代&#xff0c;实践图像分割技术在文本图像处理中的应用。 以下将从实验原理、实验实现、实验结果分析三部分对…

(黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

&#xff08;黑马出品_高级篇_01&#xff09;SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术——保护 今日目标1.初识Sentinel1.1.雪崩问题及解决方案1.2.服务保护技术对比1.3.Sentinel介绍和安装1.3.1.初识Sentinel1.3.2.安装Sentinel 1.…

Mock.js了解(Mock就是模拟一个后端,Postman模拟前端)

Mock.js 基于 数据模板 生成模拟数据。基于 HTML模板 生成模拟数据。拦截并模拟 ajax 请求。 基本语法 DTD&#xff08;数据模板定义规范&#xff09; 数据模板的每个属性由3部分构成&#xff1a;属性名、生成规则、属性值&#xff08;‘name|rule’: value&#xff09; 属性名…

Elasticsearch:调整搜索速度

在我之前的文章 “Elasticsearch&#xff1a;如何提高查询性能” 及 “Elasticsearch&#xff1a;提升 Elasticsearch 性能” 里&#xff0c;我详细描述了如何提高搜索的性能。在今天的文章里&#xff0c;我从另外一个视角来描述如何调整搜索的速度。希望对大家有所帮助&#x…

基于springboot+vue的早餐店点餐系统(源码+论文)

作者主页&#xff1a;Java程序员老张 主要内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;…

Python基础综合案例-数据可视化

一、数据可视化 - 折线图可视化 1.1、json数据格式 """ 演示JSON数据和Python字典的相互转换 """ import json # 准备列表&#xff0c;列表内每一个元素都是字典&#xff0c;将其转换为JSON data [{"name": "张大山", &quo…

dp入门:从暴力dfs 到 dp

本篇为小金鱼大佬视频的学习笔记&#xff0c;原视频链接&#xff1a;https://www.bilibili.com/video/BV1r84y1379W?vd_source726e10ea5b787a300ceada715f64b4bf 基础概念 暴力dfs很多时候仅能过部分测试点&#xff0c;要想将其优化&#xff0c;一般以 dfs -> 记忆化搜索 …

JavaEE—— HTTP协议(上篇)

文章目录 一、认识什么是 HTTP 协议二、HTTP 抓包工具1.了解使用哪种工具2.了解抓包工具抓包的原理3.简单使用抓包工具 三、解释 HTTP 中的报文格式1.认识 URL2. 认识 HTTP 请求解释首行 "方法"解释 请求头(header)空行body 3、总结 一、认识什么是 HTTP 协议 HTTP …

PS学习 - 抠图-通道-主题颜色和背景颜色不能相近

抠出蝴蝶 1.通道抠图 套索工具 这里需要圈住你要的&#xff0c;注意尽量小点 ctrl j 复制 然后去掉背景 点击通道 找到明暗对比最大的通道&#xff0c;这里我理解为颜色反差最大的那个&#xff0c;突出你要抠的东西 搜了下说是一般为蓝色 复制通道 ctrll调出色阶 通过移…

Rust 枚举与模式匹配:探索类型安全与表达力的完美结合

Rust 是一种系统编程语言&#xff0c;旨在提供内存安全、并发性和性能。在 Rust 中&#xff0c;枚举&#xff08;Enum&#xff09;和模式匹配&#xff08;Pattern Matching&#xff09;是两个核心概念&#xff0c;它们共同构建了 Rust 强大的类型系统和表达力。本文将深入探讨 …

一文总结python的异常数据处理示例

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享&#xff0c;包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

理解java特性:抽象类和接口

抽象类 抽象类的意义何在&#xff1f; 表面上看抽象类就是其中的抽象方法 不写方法体 只写一个方法声明&#xff1a; public abstract void eat(); 这个eat方法 在基类中是一个抽象概念 不知道动物要吃什么 动物是一个总体概念 所以继承它的子类必须实现这个方法 把抽象变为…

springboot278基于JavaWeb的鲜牛奶订购系统的设计与实现

鲜牛奶订购系统的设计与实现 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统鲜牛奶订购信息管理难度大&…

VMwareWorkstation16与Ubuntu 22.04.6 LTS下载与安装

一、准备工作 VMware Workstation Pro 16官网下载&#xff1a; https://customerconnect.vmware.com/cn/downloads/info/slug/desktop_end_user_computing/vmware_workstation_pro/16_0。下载需要账号登录。 二、安装 双击exe文件稍等一会会弹出安装程序&#xff0c;如图 这…

FUTR3D论文实验环境配置及运行

项目地址&#xff1a;https://github.com/Tsinghua-MARS-Lab/futr3d 论文地址&#xff1a;https://arxiv.org/abs/2203.10642 环境&#xff1a;Linux、cuda 11.1、python 3.8 1.创建虚拟环境futr conda create -n futr python3.8 -y conda activate futr2.安装pytorch的GPU版本…

Vue中nextTick一文详解

什么是 nextTick&#xff1f; 在 Vue 中&#xff0c;当我们修改数据时&#xff0c;Vue 会自动更新视图。但是&#xff0c;由于 JavaScript 的事件循环机制&#xff0c;我们无法立即得知视图更新完成的时机。这时候&#xff0c;我们就需要使用 nextTick 来获取视图更新完成后的…

Spring Boot(六十八):SpringBoot 整合Apache tika 实现文档内容解析

1 Apache Tika 介绍 Apache Tika 是一个开源的内容检测和分析框架,由Apache软件基金会开发和维护的顶级项目。它可以从各种格式的文件中提取元数据和文本内容。Tika非常适合处理全文搜索、内容分析、翻译、内容提取等需要大量处理和分析文档内容的任务。Apache Tika提供了多种…

Airtest-Selenium升级兼容Selenium 4.0,给你全新体验!

一、前言 在上期更新推文中提到&#xff0c;我们Airtest-Selenium更新到了1.0.6版本&#xff0c;新增支持Selenium4.0的语法&#xff0c;那么我们来看一下Airtest-Selenium更新后有什么新的内容吧~ 二、selenium 4.0有什么新功能 selenium4.0最主要的还是定位元素方法的更新…