[数据结构]———归并排序

具体代码:在gitee仓库:登录 - Gitee.com

目录

​编辑

1.基本思想:

 

2. 代码解析

1.分析

 2.逻辑图

3.运行结果 


1.基本思想:


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

2. 代码解析

1.分析

归并排序的逻辑过程可以通过几个关键步骤来可视化:

  1. 分解: 数组最初被分成两个子数组,这个过程递归进行,直到每个子数组只有一个元素。
  2. 合并: 递归结束后,开始合并过程,将相邻的两个有序子数组比较元素大小,较小的元素会被先放到临时数组中。
  3. 完整排序: 通过不断合并子数组,最终得到完全排序的数组
  1. _MergeSort 函数 是递归函数,负责实际的排序工作。

    • 输入参数a 是待排序的数组指针,begin 和 end 分别表示当前子数组的起始和结束下标,tmp 是一个临时数组用于辅助合并两个已排序的子数组。
    • 当 begin >= end 时,说明当前子数组只剩一个元素或为空,无需排序,直接返回。
    • 计算中间点 mid,对左右两半 [begin, mid] 和 [mid+1, end] 分别递归调用 _MergeSort 进行排序。
    • 调用结束后,通过比较并合并两个有序子数组 [begin, mid] 和 [mid+1, end] 到临时数组 tmp 中。
    • 最后,将排好序的 tmp 数组复制回原数组 a 的相应位置。
  2. MergeSort 函数 是主接口函数,负责初始化和释放临时数组。

    • 动态分配与原数组相同大小的临时数组 tmp
    • 调用 _MergeSort 函数进行排序。
    • 使用完毕后,释放临时数组 tmp 的内存。

 2.逻辑图

void _MergeSort(int* a, int begin, int end, int* tmp)
{//划分
if (begin >= end)//只有一个元素不用划分return;int mid = (begin + end) / 2;//首尾下标相加除2得到中间点下标_MergeSort(a, begin, mid, tmp);//递归划分左半区域_MergeSort(a, mid + 1, end, tmp);//递归划分右半区域// [begin, mid][mid+1, end]归并int begin1 = begin, end1 = mid;//标记左半区第一个未排序的元素以及最后一个元素int begin2 = mid + 1, end2 = end;//标记右半区第一个未排序的元素以及最后一个元素int i = begin;//临时数组下标while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2])//左半区第一个未排序的元素小于右半区第一个未排序的元素{tmp[i++] = a[begin1++];}else{tmp[i++] = a[begin2++];//右半区第一个未排序的元素小于左半区第一个未排序的元素}}//合并左半区剩余元素while (begin1 <= end1){tmp[i++] = a[begin1++];}
//合并右半区剩余元素while (begin2 <= end2){tmp[i++] = a[begin2++];}
//把临时数组中合并后的元素拷贝回原数组memcpy(a + begin, tmp + begin, sizeof(int) * (end - begin + 1));
}//归并排序入口
void MergeSort(int* a, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);//开辟一个辅助数组if (tmp == NULL){perror("malloc fail");return;}_MergeSort(a, 0, n - 1, tmp);free(tmp);
}

3.运行结果 

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

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

相关文章

7个策略,让你的可视化大屏打动人心!

要打动人心的可视化大屏&#xff0c;可以采取以下策略&#xff1a; 引人入目的设计&#xff1a; 选择鲜明而吸引人的颜色和视觉效果&#xff0c;使用引人注目的动画和过渡效果&#xff0c;以及吸引眼球的图形和图案设计。通过精心设计的布局和排版&#xff0c;确保信息清晰可…

leetcode_43.字符串相乘

43. 字符串相乘 题目描述&#xff1a;给定两个以字符串形式表示的非负整数 num1 和 num2&#xff0c;返回 num1 和 num2 的乘积&#xff0c;它们的乘积也表示为字符串形式。 注意&#xff1a;不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 &q…

Static内存分析

title: Static内存分析 tags: Java基础知识 abbrlink: 49066 date: 2021-04-25 19:06:41 Static内存分析 一.基础须知 1.静态变量 1&#xff09;定义&#xff1a; 在一个Java类中&#xff0c;可以使用static关键字来修饰全员变量&#xff0c;该变量被称作静态变量 2&…

【linux】重定向

重定向 什么是重定向如何实现一个简单的重定向关于重定向的系统调用接口 注意&#xff1a;在看这篇博客之前&#xff0c;最好是要对文件在系统中是如何被打开的以及操作系统是如何管理文件有一个初步了解&#xff0c;如果不了解的话&#xff0c;可以看看这篇博客《初步认识文件…

苹果CEO对未来一代人工智能投资持乐观态度

尽管在动荡的第二季度&#xff0c;苹果的收入和iPhone销量有所下降&#xff0c;但其新兴的人工智能技术可能会带来急需的提振。 在5月2日的电话财报会议上&#xff0c;苹果公布季度收入为908亿美元&#xff0c;比去年下降4%。iPhone的收入也下降了10%&#xff0c;至460亿美元。…

无言:破局之道:顿悟+坚持——早读(逆天打工人爬取热门微信文章解读)

致无言 引言Python 代码第一篇 洞见 7年跟踪调查北京28个精英家庭&#xff1a;为什么顶尖大学孩子大多来自有钱家庭&#xff1f;第二篇 人民日报 来了&#xff01;新闻早班车要闻社会政策 结尾 控制你的情绪 否则它将控制你 在紧张的游戏中 控制情绪 避免冲动行为 是每个玩家的…

Linux中动态库的用法及优缺点?怎样制作动态库和静态库?

一、什么是gcc gcc的全称是GNU Compiler Collection&#xff0c;它是一个能够编译多种语言的编译器。最开始gcc是作为C语言的编译器&#xff08;GNU C Compiler&#xff09;&#xff0c;现在除了c语言&#xff0c;还支持C、java、Pascal等语言。gcc支持多种硬件平台. 在 Linux…

地震学角度说明横波纵波哪个才是垂直于传播方向振动

上面两幅图片&#xff0c;第一个是横波&#xff0c;第二个是纵波。死记硬背过一段时间总会忘记哪个是哪个。现通过地震学对横波纵波的定义来说明&#xff0c;如何从图形一眼判断横波和纵波。 横波&#xff1a; 因为地震的发生是由于地球内部的板块运动造成的&#xff0c;所以…

数据分析必备:一步步教你如何用numpy改变数据处理(2)

1、NumPy 简单入门教程 NumPy是Python中的一个运算速度非常快的一个数学库&#xff0c;它非常重视数组。它允许你在Python中进行向量和矩阵计算&#xff0c;并且由于许多底层函数实际上是用C编写的&#xff0c;因此你可以体验在原生Python中永远无法体验到的速度。 NumPy绝对是…

【软件开发规范篇】JAVA后端开发异常处理规范

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

01 Activiti 7:步骤

01 Activiti 7&#xff1a;步骤 1. 整合Activiti2. 业务流程建模3. 部署业务流程4. 启动流程实例5. 查询待办任务6. 处理待办任务7. 结束流程 1. 整合Activiti 业务系统使用 Activiti 来对系统的业务流程进行自动化管理。为了方便业务系统访问&#xff08;操作&#xff09;Act…

C语言 循环语句 (3) for 循环语句

接下来 我们来看第三个 for语句 基本语句是 for关键字 然后小括号 括号中三个表达式 然后它对表达式2进行判断 如果表达式2条件成立 则走进循环体 执行完循环体 会回来执行表达式3 然后再返回来 继续对表达式2进行判断 如果表达式2 还是成立 这继续循环往复 直到表达式2的条件…

《Fundamentals of Power Electronics》——隔离型CUK转换器、

以下是隔离型CUK转换器的相关知识点&#xff1a; Cuk电路的隔离型版本获得方式不同。基础非隔离型Cuk电路如下图所示。 将上图中电容C1分成两个串联的电容C1a和C1b&#xff0c;得到结果如下图所示。 在两个电容之间插入一个变压器&#xff0c;得到如下图所示电路。 变压器极性…

可视化大屏应用场景:智慧安防,保驾护航

hello&#xff0c;我是大千UI工场&#xff0c;本篇分享智慧安防的大屏设计&#xff0c;关注我们&#xff0c;学习N多UI干货&#xff0c;有设计需求&#xff0c;我们也可以接单。 实时监控与预警 可视化大屏可以将安防系统中的监控画面、报警信息、传感器数据等实时展示在大屏上…

Java毕业设计 基于SSM SpringBoot vue宠物领养平台

Java毕业设计 基于SSM SpringBoot vue宠物领养平台 SSM 宠物领养平台 功能介绍 首页 图片轮播 新闻信息 新闻类型 新闻详情 宠物百科 宠物百科类型 宠物百科详情 宠物 宠物类型 宠物详情 立即领养 留言 论坛 发布帖子 登录 个人中心 宠物收藏 宠物领养订单 后台管理 登录注…

ssm104园区停车管理系统+jsp

园区停车管理系统的设计与实现 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管…

链表面试题及其解析

1.返回倒数第k个节点 实现一种算法&#xff0c;找出单向链表中倒数第 k 个节点。返回该节点的值。 示例&#xff1a; 输入&#xff1a; 1->2->3->4->5 和 k 2 输出&#xff1a; 4 说明&#xff1a; 给定的 k 保证是有效的。 1.1快慢指针 即慢指针一次走一步…

关于Windows登录密码的思考题

1. windows登录的明文密码&#xff0c;存储过程是怎么样的&#xff0c;密文存在哪个文件下&#xff0c;该文件是否可以打开&#xff0c;并且查看到密文 在Windows系统中&#xff0c;密码通常以哈希值的形式存储在注册表中的SAM文件中。SAM文件位于C:\Windows\System32\config\S…

简化Transformer模型,以更少的参数实现更快的训练速度

在深度学习领域&#xff0c;Transformer模型因其卓越的性能而广受欢迎&#xff0c;但其复杂的架构也带来了训练时间长和参数数量多的挑战。ETH Zurich的研究人员Bobby He和Thomas Hofmann在最新研究中提出了一种简化的Transformer模型&#xff0c;通过移除一些非必要的组件&…

FP16、BF16、INT8、INT4精度模型加载所需显存以及硬件适配的分析

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…