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

递归实现归并排序

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

        完成一个归并排序分两步:(1)将原序列不断二分,直到子序列长度为1,这时这个子序列一定有序;(2)向上归并:每次将两个已经有序的子序列归并成一个有序的序列。

        实现归并函数的具体思路:

        (1)我们需要另一个数组,用来存放已经排好序的子序列,且这数组最好用malloc开辟在堆上,防止函数结束时栈帧销毁,数组空间的使用权限被还给操作系统。

         (2)这里使用递归的思路,将原数组从中间开始不断分,直到每一个子序列中只有一个元素,这时的子序列必定有序。定义一个begin和end,求得mid,将数组分为[begin,mid]和[mid+1,end]两个子序列,再对两个子序列分别重复上述过程。当degin>=end时,说明已经不能再分了,这时,每个子序列中只有一个元素。

        虽然图画的好像有很多数组空间的样子,但其实只是用begin和end来控制数组的区间,并没有开其他数组空间。

         (3)二路归并。就是每次让两个子序列进行归并。这时要用到tmp数组,把经过归并排序好的两个子序列的数据存起来,然后复制到a数组对应的位置,这样a数组中的部分实现有序。递归返回,重复以上步骤。

    

        这样基本就完成了一个归并排序。

void _MergeSort(int* a, int begin, int end, int* tmp)
{//小区间不存在,说明不可再分,子序列中只有一个元素if (begin >= end){return;}//找到中间下标,方便二分,递归实现int mid = (begin + end) / 2;_MergeSort(a, begin, mid, tmp);_MergeSort(a, mid + 1, end, tmp);//分别记录两个待归并的子序列的开头和结尾,方便之后控制排序int begin1 = begin, end1 = mid;int begin2 = mid + 1, end2 = end;//i用来控制数据放入tmp的位置//由于数据要放在tmp中与a对应的位置,所以给i赋值为beginint i = begin;while (begin1 <= end1 && begin2 <= end2)//两个子序列都还有数据未比较{//选择两个子序列中较小的放入tmp中if (a[begin1] < a[begin2]){tmp[i++] = a[begin1++];}if (a[begin1] >= a[begin2]){tmp[i++] = a[begin2++];}}//子序列1没排完,把剩余的都按顺序放入tmp中while (begin1 <= end1){tmp[i++] = a[begin1++];}//子序列2没排完,把剩余的都按顺序放入tmp中while (begin2 <= end2){tmp[i++] = a[begin2++];}//将在tmp中以排好的元素复制回a数组中memcpy(a + begin, tmp + begin, sizeof(int) * (end - begin + 1));
}//归并排序
void MergeSort(int* a, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);//申请和a相同大小的空间if (tmp == NULL)//申请失败,报错返回{perror("malloc fail");return;}_MergeSort(a, 0, n - 1, tmp);//完成排序free(tmp);//申请的空间不使用之后要释放,防止内存泄漏tmp = NULL;
}

相关文章:

  • RenderStage::runCameraSetUp
  • 对象存储概述
  • 《擦除序列》线性时间做法题解
  • 点云(Point Cloud)介绍
  • 可发1区的超级创新思路(python 、MATLAB实现):基于区域注意力双通道MABMA的时间序列预测模型
  • Megatron-Core 进行大规模语言模型(LLM)训练【专题2】
  • Vivado比特流生成、下载及板级验证操作步骤
  • 【C++算法】64.字符串_字符串相乘
  • 服务部署丨通过Docker部署AutoBangumi+qBittorrent实现自动追番
  • sql之DML(insert、delete、truncate、update、replace))
  • 前端工程化之自动化测试
  • 聊聊Doris的数据模型,如何用结构化设计解决实时分析难题
  • 【笔记】网路安全管理-实操
  • element-plus样式失效的原因总结
  • 机器学习(1)— 开发环境安装
  • 每天学一个 Linux 命令(25):more
  • n8n 中文系列教程_02. 自动化平台深度解析:核心优势与场景适配指南
  • Manus技术架构、实现内幕及分布式智能体项目实战 线上高级实训班
  • OzGIS:地理信息分析与处理软件
  • OpenFeign终极指南:超时控制、重试策略、拦截器与自定义Starter
  • 对话地铁读书人|来自大学教授的科普:读书日也是版权日
  • 成了“一日顶流”又能如何?
  • 释新闻|加州诉特朗普政府:美国最大经济体为何打响关税阻击战?
  • 世界银行行长:不确定性将导致全球经济增长低于预期
  • 亚马逊云:中国企业开始以“行业集群”的方式出海
  • 汪文斌人民日报撰文:让中柬友好合作结出更加丰硕的成果