刘汝佳の归并排序详解

news2024/11/24 19:43:10

思路

作为一种高效的排序算法,它主要是通过递归来实现的,具体步骤如下

  • 划分问题:将序列划分成数量尽量相等的两部分
  • 递归求解:将两部分分别排序
  • 合并问题:将两个序列合并成一个

前两步对于笔者来说肯定是很容易实现的,归并排序的难点主要在第三步
如何合并两个有序序列呢?很明显,只需要每次选择两个序列中的最小元素并将其添加到辅助空间(最终答案)中,如图所示
在这里插入图片描述

代码

void merge_sort(int *A,int l,int r,int *T){//对[l,r)区间排序
	if(r-l<=1) return;
	int mid=l+(r-l)/2;
	merge_sort(A,l,mid,T),merge_sort(A,mid,r,T);
	int i=l,p=l,q=mid;
	while(p<mid||q<r)
		if(q>=r||(p<mid&&A[p]<=A[q])) T[i++]=A[p++];
		else T[i++]=A[q++];
	for(i=l;i<r;i++) A[i]=T[i];
}

这段代码最难理解的部分是while循环部分:
在通过递归将两边序列排序后,我们就是按照图解的方式来合并
w h i l e ( p < m i d ∣ ∣ q < r ) while(p<mid||q<r) while(p<mid∣∣q<r)的意思为:只要有一个非空序列就继续合并
KaTeX parse error: Expected 'EOF', got '&' at position 16: if(q>=r||(p<mid&̲&A[p]<=A[q]))的意思为:如果右侧序列为空或者左侧序列非空且左侧序列的最小元素比右侧序列的最小元素小的情况下,将左序列的最小元素加入辅助空间
若是其他情况就将右序列的最小元素加入辅助空间

最后将辅助空间中所有元素放进原来的数组

相关问题——逆序对

在这里插入图片描述

思路

n 2 n^2 n2的枚举是肯定会TLE的
非常幸运啊,这个逆序对是可以用归并排序顺便计算的

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=5e5+5;
int cnt,n;
int a[maxn],t[maxn];
void merge_sort(int *A,int l,int r,int *T){
	if(r-l<=1) return;
	int m=l+(r-l)/2;
	merge_sort(A,l,m,T),merge_sort(A,m,r,T);
	int i=l,q=l,p=m;
	while(p<m||q<r) if(q>=r||(p<m&&A[p]<=A[q])) T[i++]=A[p++]; else T[i++]=A[q++],cnt+=m-p;
	for(i=l;i<r;i++) A[i]=T[i];
}
signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	merge_sort(a,1,n+1,t);
	cout<<cnt;
	return 0;
}

细心的读者已经发现了这个代码和归并排序的代码的不同之处:在else后面又跟了一个 c n t + = m − p cnt+=m-p cnt+=mp
当右边的 A j A_j Aj复制到T中时,左边还没来得及复制到T的那些数旧是左边所有比 A j A_j Aj大的数,所以在累加器中 加上左边元素个数 m − p m-p mp即可(左边所剩的元素在区间[p,m)中,因此元素个数为m-p)

end

完结撒花

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

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

相关文章

构建Docker容器监控系统(Cadvisor +InfluxDB+Grafana)

目录 案例概述 Cadvisor InfluxDBGrafana 1.1、 Cadvisor 1.2、InfluxDB 1.3、Grafana 1.4、监控组件架构 1.5、开始部署 安装docker-ce 阿里云镜像加速器 创建自定义网络 创建influxdb容器 案例概述 Docker作为目前十分出色的容器管理技术&#xff0c;得到大量企业…

ad+硬件每日学习十个知识点(25)23.8.5(常见芯片类型、数字隔离芯片、IO扩展芯片TCAL6416)

文章目录 1.常见的芯片类型2.数字隔离芯片有什么用&#xff1f;3.I2C的I/O扩展芯片说明4.16位I/O扩展芯片TCAL6416的features、applications、description5.TCAL6416的引脚功能6.TCAL6416的电气特性7.TCAL6416的典型特性&#xff08;图像&#xff09;8.TCAL6416的参数测量信息&…

C++职工管理系统(课程设计报告)

C职工管理系统 项目介绍设计任务设计要求 程序设计代码讲解实例输出 源码领取 项目介绍 项目介绍 该职工管理系统主要是用来管理整个公司的信息&#xff0c;基于C继承和多态来实现&#xff0c;同时也包含文件流操作。 设计任务 设计任务 (1)设计个职工管理系统&#xff0c;管理…

你知道音频文件格式转换要用什么软件吗?今天就来分享给你

你是否曾经遇到过这样的情况&#xff1f;你正在享受着一首心爱的歌曲&#xff0c;却突然发现它的音频格式不兼容你的设备或播放器&#xff1f;或者你需要将录音文件从一种格式转换成另一种&#xff0c;以便在不同场景中使用&#xff1f;音频格式转换软件就像是一个通向音乐自由…

流量、日志分析

流量分析 知识点&#xff1a; 流量包分析简介 - CTF Wiki (ctf-wiki.org) Wireshark 基本语法&#xff0c;基本使用方法&#xff0c;及包过虑规则_wireshark语法_竹痕的博客-CSDN博客 MISC&#xff1a;流量包取证&#xff08;pcap文件修复、协议分析、数据提取&#xff09;…

网络编程——数据包的组装和拆解

数据包的组装和拆解 一、数据包在各个层之间的传输 二、各个层的封包格式 1、链路层封包格式 -------------------------------------------------------------------------------------------------------------------------------------- | 目标MAC地址&#xff08;6字节&a…

Java实现电影信息查询系统

Java实现电影信息查询系统 需求分析代码实现小结Time 需求分析 首先每一部电影&#xff0c;都包含这部电影的相关信息&#xff0c;比如&#xff1a;电影的编号&#xff08;id&#xff09;、电影的名称&#xff08;name&#xff09;、电影的价格&#xff08;price&#xff09;、…

数据结构: 线性表(带头双向循环链表实现)

之前一章学习了单链表的相关操作, 但是单链表的限制却很多, 比如不能倒序扫描链表, 解决方法是在数据结构上附加一个域, 使它包含指向前一个单元的指针即可. 那么怎么定义数据结构呢? 首先我们先了解以下链表的分类 1. 链表的分类 链表的结构非常多样, 以下情况组合起来就有…

Plecs最新安装免费版下载链接/Plecs 电力仿真软件4.7.5版本下载/实测能用

Plecs最新安装免费版下载链接 Plecs 电力仿真软件4.7.5版本下载 实测能用&#xff1a;

信息安全:认证技术原理与应用.

信息安全&#xff1a;认证技术原理与应用. 认证机制是网络安全的基础性保护措施&#xff0c;是实施访问控制的前提&#xff0c;认证是一个实体向另外一个实体证明其所声称的身份的过程。在认证过程中&#xff0c;需要被证实的实体是声称者&#xff0c;负责检查确认声称者的实体…

校园跑腿小程序为什么这么受欢迎呢?

校园跑腿小程序是一种在校园内提供快递、代购、代拿快递、代办事项等服务的手机应用程序。它通常由学生或校园内的志愿者组成&#xff0c;通过该应用程序接受用户的委托&#xff0c;并且根据用户的需求完成任务。校园跑腿小程序通过与学校或社区合作&#xff0c;提供便利的服务…

关于SQL查询面试题,测试会这些基本够用了

Sutdent表的定义 Score表的定义 1、创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) ); 创建score表…

大数据-玩转数据-Flink-Transform

一、Transform 转换算子可以把一个或多个DataStream转成一个新的DataStream.程序可以把多个复杂的转换组合成复杂的数据流拓扑. 二、基本转换算子 2.1、map&#xff08;映射&#xff09; 将数据流中的数据进行转换, 形成新的数据流&#xff0c;消费一个元素并产出一个元素…

研究人员发现特斯拉汽车能被越狱,可免费解锁付费功能

Bleeping Computer 网站披露&#xff0c;柏林工业大学&#xff08;Technical University of Berlin&#xff09;的研究人员开发出一种新技术&#xff0c;可以破解特斯拉近期推出所有车型上使用的基于 AMD 的信息娱乐系统&#xff0c;并使其运行包括付费项目在内的任何软件。 实…

22、springboot的Profile(通过yml配置文件配置 profile,快速切换项目的开发环境)

springboot的Profile ★ 何谓Profile 应用所在的运行环境发生切换时&#xff0c;配置文件常常就需要随之修改。Profile&#xff1a;——就是一组配置文件及组件的集合。可以整个应用在不同的profile之间切换&#xff08;设置活动profile&#xff09;&#xff0c;整个应用都将使…

QGIS二次开发三:显示Shapefile

Shapefile 为 OGR 所支持的最重要的数据格式之一&#xff0c;自然可以被 QGIS 加载。那么该如何显示Shapefile呢&#xff1f; 一、先上代码 #include <qgsapplication.h> #include <qgsproviderregistry.h> #include <qgsmapcanvas.h> #include <qgsvec…

HDFS中snapshot快照机制

HDFS中snapshot快照机制 介绍作用功能实现相关命令和操作相关命令 介绍 snapshot是数据存储的某一时刻的状态记录&#xff0c;备份&#xff08;backup&#xff09;则是数据存储的某一个时刻的副本HDFS snapshot快照是整个文件系统或某个目录在某个时刻的镜像&#xff0c;该镜像…

黑马机器学习day1

1.sklearn数据集 sklearn.datasets datasets.load_*() 获取小规模的数据集 datasets.fetch_*(data_homeNone) 获取大规模数据集 函数的第一个参数是data_home,标识数据集下载目录&#xff0c;默认/scikit_learn_data/ 1.1sklearn小数据集 sklearn.da…

无涯教程-Perl - fcntl函数

描述 该函数是系统fcntl()函数的Perl版本。使用FILEHANDLE上的SCALAR执行FUNCTION指定的功能。 SCALAR包含函数要使用的值,或者是任何返回信息的位置。 语法 以下是此函数的简单语法- fcntl FILEHANDLE, FUNCTION, SCALAR返回值 该函数返回0,但如果fcntl()的返回值为0,则返…

Vue2:组件高级(下)

Vue2&#xff1a;组件高级&#xff08;下&#xff09; Date: May 25, 2023 Sum: 自定义指令、插槽、商品列表、动态组件 目标&#xff1a; 自定义指令 基础概念&#xff1a; 概念&#xff1a; 内置指令&#xff1a;vue 官方提供了 v-for、v-model、v-if 等常用的内置指令。…