归并排序例题——逆序对的数量

做道简单一点的题巩固一下

归并排序实现步骤
将整个区间 [l, r] 划分为 [l, mid] 和 [mid+1, r]。
递归排序 [l, mid] 和 [mid+1, r]。
将左右两个有序序列合并为一个有序序列。

题目描述

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

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

输入格式
输入共两行。
第一行包含整数 n,表示数列的长度。
第二行包含 n 个整数,表示整个数列。

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

数据范围
1≤n≤100000
数列中的元素的取值范围 [1,1e9]。

输入样例
6
2 3 4 5 6 1

输出样例
5

具体实现
实现思路:

可以将所有的逆序对整体分为3大类

两个数同时出现在左半边(红色);
两个数同时出现在右半边(绿色);
一个数在左半边,一个数在右半边(黄色)。

因此,我们在归并排序的同时便要记录逆序对的个数。

红色情况时逆序对数量:merge_sort(l,mid);
绿色情况时逆序对数量:merge_sort(mid+1,r);
黄色情况时逆序对数量:先将左右两边分别变为有序序列,然后双指针进行比较,先选取右边序列当中第一个元素,判断左边序列当中有几个元素大于他,便有几个逆序对(即分别选取右边序列中的每一个元素,然后分别遍历左边序列当中的每个元素,进行比较判断,最后累加起来)。

代码注解:

n的最大值为100000,我们计算最坏情况,即数列时降序排列,就一共有 n(n-1)/2 个逆序对,即 5*1e9 个逆序对,可能会有大于 int 值的情况,因此使用 long long 进行存储。
因为左右两个均为有序数列,所有当左边序列第 i 个元素大于右边序列第 j 个元素的时候,左边序列 [i,mid] 都严格大于右边序列第 j 个元素,即 mid-i+1 个逆序对,就是我们归并排序归并的过程,所以每当我们输出一个 q[i]>q[j] 的情况,便在逆序对个数上加一个 mid-i+1 。
要注意 merge_sort 的返回值类型变为 long long ,否则会造成数据过多时无法AC。

实现代码
 

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
const int N=100010;
int n;
int q[N],temp[N];
ll merge_sort(int q[],int l,int r)
{if(l>=r){return 0;}else{int mid=l+r>>1;ll res=merge_sort(q,l,mid)+merge_sort(q,mid+1,r);int k=0,i=l,j=mid+1;while(i<=mid&&j<=r){if(q[i]<=q[j]){temp[k]=q[i];k++;i++;}else{temp[k]=q[j];k++;j++;res+=mid-i+1;}}while(i<=mid){temp[k]=q[i];k++;i++;}while(j<=r){temp[k]=q[j];k++;j++;}for(i=l,j=0;i<=r;i++,j++){q[i]=temp[j];}return res;}
}
int main()
{cin>>n;for(int i=0;i<n;i++){cin>>q[i];}cout<< merge_sort(q,0,n-1)<<endl;system("pause");return 0;
}

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

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

相关文章

golang 生成一年的周数

// GetWeekTimeCycleForGBT74082005 获取星期周期 中华人民共和国国家标准 GB/T 7408-2005 // 参数 year 年份 GB/T 7408-2005 func GetWeekTimeCycleForGBT74082005(year int) (*[]TimeCycle, error) {var yearstart time.Time //当年最开始一天var yearend time.Time //当年…

系列三、Spring Security中自定义用户名/密码

一、Spring Security中自定义用户名/密码 1.1、自定义用户名/密码 1.1.1、配置文件中配置 spring.security.user.nameroot spring.security.user.password123456 1.1.2、定义基于内存的用户 /*** Author : 一叶浮萍归大海* Date: 2024/1/11 21:50* Description:*/ Configu…

Java 日期接收报错:could not be parsed, unparsed text found at index 10(已解决)

文章目录 问题背景代码解决方法问题背景 使用 Element-UI 的 el-date-picker 组件 将日期转给Java,Java报错 java.time.format.DateTimeParseException: Text ‘2024-01-03T16:00:00.000Z’ could not be parsed, unparsed text found at index 10 代码 Vue<el-date-picke…

关于SpringMVC前后端传值总结

一、传递方式 1、查询参数&路径参数 查询参数&#xff1a; URI:/teachers?typeweb GetMapping("/klasses/teachers") public List<Teacher> getKlassRelatedTeachers(String type ) { ... }如果查询参数type与方法的名称相同&#xff0c;则直接将web传入…

EM planner 论文阅读

论文题目&#xff1a;Baidu Apollo EM Motion Planner 0 前言 EM和Lattice算法对比 EM plannerLattice Planner参数较多&#xff08;DP/QP&#xff0c;Path/Speed&#xff09;参数少且统一化流程复杂流程简单单周期解空间受限简单场景解空间较大能适应复杂场景适合简单场景 …

文件操作(与文件相关)相关笔记

1.FileInputStream 1.构造方法 new FileInputStream(String); 意思是创建一个对象&#xff0c;让这个对象指向某个文件&#xff0c;然后对这个文件进行读取操作&#xff0c;如果这个文件不存在 2.读取文件 读取文件使用read()方法&#xff1b; 如果每次读取一个字节&#xff0c…

使用Pygame显示文字的示例代码

import pygame import syspygame.init()# 设置窗口尺寸 win_size (800, 600) screen pygame.display.set_mode(win_size) pygame.display.set_caption("文字显示示例")# 设置字体和文字内容 font pygame.font.SysFont(None, 48) # 使用系统默认字体&#xff0c;字…

Windows VSCode 使用Python

一、vscode中安装python 二、下载python.exe&#xff08;即vscode中需要的python解释器&#xff09; 下载地址&#xff1a;https://www.python.org/downloads/ 三、安装第三方代码规范工具 参考网址&#xff1a;https://www.python.org/downloads/ 工具介绍 flake8 &#xf…

快速打通 Vue 3(四):标签的 ref 属性与 Vue3 生命周期

很激动进入了 Vue 3 的学习&#xff0c;作为一个已经上线了三年多的框架&#xff0c;很多项目都开始使用 Vue 3 来编写了 这一组文章主要聚焦于 Vue 3 的新技术和新特性 如果想要学习基础的 Vue 语法可以看我专栏中的其他博客 Vue&#xff08;一&#xff09;&#xff1a;Vue 入…

Mondo备份linux操作系统为iso镜像 —— 筑梦之路

简介 Mondo Rescue&#xff08;以下简称Mondo&#xff09;可以说是Linux 下的Ghost&#xff0c;它可以将你的系统像照相一样备份至磁带&#xff0c;CD-R&#xff0c;CD-RW&#xff0c;NFS或硬盘分区。Mondo广泛支援LVM&#xff0c;RAID&#xff0c;ext2, ext3, JFS, XFS,Reise…

Fragstats景观格局指数计算入门教程

土地利用以及景观格局是当前全球环境变化研究的重要组成部分及核心内容&#xff0c;其对区域的可持续发展以及区域土地管理有非常重要的意义。通过对土地利用时空变化规律进行分析可以更好的了解土地利用变化的过程和机制&#xff0c;并且通过调整人类社会经济活动&#xff0c;…

蓝桥杯练习题(二)

&#x1f4d1;前言 本文主要是【算法】——蓝桥杯练习题&#xff08;二&#xff09;的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 …

【ASP.NET Core 基础知识】--MVC框架--Models和数据绑定

Models和数据绑定在ASP.NET Core MVC中扮演着关键的角色&#xff0c;对于构建强大、灵活和可维护的Web应用程序至关重要。这一节我们就来讲一下。 一、Models 1.1 Models的定义和作用 在ASP.NET Core MVC中&#xff0c;Model是应用程序中用于表示数据结构和业务逻辑的一种抽…

VS Code 配置 Vue3 模板 详细步骤

1、打开 VS Code &#xff0c;在页面左下角找到这个设置图标&#xff0c;然后找到 “用户代码片段” 2、接着点击 “新建全局代码片段文件” 3、在输入框中输入你要设置的模板名&#xff0c;然后回车确认 4、接下来配置自己想要模板代码&#xff0c;或者也可以借鉴我写的这个&…

【C语言刷题每日一题#牛客网HJ73】——计算日期到天数转换(给定日期,计算是该年的第几天)

目录 问题描述 思路分析 数据结构构建部分 计算部分 代码实现 结果测试 此问题解决方法不唯一&#xff0c;这里介绍的是一种使用数组和循环实现的简单办法 问题描述 思路分析 问题的要求是输入一个日期&#xff0c;计算这是当年的第几天——要解决这个问题&#xff0c;逻…

MongoDB之Change Stream实战

什么是 Chang Streams Change Stream 指数据的变化事件流&#xff0c;MongoDB 从 3.6 版本开始提供订阅数据变更的功能。Change Stream 是 MongoDB 用于实现变更追踪的解决方案&#xff0c;类似于关系数据库的触发器&#xff0c;但原理不完全相同&#xff1a; Change Stream触…

Linux动态分配IP与正向解析DNS

目录 一、DHCP分配 1. 动态分配 1.1 服务端服务安装 1.2 修改服务端dhcp配置 1.3 修改客户端dhcp&#xff0c;重启查询网卡信息 2. 根据mac固定分配 2.1 修改服务器端dhcp服务配置 2.2 客户端自动获取&#xff0c;查看网卡信息 二、时间同步 1. 手动同步 2. 自动同…

java实现AES256对称加解密工具类

一、引入依赖包 引入相关依赖包 <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.70</version> </dependency> <!--lombok用于简化实体类开发--> <dependency&g…

Hive基础

hive的基础部分大致有四部分&#xff1a;Hive数据类型、Hive运算符、Hive数据存储、Hive表存储格式。这四部分是学习hive必须掌握的知识。 一、Hive数据类型 整体概述 1&#xff0c;hive的数据类型指的是表中列字段类型&#xff0c;类似于编程语言中对变量类型的定义如&#…

229.【2023年华为OD机试真题(C卷)】手机App防沉迷系统(模拟-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-手机App防沉迷系统二.解题思路三.题解代码Pyth…