news 2026/6/10 19:49:19

C语言归并排序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言归并排序

归并排序

  1. 归并排序——最常见的分治排序算法;
  2. 把两个已经有序的数组合并成一个有序数组

一、归并排序思路

  1. 分:递归地把当前区间 [left, right] 一分为二,直到区间长度 ≤1。
  2. 治:把两个已经有序的子区间合并成一个有序区间。
  3. 合并时需要额外 O(n) 的辅助空间;时间复杂度稳定 O(n log n),是稳定排序。

二、核心过程:

功能:把两个有序子数组 a[low…mid] 和 a[mid+1…high] 原地归并到临时数组 tmp,最后再拷回去。

关键点

  • 用双指针 i、j 分别扫描左右两段;
  • 每次把较小的元素放到 tmp[k],指针后移;
  • 某一段耗尽后,把另一段剩余元素全部追加;
  • 最后把 tmp[low…high] 复制回原数组对应位置。

三、完整代码

#include<stdio.h>#include<stdlib.h>#include<string.h>/* 合并两个有序区间 a[low..mid] 与 a[mid+1..high] */staticvoidmerge(int*a,intlow,intmid,inthigh){inti=low,j=mid+1,k=0;int*tmp=malloc((high-low+1)*sizeof(int));if(!tmp){perror("malloc");exit(EXIT_FAILURE);}/* 二路归并 */while(i<=mid&&j<=high)tmp[k++]=(a[i]<=a[j])?a[i++]:a[j++];while(i<=mid)tmp[k++]=a[i++];while(j<=high)tmp[k++]=a[j++];/* 拷回原数组 */memcpy(a+low,tmp,(high-low+1)*sizeof(int));free(tmp);}/* 归并排序递归主体 */staticvoidmerge_sort(int*a,intlow,inthigh){if(low<high){intmid=low+(high-low)/2;/* 防溢出 */merge_sort(a,low,mid);merge_sort(a,mid+1,high);merge(a,low,mid,high);}}/* 对外接口:排序长度为 n 的整型数组 */voidmerge_sort_int(int*a,size_tn){if(n>1)merge_sort(a,0,(int)n-1);}/* ---- 测试 ---- */intmain(void){intarr[]={8,3,6,7,1,5,2,4};size_tn=sizeof(arr)/sizeof(arr[0]);merge_sort_int(arr,n);for(size_ti=0;i<n;++i)printf("%d%c",arr[i],i+1==n?'\n':' ');return0;}

四、常见变形与考点

  1. 链表归并排序
    链表无法随机拆分,用快慢指针找中点,然后递归归并,空间可做到 O(log n)(递归栈)。

  2. 外排序
    文件太大内存放不下,先分段生成有序临时文件,再做多路归并。

  3. 逆序对
    在 merge 过程中,若左边元素 > 右边元素,则左边剩余元素都与该右边元素构成逆序对,可顺手统计。

  4. 原地归并
    经典算法有 “旋转法” 或 “缓冲法”,但实现复杂且常数大,实际工程里仍用辅助数组。

五、复杂度小结

  • 时间:每次合并 O(n),共 log₂n 层 ⇒ O(n log n)
  • 空间:辅助数组 O(n) + 递归栈 O(log n)
  • 稳定性:稳定(相等元素相对顺序不变)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 17:48:16

如何优雅的应对屎山代码[特殊字符]

你眼中的 “烂代码”&#xff0c;或许曾支撑过公司的核心业务&#xff0c;甚至藏着你不知道的 “隐形坑”&#xff0c;就像是《左耳》里面写的&#xff1a;“前任也曾是爱的人”。 核心&#xff1a;职场不是 “写漂亮代码的乌托邦”&#xff0c;而是 “解决问题的修罗场”。 如…

作者头像 李华
网站建设 2026/6/10 17:35:29

基于Spring Boot+Vue的档案数字化项目管理系统

目录 项目介绍 演示视频 系统展示 代码实现 推荐项目 项目开发总结 为什么选择我 源码获取 博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领…

作者头像 李华
网站建设 2026/6/10 13:54:37

vue基于Spring Boot框架的宠物收养志愿者管理系统的设计与实现_0mp970vp

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;同时还支持java、ThinkPHP、Node.js、Spring B…

作者头像 李华
网站建设 2026/6/9 20:27:44

顶与底判断顶底 通达信指标 源码分享

{}VAR2:LLV(LOW,10); VAR3:HHV(HIGH,25); 我:3.5,COLOR0088FF; 清仓: 3.5,COLORYELLOW,LINETHICK3; 减仓: 3.2,COLORBLUE; 动力线: EMA((CLOSE-VAR2)/(VAR3-VAR2)*4,4); 强弱线:1.75,LINETHICK1,COLORGREEN; 关注:0.5,COLORBLUE ; {} 数值:动力线,COLORA8A8A8; DRAWBAND(减仓,R…

作者头像 李华
网站建设 2026/6/4 18:01:24

进销存软件哪个简单好用,3天学会进销存

第1天&#xff1a;理解核心概念与基础流程 进销存的主要模块&#xff1a; 进&#xff1a;采购订单、采购入库、采购退货 销&#xff1a;销售订单、销售出库、销售退货 存&#xff1a;库存盘点、库存报损、库存预警 软件基础操作&#xff1a; 入库&#xff1a;新增入库单&#x…

作者头像 李华
网站建设 2026/6/9 19:59:15

QMS软件系统:一体化智能平台,智绘卓越质量新图景——全星质量管理QMS软件系统应用解析

QMS软件系统&#xff1a;一体化智能平台&#xff0c;智绘卓越质量新图景——全星质量管理QMS软件系统应用解析 在当今日益激烈的市场竞争中&#xff0c;质量不仅是企业的生命线&#xff0c;更是赢得客户信任、提升品牌价值的核心要素。《全星质量管理QMS软件系统》作为一套集成…

作者头像 李华