当前位置: 首页 > news >正文

c语言归并排序

归并排序思想:

       归并排序可以解释为是将放在数组里的一串数字进行拆分,拆分之后再判断大小合并的过程,每次都是从中间位置拆分,例如有七个数,第一次拆分就将它们分成前三个数为一个数组,后四个数为一个数组,我们拆分之后在堆区开辟空间来存放这两个数组,将拆分的两个数组按照第一次拆分一样的方法对它俩再进行拆分,直到每个数组里面都只有一个元素就结束;拆分之后从最后往前依次判断合并。

 

#include <stdio.h>
#include <stdlib.h>
void sort(int *a,int n);   //拆分
void merge(int *a,int *left,int leftlen,int *right,int rightlen); //合并
void show(int *a,int n);
int main(int argc, char *argv[])
{ int a[10] = {5,46,12,34,55,9,48,79,23,10};puts("排序前:");show(a,10);sort(a,10);puts("排序后:");show(a,10);return 0;
} 
void merge(int *a,int *left,int leftlen,int *right,int rightlen) //合并
{int i=0; //左边数组的下标int j=0; //右边数组的下标int k=0; //归并数组的下标while(leftlen>i && rightlen>j){if(left[i]<right[j])    //从小到大排列合并{a[k++] = left[i++];}elsea[k++] = right[j++];}if(leftlen>i)   //如果右边数组拿完左边数组还有,就将剩下的全部放入合并数组{a[k++] = left[i++];}if(rightlen>j)  //反之{a[k++] = right[j++];}
}
void sort(int *a,int n)   //拆分
{if(n<2)    //递归终止条件,当数组中元素只有一个时就结束return;int mid = n/2; //求中间值int *left = (int *)malloc(sizeof(int)*mid);      //开存放拆分数据的空间int *right = (int *)malloc(sizeof(int)*(n-mid));for(int i=0;i<mid;i++)  //将a左边的数据存入left{left[i] = a[i];}for(int j=mid;j<n;j++)  //将a右边的数据存入right{right[j-mid] = a[j];}sort(left,mid);     //将left中的数再进行拆分sort(right,n-mid);  //将right中的数据再进行拆分merge(a,left,mid,right,n-mid);free(left);         //释放空间free(right);
}
void show(int *a,int n)
{for(int i=0;i<n;i++){printf("%d ",a[i]);}puts("");
}

解析:在上述思想中我们提到了对不同的数组做同样的操作,因此这里就可以通过使用递归函数来实现;我们将代码分为两个函数来写,一个是拆分函数,另一个是合并函数:

拆分函数:

       拆分函数我们需要传进去的参数为数组元素首地址和数组长度,既然拆分函数为递归函数,那我们就需要有结束条件,在这里结束条件就为数组长度n为1时就结束;拆分首先是找到数组中间的元素下标,从中间拆分为左右两个数组,根据左右数组长度来开辟对应大小的空间,开辟完空间之后将左右数组元素存入到空间中,存入之后再调用拆分函数自己,将左右函数的元素首地址和长度当做参数传入,这样就可以再次对函数进行拆分,拆分结束之后就是合并函数;

合并函数:

       合并函数需要传入的参数有五个,第一个就是原来需要拆分的数组的首地址,用来存放合并后的元素,后面四个参数分别是左边数组的元素首地址、左边数组的长度、右边数组的元素首地址、右边数组的长度;在合并函数里面我们首先需要定义三个变量分别来代表左边数组的元素下标、右边数组的元素下标和合并数组的元素下标;在合并的时候只要左右两边数组都有元素,就需要进行判断大小,于是循环表达式为leftlen>i && rightlen>j;在比较完之后就是将数存入合并数组,存入哪个数组的数就让对应数组的下标自加1,这样下次就能判断下一个数,直到有一边数组中的元素被全部拿出存入到合并数组就结束循环判断,这时需要判断左右数组中是否有剩余的元素,有的话依次存入到合并数组中;

       合并函数写完之后我们就可以在拆分函数中调用它,在左右数组拆分完之后就调用合并函数进行合并,合并完成之后还有一件事宝子们不要忘啦,那就是释放空间,因为存放左右数组元素的空间是我们自己开辟的堆区空间,所以需要我们自己释放。释放之后排序也就结束了,最后再循环遍历一下原数组就可以看到已经排好序啦。

 

相关文章:

c语言归并排序

归并排序思想&#xff1a; 归并排序可以解释为是将放在数组里的一串数字进行拆分&#xff0c;拆分之后再判断大小合并的过程&#xff0c;每次都是从中间位置拆分&#xff0c;例如有七个数&#xff0c;第一次拆分就将它们分成前三个数为一个数组&#xff0c;后四个数为一个数组&…...

碳化硅陶瓷膜的特性

无机膜包括金属膜、陶瓷膜、玻璃膜等等&#xff0c;其中在水处理领域里出镜最多、应用最广的当属陶瓷膜。比起高分子有机膜&#xff0c;陶瓷膜硬度更高、通量更大、寿命更长&#xff0c;然其性能优越&#xff0c;成本也很“高昂”&#xff0c;故其生存空间自然是受到高分子有机…...

机器学习(三)——决策树(附核心思想、重要算法、概念(信息熵、基尼指数、剪枝处理)及Python源码)

目录 关于1 基本流程2 划分属性的选择2.1 方法一&#xff1a;依据信息增益选择2.2 方法二&#xff1a;依据增益率选择2.3 方法三&#xff1a;依据基尼指数选择 3 剪枝处理&#xff1a;防止过拟合3.1 预剪枝3.2 后剪枝 4 连续与缺失值4.1 连续值处理4.2 缺失值处理 5 多变量决策…...

良心无广,这五款电脑软件堪称必备,最后一个比快播都猛

来吧&#xff0c;直接上狠货&#xff01; 哔哔音乐 这是一个基于哔哩哔哩开发的电脑听歌软件&#xff0c;众所周知&#xff01;B站其实就是一个巨大的曲库&#xff0c;啥歌各种版本都能在这里找到。 所以如果依托B站开发听歌软件&#xff0c;那就是真的香&#xff0c;而且软件…...

Vue3中实现原生CSS完成圆形按钮点击粒子效果和定点旋转动画

效果&#xff1a; 源码&#xff1a; <script setup> import { ElMessage } from "element-plus"; const isClick () > {ElMessage.success(Clicked); }; </script><template><button click"isClick" class"button">…...

百度网盘 服务器开小差了

有会员&#xff0c;新上传文件到百度网盘&#xff0c;分享链接&#xff0c; 别人打开链接&#xff0c;显示【服务器开小差了&#xff0c;请稍后重试~】&#xff0c;保存不了 试了几个都不行&#xff0c;文件是视频MP4 可行的方法是百度网盘加好友&#xff0c;然后在聊天页面单…...

数据分析师招聘要求

在当今数据驱动的世界中&#xff0c;数据分析师的角色变得愈发重要&#xff0c;他们被赋予从海量数据中提炼洞察的关键任务。数据分析师的招聘要求反映了这个职位多方面的需求&#xff0c;从教育背景到技能&#xff0c;再到软技能和行业特有的知识。本文将详细探讨这些要求&…...

【C语言】实战-力扣题库:回文链表

题目描述 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 提示&#xff1a; 链表中节点数目在范围[1, 105] 内0 < Node.val < 9 进阶&#xff1a;你能否用 O(n) 时间…...

Centos安装Minio

文章目录 1 远程下载二进制文件2 创建目录&#xff1a;文件存储、日志3 授权执行4 启动5 创建配置文件6 注册服务并开机自启7 创建key附录参考文档 1 远程下载二进制文件 [rootlocalhost bin]# cd /opt/package [rootlocalhost package]# wget https://dl.min.io/server/minio…...

二叉树的基本概念和底层实现

1. 树型结构 1.1 认识树 在学习二叉树之前我们需要了解一下树型结构 树是一种非线性的数据结构,它是由n个结点组成的一个有层次关系的集合,看起来像个倒挂的树,也就是根朝上,枝叶朝下. 特点: 1. 根结点没有前驱结点 2. 除了根结点外其他的结点被分为互不相交的集合,每个集合又…...

GIF图片格式详解(三)

gif历史部分介绍请参考上一篇《GIF图片格式详解&#xff08;一&#xff09;》&#xff0c; 格式部分详解参考 《GIF图片格式详解&#xff08;二&#xff09;》 或直接访问博客地址&#xff1a;https://blog.whatsroot.xyz/2023/12/16/all-about-gif/ 本篇介绍下用于处理gif图…...

类和对象相关题

文章目录 1. 求123...n2. 计算是这一年的第几天3. 求两个日期之间的天数4. 算出第n天是几月几号5. 计算一个日期加上若干天后是什么日期 1. 求123…n 求123…n&#xff0c;要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句&#xff08;A?B:C&a…...

Word大珩助手:超大数字怎么读?35位数字?69位数字?

俄罗斯日前对谷歌开出了20000000000000000000000000000000000&#xff08;35位数字&#xff09;美元的罚款 这一数字远超全球GDP总和&#xff0c;消息一出很快就登上热搜。 面对这样一个庞大的数字&#xff0c;人们不禁好奇&#xff0c;这样的数字该如何读出来&#xff1f; …...

阿里云k8s-master部署CNI网络插件遇到的问题

问题 按照网络上的部署方法 cd /opt/k8s # 下载 calico-kube-controllers配置文件&#xff0c;可能会网络超时 curl https://docs.projectcalico.org/manifests/calico.yaml -O kubectl apply -f calico.yaml 试了很多次都不行&#xff0c;k8s-master都是Not ready的状态 ca…...

【LwIP源码学习4】主线程tcpip_thread

前言 本文对lwip的主要线程tcpip_thread进行分析。 正文 tcpip_thread是lwip最主要的线程&#xff0c;其创建在tcpip_init函数中 sys_thread_new(TCPIP_THREAD_NAME, tcpip_thread, NULL, TCPIP_THREAD_STACKSIZE, TCPIP_THREAD_PRIO);tcpip_init函数被TCPIP_Init函数调用。…...

求猫用宠物空气净化器推荐,有没有吸毛强、噪音小的产品

自从成为铲屎官&#xff0c;真的和当妈没有区别了。家里的毛孩子成天掉毛&#xff0c;我就跟在它屁股后面默默收拾&#xff0c;一举一动都要时刻关注。最近换季&#xff0c;家里还多了不少浮毛&#xff0c;全飘在空气中&#xff0c;阳光照射下非常明显。 我妈看到后各种吐槽&a…...

pycharm中python控制台出现CommandNotFoundError: No command ‘conda run‘.

1、错误现象 pycharm中打开python控制台出现CommandNotFoundError: No command conda run.的错误。 2、背景 conda是4.6版本&#xff0c;在Anaconda Prompt可以正常运行虚拟环境。 3、解决方法 更新conda版本&#xff0c;基本命令&#xff0c;会自动更新到最新版本。 con…...

架构师备考-架构基本概念

目录 基本概念 架构设计与生命周期 需求分析 设计阶段 实现阶段 构件组装阶段 部署阶段 后开发阶段 动态软件体系结构 体系结构恢复与重建 软件架构设计的重要性 基本概念 软件架构&#xff08;Software Architecture&#xff09;设计主要关注软件构件的结构、属性和…...

信奥赛C++知识点

参加信息学奥林匹克竞赛&#xff08;信奥赛&#xff09;所需学习的C知识点&#xff0c;以下是一个详细的知识点列表&#xff1a; 一、C语言基础 程序结构 头文件&#xff1a;包含必要的头文件&#xff0c;如<iostream>用于输入输出。 命名空间&#xff1a;使用using …...

高并发内存池扩展 -- 处理大内存,优化释放时需要传入空间大小,加入定长内存池,存放映射关系的容器的锁机制,优化性能(基数树,优势,优化前后对比)

目录 高并发内存池 扩展 测试 大内存 介绍 代码 优化释放时需要传入空间大小 介绍 赋值 代码 加入定长内存池 引入 介绍 代码 存放映射关系的容器 锁机制 写入 读取 优化性能 引入 基数树 单级基数树 两级基数树 三级基数树 优势 引入代码 优化前后…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

FOPLP vs CoWoS

以下是 FOPLP&#xff08;Fan-out panel-level packaging 扇出型面板级封装&#xff09;与 CoWoS&#xff08;Chip on Wafer on Substrate&#xff09;两种先进封装技术的详细对比分析&#xff0c;涵盖技术原理、性能、成本、应用场景及市场趋势等维度&#xff1a; 一、技术原…...

ubuntu中安装conda的后遗症

缘由: 在编译rk3588的sdk时&#xff0c;遇到编译buildroot失败&#xff0c;提示如下&#xff1a; 提示缺失expect&#xff0c;但是实测相关工具是在的&#xff0c;如下显示&#xff1a; 然后查找借助各个ai工具&#xff0c;重新安装相关的工具&#xff0c;依然无解。 解决&am…...