归并排序(C语言)详解

2023-05-16

记录学习第五天
今天记录一下归并排序,因为在csdn里面没有找到特别清楚的解析,所以想自己写的认真一点,也查阅了一些资料,通过这篇博客记录一下;
在这里插入图片描述
归并排序,光看字面,归并,似乎是把两个合并到一起,也是由此我们也就先来说一下归并排序的基本原理。
如果有两个已经排序好的数组
{1,4,6,8},{2,7,9,12};
我们要把这两个数组合并再排序;
目标数组应该是{1,2,4,6,7,8,9,12};
那是不是说,我们要把{1,4,6,8,2,7,9,12}这个数组,给按从小到大排序成为这个目标数组;
现在我们来实现一下;
在这里插入图片描述
我们用 i 来表示{1,4,6,8}中的第一个元素1;
用 j 来表示{2,7,9,12}中的第一个元素2;
用 k 来表示新数组也就是待排序的数组的第一个元素;
然后,重要的来了!
在这里插入图片描述
判断 i 和 j的大小;
如果i<j,那么就让k=i;i++,k++;
如果i>j,那么就让k=j;j++,k++;
最后,一定会有一个数组里面留下元素,例如上面这个;
{2,7,9,12}中会有9和12留下,最后再把9和12放在待排序的数组里面就好了!
在这里插入图片描述

所以如果有一个数组是{1,4,6,8,2,7,9,12};
要对它进行排序,是不是应该给它分成两半分别是{1,4,6,8}和{2,7,9,12};
在进行上面的操作;
其实很简单,我们设三个变量left代表1,mid代表8,right代表12;
left 到 mid 就是{1,4,6,8},mid+1到 right 就是{2,7,9,12}

思路就是这样
接下来用代码实现一下
在这里插入图片描述

int merge(int r[],int s[],int left,int mid,int right)
{
    int i,j,k;
    i=left;
    j=mid+1;
    k=left;
    while((i<=mid)&&(j<=right))
        if(r[i]<=r[j])
        {
            s[k] = r[i];
            i++;
            k++;
        }
        else
        {
            s[k]=r[j];
            j++;
            k++;
        }
        while(i<=mid)
            s[k++]=r[i++];
        while(j<=right)
            s[k++]=r[j++];
    return 0;
}

这部分呢就是对{1,4,6,8,2,7,9,12}这样的数组进行排序的功能;

那会有同学问了,难道归并排序只能对这样的两个已经排序好的数组操作吗。
那他好垃圾啊;
在这里插入图片描述
不不不,当然不是这样的。
如果给一个数组{4,12,8,9,6,2,7};
咱归并是毫不抗拒的,不过呢,只靠上面的代码显然是实现不出来的。
那怎么办呢,加东西喽!
在这里插入图片描述
这就要用到一个叫做分治法的一个思想;
怎么回事呢;
就是把{4,12,8,9,6,2,7}分成两半,去执行上面的排序功能,哎我发现分割后;
{4,12,8}和{9,6,2,7}这两个也不满足我排序功能的条件啊!
在这里插入图片描述
哎,那我就吧{4,12,8}和{9,6,2,7}都再次分成两半;再去归并排序;
啊?你说还不满足,那就再给我分!最后分成一堆就剩两个元素的数组,一定满足了吧!
在这里插入图片描述
现在,我们用递归的方法把这个给实现出来;

int merge_sort(int r[],int s[],int left,int right)
{
    int mid;
    int t[20];
    if(left==right)
        s[left]=r[right];
    else
    {
        mid=(left+right)/2;
        merge_sort(r,t,left,mid);
        merge_sort(r,t,mid+1,right);
        merge(t,s,left,mid,right);
    }
    return 0;
}

完全ojbk,归并排序的两个功能块我们就全实现出来了,现在我们来用主函数测试一下!
在这里插入图片描述

int main()
{
    int a[10];
    int i;

    for(i=0;i<10;i++)
        scanf("%d",&a[i]);
    merge_sort(a,a,0,9);

    for(i=0;i<10;i++)
        printf("%d ",a[i]);
    return 0;
}

然后再附上我的运行结果:
在这里插入图片描述
ok,今天的就到此结束了!
给自己点一个赞;
啊啊哈哈哈
归并排序就这样!
end。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

归并排序(C语言)详解 的相关文章

  • ubuntu编译camera_model报错:fatal error: elfutils/libdw.h: 没有那个文件或目录

    一 报错 二 解决 执行指令 sudo apt span class token operator span get install libdw span class token operator span dev
  • 聊一聊SLAM核心算法之ESKF多传感器融合算法

    作者 应知 编辑 汽车人 原文链接 xff1a https zhuanlan zhihu com p 628074965 点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 点击进入 自动驾驶之心
  • Ubuntu20.04跑VINS-fusion

    Ubuntu20 04跑VINS Fusion 使用docker 由于工程较大 xff0c 依赖较多 xff0c 环境配置十分繁琐 xff0c 故使用docker环境来运行VINS Fusion Docker 可以让开发者打包他们的应用以及
  • ubuntu20.04跑PL-VINS

    PL VINS源码 xff1a https github com cnqiangfu PL VINS 编译时报错 catkin make Ceres报错 报错信息 CMake Error at usr local lib cmake Cer
  • unubtu20.04环境下inter d435i相机标定遇到的一些问题

    前言 最近拿到深度相机inter d435i 但是在ros开发中遇到了一些问题 这里我就将我遇到的问题跟解决的办法讲一下 我采用的是双系统ubuntu系统环境下开发的 并不是基于虚拟机开发的 先提一下 问题1 select timeout报
  • 页面报错:Invalid prop: custom validator check failed for prop “percentage“.

    问题 xff1a 使用element 组件库的el progress组件 xff0c 页面正常渲染 xff0c 但是控制台有报错 xff1a 出现问题代码如下 xff1a lt el progress percentage 61 34 en
  • 将mysql中的数据导入到hdfs中

    将mysql中的数据导入到hdfs中 mysql中的数据导入到hdfs中 xff0c 需要借助一个工具sqoop完成 xff0c sqoop的安装和简介请点大数据必学框架 sqoop 一 配置sqoop环境 为了能够让sqoop识别到hdf
  • 串口通信——串口接收数据,发送数据

    十六进制 HEX hexadecimal heks des ml 十进制 DEC decimalism 39 desim liz m 二进制 BIN binary ba n ri 八进制 OCT octonary kt n ri 波特率计算
  • 大疆半固态激光雷达Horizon的优缺点

    原文链接 xff1a 大疆激光雷达 xff0c 车厂为何不爱 xff1f 优点 xff1a 1 成本低 xff0c 可以量产 xff1a 2020 年 xff0c 在当年的 CES 展会上 xff0c 大疆 Livox 发布了 Horizo
  • Ubuntu18.04切换Python版本

    转载自 xff1a Ubuntu18 04 切换 Python 版本 前言 Ubuntu18 04 默认安装了两个版本 Python2 7 和 Python3 6 查看可用二进制文件 ls usr bin python 过程 使用 upda
  • 解决ubuntu1604联网以后网页还是打不开的问题

    ubuntu系统连接正常的联网的网线但是网页还是打不开 xff0c 所有联网的软件也打不开 xff0c 在路由器工作正常的情况下 xff0c 可能出现的问题为dns解析异常 xff0c 关于dns解析异常的解决方法 xff1a 这段时间在u
  • 操作系统--线程并发实验三

    操作系统 线程并发实验三 一 实验目的 线程的运行时并发的 xff0c 如果互不相干的线程交替运行不会产生问题 但是如果有共享资源 合作关系的线程之间由于交替运行可能产生问题 xff0c 例如偶尔出现程序的结果不正常 理解临界区的概念 xf
  • 安装OOQP遇到问题

    Ubuntu20 04 安装OOQP遇到问题 OOQP安装 OOQP安装 MA27是OOQP的依赖 在安装MA27时容易出现找不到fortran77等情况 xff0c 在配置这些环境时容易出现其他错误导致系统环境出现问题 选择其他版本的安装
  • 15个好用的百度网盘搜索引擎

    15个好用的百度网盘搜索引擎 前言 分享 15 个好用的百度网盘搜索引擎 xff0c 方便大家搜索百度云网盘分享的资源文件 挑出来这 15 个效果还不错 xff0c 都可以正常使用 挑选标准 xff1a 免费 xff0c 大部分不登录可用
  • 操作系统死锁实验六

    操作系统死锁实验六 一 实验目的 如果一个进程集合中的每个进程都在等待只能由该进程集合中的其他进程才能引发的事件那么该进程集合就是死锁的 产生死锁的必要条件 xff1a 互斥 xff1b 请求资源和保持已获得资源不释放 xff1b 不可抢占
  • 修复 Windows11 打不开 Windows安全中心

    修复 Windows 打不开 Windows安全中心 遇到以上问题我们直接上解决方法 win10的话直接WIN 徽标 43 X键 win11 菜单栏输入 PowerShell 管理员启动 管理员权限打开PowerShell xff0c 依次
  • webstorm/idea 配置less环境

    看了一下发现大多数教程少了最关键的一步 如果这个lessc不能自动识别的话 需要手动寻找lessc cmd的路径 xff0c 可以在终端中通过 where lessc查找 复制lessc cmd位置就可以了
  • 自定义http钩子

    简单创建一个自定义http钩子函数 span class token keyword import span span class token punctuation span useState span class token punct
  • React Redux 工具包 Redux Toolkit 初步学习

    Redux 工具包 xff08 Redux Toolkit xff09 的目标是帮助简化常见的 Redux 用例 它并不是你想要用 Redux 做的所有事情的完整解决方案 xff0c 但它应该使你需要编写的许多与 Redux 相关的代码变得
  • 卫星导航模拟器GSS7000测试NTRIP RTK--以Ublox F9P 为例.rtklib原始观测量解算固定解FIX

    GSS7000 Ntrip 测试指南 Ntrip Networked Transport of RTCM via Internet Protocol 通过互联网进行RTCM网络传输的协议 是在互联网上进行RTK数据传输的协议 Ntrip是一

随机推荐