38、【排序】逆序对的数量(C/C++版)

逆序对的数量(c++)(详细解答) 逆序对的数量(c++)(详细解答) 题目如下: 给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。 逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。 输入格式 第一行包含整数n,表示数列的长度。 第二行包含 n 个整数,表示整个数列。 输出格式 输出一个整数,表示逆序对的个数。 数据范围 1≤n≤100000 输入样例 6 2 3 4 5 6 1 输出 5 下面为解答过程: 这道题用到的是“归并排序 阅读详情

题目描述

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

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

输入格式:

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

输出格式:

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

数据范围:

1≤n≤100000

输入样例:

6
2 3 4 5 6 1

输出样例:

5

思路分析

利用“分治”的方式,将序列进行分解为LA和LB,则逆序对数=LA中的逆序对数+LB中的逆序对数+LA中相对于LB中的逆序对数。

假设当LA和LB已为按非递减顺序的有序序列,从左至右开始查找,当查找到LB中的某个数x小于LA中的数y时,则可确定从LA中的y开始到LA的最后一个元素z,其所有数都比LB中的x大,此时便得到逆序数个数count = z - y + 1,以此类推,当完成LA和LB的所有查找后,便找到LA中相对于LB所产生的逆序对数。

因此采用归并排序算法

参考文章:
算法导论习题—求n个元素任何排列中逆序对的数量

AcWing 788. 逆序对的数量-要点

AcWing 788. 逆序对数量与递归与排序

算法实现

#include <stdio.h>

// 假设全部逆序则为n*n=(10^10)/2=5*10^9,使用int越界因此使用long long
typedef long long LL;
const int N = 1e5 + 10;
int tmp[N];


LL merge_sort(int q[], int l, int r){
    if(l >= r)      return 0;
    
    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){
    	// 第一个序列中的前i个均小于第二个数组,则无逆序对
        if(q[i] <= q[j])    tmp[k++] = q[i++];
        else{
        // 第二个数组的第j个小于第一个数组从下标i开始之后的所有元素
            tmp[k++] = q[j++];
            res += mid - i + 1;
        }                
    }
    while(i <= mid)         tmp[k++] = q[i++];
    while(j <= r)           tmp[k++] = q[j++];
    
    for(k = 0,i = l; i <= r; k++, i++)      q[i] = tmp[k];
    
    return res;
}

int main(){
    int n;      scanf("%d",&n);
    int q[N];   for(int i = 0; i < n; i++)      scanf("%d",&q[i]);
    LL res = merge_sort(q, 0 ,n-1);
    printf("%ld", res);
    return 0;
}

算法模板:
37、【排序】归并排序(C语言版)

一、基础算法 -- 逆序对的数量 逆序对的数量--归并排序 阅读详情

相关推荐

C++逆序对数目的求解

逆序对数目的求解方法,一种是基于冒泡排序,另一种是基于归并排序。

Korloa的博客(A new world for you) 1971

C/C++ 求逆序对数

逆序对定义:对一个序列a[n],若i<j且a[i]>a[j],则a[i]与a[j]为逆序对。 如:序列 3, 2, 1 的逆序对数为2+1=3。 # include <bits/stdc++.h> using namespace std; TYPE array[ARRAYSIZE]; // 下标1~length int length; // array[]中使用的元素个数 注:以下各算法均会改变原序列 冒泡排序求解 逆序对数即冒泡排序中交换的次数。 平均时间复杂度:O(n^

我想天胡啊啊啊的博客 5410

先进封装Interposer仿真步骤及说明

摘要: Interposer仿真是2.5D/3DIC封装设计的关键环节,涵盖信号完整性(SI)、电源完整性(PI)、热及结构应力分析。流程分为五个阶段:1)前处理,定义层叠结构与材料属性;2)参数提取,通过3D电磁建模获取TSV、传输线等寄生参数;3)仿真设置,选择求解器并设定频率范围;4)结果分析,评估信号损耗、阻抗及电源网络性能;5)后处理,进行多物理场协同仿真并生成模型。核心挑战在于多尺度与多物理场耦合,需优先确保高速信号与电源网络的仿真精度。常用工具包括Ansys HFSS、Cadence Sigr

DSY_0324的博客 1349

求排列的逆序数<归并><C++>

程序 #include using namespace std; void gb_b(int p[],int a[],int i,int j,int ans){ int e=(i+j)/2,q=i,w=0; do{ if(a[q]>a[e]) p[w++]=a[e++],ans++; else p[w++]=a[q++],p[w++]=a[e+

天某的小窝 1476

如何用Arduino和HX711压力传感器制作一个简易电子秤(含OLED显示)

本文详细介绍了如何使用Arduino、HX711压力传感器和OLED显示屏制作一个简易电子秤。从硬件连接到软件编程,提供了分步教程,包括核心元件功能解析、接线方法、库安装、模块测试以及关键的校准流程。项目实践性强,适合创客和DIY爱好者学习嵌入式系统与传感器应用。

tea88的博客 536

FPGA 上的 YOLOv8 实时目标检测:从模型优化到硬件加速全解析

本文全面解析了将YOLOv8目标检测模型部署到FPGA进行硬件加速的完整流程。通过模型裁剪、混合精度量化等优化手段,结合HLS设计专用计算引擎与数据流,实现了高能效比的实时推理。文章深入探讨了软硬协同部署、性能调试与优化技巧,为追求极致实时性与低功耗的边缘AI应用提供了从算法到硬件的实战指南。

weixin_29031161的博客 605

4.逆序对的数量

1.题目 给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。 逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。 输入格式 第一行包含整数n,表示数列的长度。 第二行包含 n 个整数,表示整个数列。 输出格式 输出一个整数,表示逆序对的个数。 数据范围 1≤n≤100000 输入样例: 6 2 3 4 5 6 1 输出样例: 5 2.解题 利用归并排序的思想,在每次合并左右两个子数组时计算逆序对的数量 方

一杯红酒7的博客 508

MobaXterm简介和使用(服务器连接工具)

MobaXterm 是一个功能强大的远程计算工具,集成了许多常用的远程计算功能,包括 SSH、X11、RDP、VNC、FTP、SFTP 等。

清平乐的技术专栏 1957

逆序对(归并排

https://www.bilibili.com/video/av11250539?from=search&seid=8977949544767058812 附上一个超有趣的归并排序 动画 https://www.luogu.org/problemnew/show/P1908 题目 1 #include<iostream> 2 #in...

ampg66396的博客 114

【62】OpenCV C++实战篇——【项目实战】OpenCV C++ 精准定位“十字刻度尺”中心坐标,过滤图片中的干扰,精准获取十字交点坐标

本文针对工业相机拍摄的2000万像素图像中十字刻度尺的精确定位问题进行了研究。面对图像较暗、存在红黄干扰、记号笔涂抹及细节模糊等难点,提出了一种基于霍夫变换的解决方案。通过灰度化、反色、二值化预处理后,对比分析了多尺度霍夫直线(HoughLines)和渐进概率霍夫线段(HoughLinesP)两种方法的定位效果。实验结果表明,HoughLinesP由于具有最小线段长度和间隙约束,在直线贴合度和交点定位精度上表现更优,其返回的线段端点坐标也更便于后续处理。该研究为工业视觉中微小目标的精确定位提供了实用参考。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 975

Modbus协议介绍及解析

Modbus协议介绍及解析 1.Modbus简介 Modbus是一种广泛应用于工业控制领域串行通信协议,以其开放性、高可靠性、高效简单性、免费等优点,成为了工业领域通信协议的业界标准,是工业现场电子设备之间常用的连接方式。Modbus按其格式可分为Modbus-RTU,Modbus-ASCII,Modbus-TCP,其中前两者适用于串行通信控制网络中,例如RS485,RS232等,而Modbus-TCP主要应用于基于以太网TCP/IP通信的控制网络中。通过此协议,控制器相互之间、或控制器和其它设备之间进行通

逍遥子的博客 1万+

求逆序对(inversion)的个数

2-4 逆序对 设A[1...n]是一个包含n个不同数的数组,如果在i<j的情况下,有A[i]>A[j],则(i,j)就称为A中的一个逆序对(inversion)。 a)列出数组<2, 3, 8, 6, 1>的5个逆序对 b)如果数组的元素取自集合{1,2,...,n}, 那么, 怎样的数组含有最多的逆序对?它包含多少个逆序对?...

weixin_30344995的博客 278

Cadence OrCAD Capture CIS元器件管理时ERROR(ORCIS-6454): Temporary part number tracking is turned on报错的解决方法

使用Part manager对工程的元器件进行批量管理时,出现如下图所示的ERROR(ORCIS-6454): Temporary part number tracking is turned on报错其解决方法如下。

fydar的博客 3506

C语言归并排序详解:从递归到非递归的完整实现

排序算法是计算机程序设计的基石,而归并排序作为典型的基于分治思想的高效算法,凭借稳定的O(n log n)时间复杂度和可预测的性能表现,在数据处理、逆序对统计以及外部排序等场景中占据重要位置。它的核心原理并不复杂:将无序数组不断拆分为单个元素,再利用双指针合并两个有序区间,最终完成整体排序。这一过程不仅体现了递归调用的精妙,也揭示了空间换时间、稳定性保证等工程实践中的关键权衡。对于C语言学习者而言,掌握归并排序不仅能提升对递归、数组边界和内存管理的理解,还能为链表排序、大规模数据归并等进阶问题打下坚实基础。

weixin_34062469的博客 556

ROS2 CANopen 使用教程

第一步是定义一个结构,用于保存有关接头和相关 CANopen 数据的信息。该结构是 CANopen 网络的基础,可确保存储所有相关数据并在需要时进行访问。

机器人控制与仿真应用 3690

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

51NOD——N 1107 斜率小于0的连线数量

https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1107 基准时间限制:1秒 空间限制:131072KB 分值:40难度:4级算法题 收藏 关注 二维平面上N个点之间共有C(n,2)条连线。求这C(n,2)条线中斜率小于0的线的数量。 二维平面上的一个点,根...

agcozdwdfvds08078的博客 117

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

洛谷P1908 逆序对(归并排序)

题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计。最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定义的:对于给定的一段正整数序列,逆序对就是序列中ai>aj且i<j的有序对。知道这概念后,他们就比赛谁先算出给定的一段正整数序列中逆序对的数目。 输入输出格式 输入格式: 第...

weixin_30326741的博客 101

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

JZ-C-36

剑指offer第三十六题:数组中的逆序对 1 //============================================================================ 2 // Name : JZ-C-36.cpp 3 // Author : Laughing_Lz 4 // Version ...

ajiaoci0000的博客 123

树状数组精讲:逆序对计数与离散化(附双语言解法)

问题 A 求的就是标准的逆序对数量。问题 B 为什么答案完全一样?交换相邻两个元素,逆序对数量最多变化 1。若 $a_i \le a_{i+1}$,交换后它们变成一个新的逆序对,总数 $+1$;若 $a_i > a_{i+1}$,交换后这一对被消掉,总数 $-1$;而对于其他任意一对元素 $(x, y)$,交换相邻位置并不改变它们的前后相对次序,所以贡献不变。排好序的数组逆序对为 0。每一步最多消掉 1 个逆序对,所以至少需要"逆序对个数"步;

IT_Scratch的博客 236

蓝桥杯题库题解合集(C/C++实现)

文章目录二、基础练习BASIC-1 闰年判断BASIC-2 01字串BASIC-3 字母图形BASIC-4 数列特征BASIC-5 查找整数BASIC-6 杨辉三角形BASIC-7 特殊的数字BASIC-8 回文数BASIC-9 特殊回文数BASIC-10 十进制转十六进制BASIC-11 十六进制转十进制BASIC-12 十六进制转八进制BASIC-13 数列排序二、算法训练ALGO-1 区间k...

薛崇祥的博客 5481

归并排序详解:分治思想、复杂度分析、代码实现与逆序对应用

排序算法是数据结构与算法学习中的基石,而归并排序正是理解分治思想的经典代表。它通过不断拆分数组至单元素,再两两合并有序子数组,从而实现整体有序。这一过程不仅让时间复杂度稳定保持在O(n log n),还天然具备稳定排序的特性,在多关键字排序场景中尤为实用。相比快速排序的极端退化风险,归并排序的表现更加可预测。除了基础排序,归并排序还常用于高效求解逆序对问题——在合并过程中即可统计出逆序对数量,适用于大数据量或链表排序等场景。掌握归并排序的核心原理、递归边界与合并细节,是深入理解分治策略、稳定排序以及算法复杂

weixin_32642109的博客 308

ACM/ICPC 之 快排+归并排序-记录顺序对(TSH OJ-LightHouse(灯塔))

TsingHua OJ 上不能使用<algorithm>头文件,因此需要手写快排(刚开始写的时候自己就出了很多问题....),另外本题需要在给横坐标排序后,需要记录纵坐标的顺序对的数量,因此,最快的算法貌似只有归并排序或者树状数组的方法进行顺序对的查找和记录了,时间度为O(nlogn),另外此前需要一次对横坐标的排序,这里用快排。 灯塔(LightHouse) ...

disuo8001的博客 341

51 Nod 1107 斜率小于0的连线数量

1107斜率小于0的连线数量 二维平面上N个点之间共有C(n,2)条连线。求这C(n,2)条线中斜率小于0的线的数量。 二维平面上的一个点,根据对应的X Y坐标可以表示为(X,Y)。例如:(2,3) (3,4) (1,5) (4,6),其中(1,5)同(2,3)(3,4)的连线斜率 < 0,因此斜率小于0的连线数量为2。 ...

weixin_30467087的博客 116

C++个人算法模版总结

文章目录一、基础算法1. 归并排序2. 二分计算三次方根3. 高精度加法减法乘法除法4. 二维差分5. 离散化6. 区间合并二、数据结构7. 双链表8. 滑动窗口9. KMP10. 并查集11. 哈希12. STL(1)Lambda函数(内置函数)(2)vector2.1> 基础声明方式2.2> 函数(3)string3.1> 基础声明方式3.2> 函数(4)stack(5)queue(6)set6.1> set6.2> unordered_set6.3>

2303_76151267的博客 1918

POJ 2299 Ultra-QuickSort 题解

Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 53630 Accepted: 19693 Description In this problem, you have to analyze a particular sort...

diaoxiangxi0422的博客 121
上一篇: 37、【排序】归并排序(C++/Python版)
下一篇: 39、【查找】二分查找:数的范围和查找某个数(C/C++版)
辰阳星宇
博客等级 码龄9年 631粉丝 459原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰阳星宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值