手撕七大排序 (四)

news2024/11/18 23:20:45

归并排序

  • 归并排序递归写法
    • 一. 基本概念
    • 二. 图解

归并排序递归写法

一. 基本概念

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

说了那么一大堆的话 其实中心思想就两个字 分治

二. 图解

我们要将整个数组有序就是要将它的左右数组都变得有序

我们要想将左右数组都变得有序就是要将它左数组的左右数组和右数组的左右数组变得有序

依次套娃

到最后面呢

会变成一个个单个的元素 这个时候肯定是有序了嘛
在这里插入图片描述

在这里插入图片描述
当它变成有序之后我们再一个一个的归

我们来看代码

	// 创建一个临时的数组
	int* tmp = (int*)malloc(sizeof(int) * (right + 1));
	if (tmp==NULL)
	{
		printf("mergesort malloc error");
		exit(-1);
	}

这里我们首先要创建一个临时的数组来归并存贮数据 不然的话再内部排序会打乱顺序

之后我们开始考虑递归的问题

void _mergesort(int* arr, int left, int right,int* tmp)
{
	// assert
	assert(arr);
	
	// 限制条件
	if (left>=right)
	{
		return;
	}


	// 开始递归
	int mid = (left + right) / 2;
	_mergesort(arr, left, mid,tmp);
	_mergesort(arr, mid+1, right,tmp);

我们先来看这一段

这里开始递归如果没有达到边界条件的话 (只有一个元素)

就往左和右继续走

递完毕了之后我们开始归

这里注意看图

在这里插入图片描述

在这里插入图片描述

// 开始归
	int end1 = left;
	int end2 = mid + 1;
	

	int i = left;
	// 开始将两个子数组中的内容 归并到tmp数组中
	while (end1<=mid && end2<=right)
	{
		if (arr[end1]<arr[end2])
		{
			tmp[i++] = arr[end1++];
		}
		else
		{
			tmp[i++] = arr[end2++];
		}
	}

	while (end1<=mid)
	{
		tmp[i++] = arr[end1++];
	}
	
	while (end2<=right)
	{
		tmp[i++] = arr[end2++];
	}
	

	// tmp数组里面被放满了 排序好的值
	// tmp里面的值 全部赋值到arr里面了
	for ( i = 0; i < right+1; i++)
	{
		arr[i] = tmp[i];
	}

}

再之后我们将临时数组里面的值一一放到arr里面就好啦

这里有一点要注意的是i的赋值

这里的i要赋值left才可以

因为我们我们每次归的范围不同

当时这里写过了debug了很久

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

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

相关文章

数据结构与算法——链表(双向链表,顺序表与链表的比较)

&#x1f353;个人主页&#xff1a;bit.. &#x1f352;系列专栏&#xff1a;Linux(Ubuntu)入门必看 C语言刷题 数据结构与算法 目录 一.双向链表 二.双向链表的对称性&#xff1a;&#xff08;设指针p指向某一结点&#xff09; 1.双向链表的插入 2.双向链表的删除 …

浏览器中的页面循环系统

【】渲染进程中有个主线程处理安排好的任务&#xff0c;为了在线程运行过程中接收并处理新任务&#xff0c;引入了事件循环机制&#xff1b;为了处理其他线程发送来的任务&#xff0c;引入消息队列&#xff1b;为了处理其他进程发送来的任务&#xff0c;渲染进程专门有一个IO线…

【数据结构初阶】二、顺序表的实现

目录 一、线性表 二、顺序表 2.1 顺序表概念及结构 2.2 顺序表接口实现 2.2.1 顺序表初始化 2.2.2 顺序表的销毁 2.2.3 顺序表的打印 2.2.4 顺序表增加数据&#xff08;插入&#xff0c;头插、尾插&#xff09; 2.2.5 顺序表删除数据&#xff08;删除&#xff0c;头删…

Uniapp集成腾讯IM+音视频通话

腾讯IM(包含界面)源码下载相关配置 传送门&#xff1a;https://cloud.tencent.com/document/product/269/36887 传送门&#xff1a;https://github.com/TencentCloud/TIMSDK/tree/master/uni-app vue2 vue3都可 笔者用的vue2 解压文件 拖到编辑器 #项目右键 在命令行窗口打开 …

Promethues原理详解

目录 引言 一、Prometheus概念 1.1、什么是Prometheus 1.2、Zabbix和Prometheus区别 1.3、Prometheus的特点 二、运维监控平台设计思路 三、Prometheus监控体系 3.1、系统层监控&#xff08;需要监控的数据&#xff09; 3.2、中间件及基础设施类监控 3.3、应用层监控…

语音合成经典模型结构介绍

(以下内容搬运自 PaddleSpeech) Models introduction TTS system mainly includes three modules: Text Frontend, Acoustic model and Vocoder. We introduce a rule-based Chinese text frontend in cn_text_frontend.md. Here, we will introduce acoustic models and voc…

XDataverse免费的统一数据库管理工具

XDataverse产品简介 XDataverse是一款通用的数据库管理工具&#xff0c;主要管理关系型数据库&#xff0c;同时也支持一些其余类型的数据库&#xff0c;比如Redis。其主要功能有 支持主流关系型数据库的常规操作&#xff0c;比如MySQL,SQLServer,SQlite,SQLCE&#xff0c;Postg…

机器学习 逻辑回归(2)softmax回归多类别分类-鸢尾花案例

机器学习 逻辑回归之softmax回归多类别分类-鸢尾花案例一、前言二、假设函数三、One-Hot 独热编码四、代价函数五、梯度下降六、原生代码实现6.1 加载并查看数据6.2 添加前置与数据分割6.3 迭代训练6.4 验证数据七、sklearn代码实现八、参考资料PS&#xff1a;softmax回归损失函…

[时间序列预测]基于BP、LSTM、CNN-LSTM神经网络算法的单特征用电负荷预测[保姆级手把手教学]

系列文章目录 深度学习原理-----线性回归梯度下降法 深度学习原理-----逻辑回归算法 深度学习原理-----全连接神经网络 深度学习原理-----卷积神经网络 深度学习原理-----循环神经网络&#xff08;RNN、LSTM&#xff09; 时间序列预测-----基于BP、LSTM、CNN-LSTM神经网络…

安卓开发Android studio学习笔记14:用户注册登录(案例演示)

Android studio学习笔记第一步&#xff1a;配置activity_information.xml第二步&#xff1a;配置activity_registration.xml第三步&#xff1a;配置strings.xml第四步&#xff1a;配置InformationActivity第五步&#xff1a;配置RegistrationActivity第六步&#xff1a;运行结果…

二叉搜索树

文章目录二叉搜索树1. 概念2. 模拟实现二叉搜索树2.1 准备工作 创建类2.2 查找方法2.3 插入方法2.4 删除方法3. 性能分析二叉搜索树 前言 &#xff1a; 1. 概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不…

学点高端技术:基于密度的聚类算法——FDBSCAN算法

机器学习、人工智能各类KNN算法层出不穷&#xff0c;DBSCAN具有强代表性&#xff0c;它是一个基于密度的聚类算法&#xff0c;最大的优点是能够把高密度区域划分为簇&#xff0c;能够在高噪声的条件下实现对目标的精准识别&#xff0c;但该算法当前已远不能满足人们对于高效率、…

零基础自学javase黑马课程第二天

零基础自学javase黑马课程第二天 ✨欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ &#x1f52e;本文由京与旧铺原创&#xff0c;csdn首发&#xff01; &#x1f618;系列专栏&#xff1a;java学习 &#x1f4bb;首发时间&#xff1a;&#x1f39e;2022年10月16日&#…

【电子技术基础(精华版)】直流稳压电路

前期我们了解了一些关于直流稳压电源的基础知识&#xff0c;为了更好地完善职教高考电子技术专业的需求&#xff0c;接下来我会更新【电子技术基础&#xff08;精华版&#xff09;】&#xff0c;从中可以让更多的职教高考生有效地复习。 由于本人是山东省的一位博主&#xff0…

3、SySeVR测试(上)

一、准备 1、将测试代码放在/home/test目录下&#xff1b; 2、将测试数据导入joern 在/home/SySeVR/joern-0.3.1查看是否存在.joernIndex文件&#xff0c;有的话&#xff0c;需要删除。 删除之后&#xff0c;将测试数据导入joern: java -jar /home/SySeVR/joern-0.3.1/bin/jo…

程序员的中年危机:那些能工作到45、50、60的程序员们,究竟具备了哪些能力?

程序员行业新技术发展迅猛&#xff0c;可以说是日新月异。也正是这个原因&#xff0c;中年危机成为我们必须面对和攻克的问题。 思考一个问题&#xff1a;那些能工作到45、50、甚至60的程序员们&#xff0c;究竟具备了哪些过人的能力&#xff1f; 就我过去的经历和观察来说&a…

A comprehensive overview of knowledge graph completion

摘要 知识图(KG)以其代表和管理海量知识的独特优势&#xff0c;为各种下游知识感知任务(如推荐和智能问答)提供了高质量的结构化知识。KGs的质量和完整性在很大程度上决定了下游任务的有效性。但由于知识产权制度的不完备性&#xff0c;知识产权制度中仍有大量有价值的知识缺失…

【《机器人技术》复习】

【《机器人技术》复习】1. 要求&#xff1a;2. 机械手运动解算问题2.1 自由度考点2.2 运动学方程2.3 动力学方程2.4 传感器2.5 编程题1. 要求&#xff1a; 本次大作业上交截止时间 之前&#xff0c;超时&#xff0c;本门课程判定不及格。 作业上交的格式如下 一律以 WORD 文档…

2022年江西省职业院校技能大赛“网络空间安全”比赛任务书

2022年江西省职业院校技能大赛“网络空间安全” 比赛任务书 一、竞赛时间 总计&#xff1a;360分钟 竞赛阶段竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A模块 A-1 登录安全加固 180分钟 200分 A-2 本地安全策略配置 A-3 流量完整性保护 A-4 事件监控 A-5 …

求交叉链表头结点-面试必备

这里分享一下一个交叉链表的关键题目&#xff0c;觉得不错的小伙伴别忘了点赞支持 交叉链表无环链表思路代码有环链表思路代码总结无环链表 已知有两个链表&#xff08;无环&#xff09;相交&#xff0c;求出相交的头结点 思路 因为链表相交&#xff0c;所以最后一部分一定重…