【C语言】【排序算法】----- 归并排序

由于最近要考试,好久没有发博客了,非常抱歉大家对我的支持。之后我会不断更新博客,继续创作出高质量的文章,希望能帮到大家!

文章目录

  • 一、归并排序基本思想
  • 二、递归实现
  • 三、非递归实现
  • 四、效率分析

一、归并排序基本思想

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法,即分解和合并。先使每个子序列有序,再使子序列段间有序,最后合并成一个有序数组。
在这里插入图片描述

二、递归实现

  1. 基本思路:
    ① 申请一个空间tmp,大小为两个已经排好序列之和,该空间用来存放合并后的序列。
    ② 设定两个下标,分别指向两段已排好序的起始位置。
    ③ 比较两个下标所指向的元素大小,选择较小的元素放入到合并空间,并且移动指针指向下一位置。
    ④ 不断重复步骤③,直到当某一指针到达序列尾部。
    ⑤ 然后将另一序列剩下的所有元素直接插入到合并序列的尾端。
  2. 代码实现:
//归并排序递归
void _MergeSort(int* a, int* tmp, int begin, int end)
{//只有一个元素或不存在这样的区间时if (begin >= end){return;}//分成两段区间,分别有序时在进行归并int mid = (begin + end) / 2;_MergeSort(a, tmp, begin, mid);_MergeSort(a, tmp, mid + 1, end);//第一个数组的两端int begin1 = begin, end1 = mid;//第二个数组的两端int begin2 = mid + 1, end2 = end;//由于两段数组都是从begin开始,因此将begin给i确保其在相同的区间上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++];}//tmp已经归并成功,将tmp复制会数组a中memcpy(a + begin, tmp + begin, (end - begin + 1) * sizeof(int));
}void MergeSort(int* a, int n)
{assert(a);//创建一个临时数组int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){perror("malloc fail");return;}_MergeSort(a, tmp, 0, n - 1);free(tmp);tmp = NULL;
}

三、非递归实现

非递归实现是一种迭代式的排序算法,它避免了递归所带来的额外开销,通常使用循环的方式来解决。

  1. 基本思路:
    将一个数组通过gap分为几组进行合并,然后让gap每次扩大2倍,但gap < 数组元素个数的大小。
  2. 越界问题:
    我们可以很容易想到代码实现的思路,但难点就在于如何控制每一段区间的边界,从而避免下标越界的问题。
    这里有三种可能会出现越界的问题,分别为:
    ①当第一段区间末尾end1大于或等于该区间元素个数。
    ②当第二段区间不存在,需要进行修改区间。
    解决方法:
    ①第一种问题我们可以让其直接break。因为其右边没数据存在,因此就算进入循环中剩余的元素也不会发生改变。
    ②第二种问题,当第二段区间bgein2大于或等于该区间元素个数时,不进入循环,直接break;当第二段区间的结尾end2大于或等于n时,我们只需将end2修改为n-1即可,因为n-1正好为整个数组的边界。
  3. 代码实现:
    注意:
    当我们将临时数组tmp拷贝回原数组时:
    ①起始点为:tmp + i,因为i是每次归并后第一个元素的第一个位置。
    ②拷贝回去的元素个数:end2 - i + 1。因为end2指向的每次归并后第二组元素的最后一个位置,而i所指向的是每次归并后的第一个元素的第一个位置。
//归并排序的非递归实现
void MergeSortNonR(int* a, int n)
{	//开辟一个临时数组,来存取排好序的元素int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){perror("malloc fail");return;}int gap = 1;int i = 0;int j = 0;while (gap < n){for (i = 0; i < n; i += 2 * gap){//[i,i+gap-1]  [i+gap,i+2*gap-1}int begin1 = i;int end1 = i + gap - 1;int begin2 = i + gap;int end2 = i + 2 * gap - 1;j = i;// 考虑end1 begin2 end2三者分别越界的问题if (end1 >= n){break;}else if (begin2 >= n){break;}else if (end2 >= n){end2 = n - 1;}while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){tmp[j++] = a[begin1++];}else{tmp[j++] = a[begin2++];}}while (begin1 <= end1){tmp[j++] = a[begin1++];}while (begin2 <= end2){tmp[j++] = a[begin2++];}memcpy(a + i, tmp + i, sizeof(int) * (end2 - i + 1));}gap *= 2;}free(tmp);tmp = NULL;
}

四、效率分析

归并排序的时间复杂度为:O(N * log2N) 因为向下递归的时间复杂度为O(log2N),再遍历一次数组的时间复杂度为O(N)。

归并排序的空间复杂度为:O(N) 需要创建一个辅助数组tmp用来存归并后的序列。

归并排序的稳定性:稳定。根据arr[begin1] <= arr[begin2],我们可以得出相同的元素先排第一组,然后再排第二组的元素,因此相同元素的相对位置不会改变。

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

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

相关文章

KDP数据分析实战:从0到1完成数据实时采集处理到可视化

智领云自主研发的开源轻量级Kubernetes数据平台&#xff0c;即Kubernetes Data Platform (简称KDP)&#xff0c;能够为用户提供在Kubernetes上的一站式云原生数据集成与开发平台。在最新的v1.1.0版本中&#xff0c;用户可借助 KDP 平台上开箱即用的 Airflow、AirByte、Flink、K…

关于原型和原型链的学习和实践

在前端面试中&#xff0c;原型和原型链始终是一个避不开的问题&#xff0c;今天就弄明白! 原型和原型链 对象的创建方式工厂模式构造函数模式原型模式 原型和原型链实践 对象的创建方式 原型和原型链都是关于对象的内容&#xff0c;先来看一下JavaScript中对象的构建方式。 工…

代码随想录(day3)有序数组的平方

暴力求解法&#xff1a; 注意&#xff1a;需要确定范围&#xff0c;比如nums.sort()是在for循环之外&#xff0c;根据函数的功能来确定 return返回的是nums&#xff0c;而不是nums[i]因为返回的是整个数组 class Solution(object):def sortedSquares(self, nums):for i in r…

人话学Python-基础篇-数字计算

一&#xff1a;数字类型 对于最常见的数据类型,数字在Python中分为三类&#xff1a; 整型(int) 表示的是整数类型的所有数字&#xff0c;包括正整数&#xff0c;负整数和0。和C语言不同的是&#xff0c;Python中的int型没有范围的限制&#xff0c;理论上可以从无限小的整数取到…

react基础语法,模板语法,ui渲染,jsx,useState状态管理

创建一个react应用 这里使用create-react-app的脚手架构建项目&#xff08;结构简洁&#xff0c;基于webpack-cli&#xff09;&#xff0c; npx create-react-app [项目名称] 使用其他脚手架构建项目可以参考&#xff1a;react框架&#xff0c;使用vite和nextjs构建react项目…

数学建模国赛入门指南

文章目录 认识数学建模及国赛认识数学建模什么是数学建模&#xff1f;数学建模比赛 国赛参赛规则、评奖原则如何评省、国奖评奖规则如何才能获奖 国赛赛题分类及选题技巧国赛赛题特点赛题分类 国赛历年题型及优秀论文数学建模分工技巧数模必备软件数模资料文献数据收集资料收集…

白蛇插画:成都亚恒丰创教育科技有限公司

白蛇插画&#xff1a;古韵今风&#xff0c;情深意长 在浩瀚的艺术长河中&#xff0c;插画作为一种独特的艺术形式&#xff0c;以其生动形象的画面、丰富多彩的色彩和深邃悠远的意境&#xff0c;成都亚恒丰创教育科技有限公司深受人们喜爱。而“白蛇插画”&#xff0c;作为融合…

bug - while parsing file included at

bug 如下 找到这个对应文件tb_top.sv的对应行&#xff0c;发现是一个 include "inc_tb_tests_xxx.sv" 问题点&#xff1a;头文件&#xff0c;重复定义&#xff0c;那么 解决方法- 在被include的文件首尾加入 ifndef MY_TRANSACTION__SV define MY_TRANSACTION__SV …

GenAI 技术堆栈架构师指南 - 十种工具

这篇文章于 2024 年 6 月 3 日首次出现在 The New Stack 上。 我之前写过关于现代数据湖参考架构的文章&#xff0c;解决了每个企业面临的挑战——更多的数据、老化的Hadoop工具&#xff08;特别是HDFS&#xff09;以及对RESTful API&#xff08;S3&#xff09;和性能的更大需求…

前端--第一个前端程序

第一个前端程序 第一步&#xff1a; 使用记事本&#xff0c;编写代码 在你的一个磁盘里面创建一个文件夹&#xff0c;名为前端&#xff0c;然后在里面新建一个记事本&#xff0c;在里面写如下代码&#xff0c;注意一定要使用英文&#xff0c;然后把后缀名称改为.html。 第二…

你明白C++中的多态吗?(暑假提升-多态专题)

内不欺己&#xff0c;外不欺人。———孔子 有趣的多态 1、前言2、概念3、多态定义与产生条件4、多态的重要组成成员-(虚函数)5、虚函数的重写(覆盖)6、辅助关键字override与final(了解即可)7、重载&#xff0c;重定义(隐藏)&#xff0c;重写(覆盖)8、抽象类9、多态的原理9、1、…

PHP老照片修复文字识别图像去雾一键抠图微信小程序源码

&#x1f50d;解锁复古魅力&#xff0c;微信小程序黑科技大揭秘&#xff01;老照片修复&更多神奇功能等你来试&#xff01; &#x1f4f8; 【老照片修复&#xff0c;时光倒流的美颜术】 你是否珍藏着一堆泛黄的老照片&#xff0c;却因岁月侵蚀而模糊不清&#xff1f;现在…

实验02 黑盒测试(组合测试、场景法)

1. 组合测试用例设计技术 指出等价类划分法和边界值分析法通常假设输入变量相互独立&#xff0c;但实际情况中变量间可能存在关联。全面测试&#xff1a;覆盖所有输入变量的所有可能组合&#xff0c;测试用例数量随输入变量的增加而指数增长。 全面测试需要对所有输入的各个取…

2008年上半年软件设计师【上午题】真题及答案

文章目录 2008年上半年软件设计师上午题--真题2008年上半年软件设计师上午题--答案 2008年上半年软件设计师上午题–真题 2008年上半年软件设计师上午题–答案

按模版批量生成定制合同

提出问题 一个仪器设备采购公司&#xff0c;商品合同采购需要按模版生成的固定的文件&#xff0c;模板是固定的&#xff0c;只是每次需要替换信息&#xff0c;然后打印出来寄给客户。 传统方法 如果手工来做这个事情&#xff0c;准备好数据之后&#xff0c;需要从Excel表格中…

高效应对网络攻击,威胁检测响应(XDR)平台如何提升企业应急响应能力

在数字化时代&#xff0c;企业面临的网络攻击威胁持续增加&#xff0c;如恶意软件、勒索软件、钓鱼攻击、DDoS攻击等。这些威胁不仅危及企业数据安全、系统稳定&#xff0c;还损害了品牌形象和市场信任。随着云计算、大数据、物联网的广泛应用&#xff0c;企业网络攻击面扩大&a…

MAVLink代码生成-C#

一. 准备Windows下安装环境 Python 3.3 – 官网链接下载Python future模块 –pip3 install future TkInter (GUI 工具). – python for Windows自带&#xff0c;无需下载环境变量PYTHONPATH必须包含mavlink存储库的目录路径。 –set PYTHONPATH你的mavlink源码路径 源码下载在…

【昆工主办|7月昆明】第三届绿色建筑、土木工程与智慧城市国际会议(GBCESC 2024)

随着全球城市化进程的加速&#xff0c;绿色建筑、土木工程与智慧城市等议题逐渐成为了行业内外关注的焦点。在这一背景下&#xff0c;第三届绿色建筑、土木工程与智慧城市国际会议&#xff08;GBCESC 2024&#xff09;的召开&#xff0c;无疑将为相关领域的研究者、学者及从业者…

原理和组成

能力要素&#xff1a;&#xff08;1&#xff09;人员要素&#xff1a;“正确选人”。&#xff08;2&#xff09;过程要素&#xff1a;“正确做事”。&#xff08;3&#xff09;技术要素&#xff1a;“高效做事”。&#xff08;4&#xff09;资源要素&#xff1a;“保障做事”。…

【ARM】MDK-解决Flexnet服务的error:-13.66

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 记录MDK网络版部署服务器error &#xff1a;-13.66的问题解决方案&#xff0c;后续有相关发现持续更新。 2、 问题场景 在客户的服务器上部署Flexnet服务&#xff0c;将license文件检查过后&#xff0c;确认MAC地址…