news 2026/6/9 23:46:25

C语言---排序算法6---递归归并排序法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言---排序算法6---递归归并排序法

文章目录

  • 算法步骤
  • 递归实现代码
  • 优缺点分析
    • 优点
    • 缺点
  • 适用场景
  • 迭代法 vs 递归法
            • 学习视频推荐

归并排序(Merge Sort)是经典的分治算法,采用递归+合并的思路实现高效排序。其核心思想是将数组不断二分至最小单元(单个元素),然后逐步合并有序子序列,最终得到全局有序数组。

算法步骤

1、分解:将当前数组分为左右两个子数组。
2、递归:对左右子数组递归执行归并排序。
3、合并:将两个已排序的子数组合并为一个有序数组。

递归实现代码

代码实现1:

#include <stdio.h>#include <stdlib.h>// 合并两个有序数组 void merge(int arr[], int left, int mid, int right){int i, j, k;int n1=mid - left +1;int n2=right - mid;// 创建临时数组 int *L=(int*)malloc(n1 * sizeof(int));int *R=(int*)malloc(n2 * sizeof(int));// 复制数据到临时数组for(i=0;i<n1;i++)L[i]=arr[left + i];for(j=0;j<n2;j++)R[j]=arr[mid +1+ j];// 合并临时数组到原数组 i=0;j=0;k=left;while(i<n1&&j<n2){if(L[i]<=R[j]){arr[k]=L[i];i++;}else{arr[k]=R[j];j++;}k++;}// 复制剩余元素while(i<n1){arr[k]=L[i];i++;k++;}while(j<n2){arr[k]=R[j];j++;k++;}free(L);free(R);}// 归并排序递归函数 void mergeSort(int arr[], int left, int right){if(left<right){int mid=left +(right - left)/2;// 递归排序左右子数组 mergeSort(arr, left, mid);mergeSort(arr, mid +1, right);// 合并已排序的子数组 merge(arr, left, mid, right);}}// 测试用例 intmain(){int arr[]={12,11,13,5,6,7};int n=sizeof(arr)/ sizeof(arr[0]);printf("原始数组: ");for(int i=0;i<n;i++)printf("%d ", arr[i]);mergeSort(arr,0, n -1);printf("\n排序后数组: ");for(int i=0;i<n;i++)printf("%d ", arr[i]);return0;}

代码实现2(摘抄自菜鸟教程):

#include<stdio.h>#include<stdlib.h>#include<string.h>// 函数声明voidmerge_sort_recursive(intarr[],intreg[],intstart,intend);voidmerge_sort(intarr[],constintlen);intmain(){intarr[]={22,34,3,32,82,55,89,50,37,5,64,35,9,70};intlen=sizeof(arr)/sizeof(arr[0]);// 计算数组长度merge_sort(arr,len);// 调用归并排序函数// 打印排序后的数组for(inti=0;i<len;i++){printf("%d ",arr[i]);}return0;}// 递归实现归并排序voidmerge_sort_recursive(intarr[],intreg[],intstart,intend){if(start>=end)return;intmid=start+(end-start)/2;intstart1=start,end1=mid;intstart2=mid+1,end2=end;merge_sort_recursive(arr,reg,start1,end1);merge_sort_recursive(arr,reg,start2,end2);intk=start;while(start1<=end1&&start2<=end2){reg[k++]=arr[start1]<arr[start2]?arr[start1++]:arr[start2++];}while(start1<=end1){reg[k++]=arr[start1++];}while(start2<=end2){reg[k++]=arr[start2++];}// 使用memcpy进行数组复制,提高效率memcpy(arr+start,reg+start,(end-start+1)*sizeof(int));}// 归并排序入口函数voidmerge_sort(intarr[],constintlen){int*reg=(int*)malloc(len*sizeof(int));if(reg==NULL){// 检查内存分配是否成功fprintf(stderr,"Memory allocation failed\n");exit(EXIT_FAILURE);}merge_sort_recursive(arr,reg,0,len-1);free(reg);// 释放内存}

优缺点分析

优点

1、时间复杂度稳定在O(n log n)
2、适合链表排序(不需要额外空间)
3、多线程环境下容易并行化

缺点

1、需要O(n)额外空间
2、递归调用有栈空间开销
3、小规模数组时常数因子较大

适用场景

1、数据量较大(通常n>1000)
2、需要稳定排序的场景
3、外部排序(磁盘数据排序)
4、链表排序实现

迭代法 vs 递归法

特性迭代法递归法
实现方式通过循环逐步合并子数组通过递归分解问题
空间开销仅需临时数组空间递归栈空间(可能栈溢出)
代码复杂度稍复杂(需手动管理边界)更简洁(分治逻辑直观)
学习视频推荐

数据结构合集 - 归并排序(非递归与递归算法过程, 效率分析, 稳定性分析)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 21:05:49

【人工智能学习-AI入试相关题目练习-第十八次】

人工智能学习-AI入试相关题目练习-第十八次 1-前言3-问题题目训练【問題1&#xff5c;模拟①&#xff5c;Q学習の定義と更新式】【問題2&#xff5c;模拟②&#xff5c;SARSAとの比較】【問題3&#xff5c;预测题&#xff5c;Q学習の収束と実用上の問題】 4-练习&#xff08;日…

作者头像 李华
网站建设 2026/6/9 18:36:55

数字图像处理篇---闭运算

一句话比喻闭运算就像给物体做“内部填充手术”&#xff1a;先把空洞和裂缝“填平”&#xff08;膨胀&#xff09;&#xff0c;再把多余材料“修整掉”&#xff08;腐蚀&#xff09;。核心思想&#xff1a;先胖后瘦&#xff0c;但只瘦回一点点闭运算是开运算的“双胞胎兄弟”&a…

作者头像 李华
网站建设 2026/6/8 17:50:23

这6款由AI驱动的专业工具,为论文写作提供了更快的速度和更高的质量保障

针对学术论文写作需求&#xff0c;目前市场上有多种AI工具可同时满足写作辅助与降重需求。这些智能平台通过自然语言处理技术提供论文框架生成、内容优化以及相似度检测功能&#xff0c;适用于毕业论文撰写、课程报告整理等场景。值得注意的是&#xff0c;此类工具应作为效率提…

作者头像 李华
网站建设 2026/6/5 20:15:47

PCIe-Link Status Dependencies

2.9.1 Transaction Layer Behavior in DL_Down Status 关于DL_Down状态和热复位(Hot Reset)​ 下的事务层硬件行为规则。这些规则定义了PCIe IP核在极端异常情况下,如何通过硬件状态机确保系统稳定、避免死锁并实现有序恢复。 第一部分:DL_Down状态下的SoC硬件行为 DL_Do…

作者头像 李华
网站建设 2026/6/5 21:13:02

推荐能做“简历 + JD 匹配”的工具

在 2026 年&#xff0c;简历投递已经全面进化为“算法博弈”。如果你只是简单地把简历投出去&#xff0c;而没有针对 JD&#xff08;职位描述&#xff09;进行语义对齐&#xff0c;那么在 90% 的大厂招聘后台&#xff0c;你的匹配得分都会低于 60 分&#xff0c;直接落入“已读…

作者头像 李华
网站建设 2026/6/5 21:10:50

模糊神经网络机械故障诊断(MATLAB代码)

效果 用训练好的模糊神经网络对机械故障进行诊断,根据网络的预测值得到机械的技术状态。预测值小于 1.5 时为正常状态,预测值在 1.5~2.5 之间时为曲轴轴承轻微异响,预测值在 2.5~3.5 之间时为曲轴轴承严重异响预测值在 3.5~4.5 之间时为连杆轴承轻微异响,预测值大于 4.5 时为连…

作者头像 李华