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

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 递归法

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

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

http://www.jsqmd.com/news/343325/

相关文章:

  • Django DRF 核心组件解析:从约定到自由
  • 菜鸟教程:2026年OpenClaw(Clawdbot)搭建及指导
  • 实战_智能制造AI智能体的预测性维护系统:架构师如何优化模型精度?
  • 大数据领域数据架构的创新发展趋势
  • 保姆级教程:2026年OpenClaw(Clawdbot)一键搭建套路及FQA
  • 喂饭教程:2026年零基础部署OpenClaw(原Clawdbot)指南
  • PKUKY150 浮点数加法
  • 2-4午夜盘思
  • 人形机器人:青龙openloong
  • React Native for OpenHarmony:井字棋游戏的开发与跨平台适配实践
  • 2.4 Toncat提供的response
  • k8s静态pod
  • 用户画像的未来趋势:大数据与元宇宙的深度融合
  • 深入探讨大数据领域Eureka的服务发现机制
  • 不需要技术!2026年OpenClaw(Clawdbot)秒速部署并使用的5个教程
  • 开源神器!一句话生成完整短剧,从剧本到成片全自动化
  • 法律AI多语言支持架构设计要点解析
  • 剪映skill(jianying-skill)安装命令
  • Hive分区与分桶:大数据存储的最佳实践
  • 2026年正规的体育馆网架,徐州网架厂家推荐及选择参考 - 品牌鉴赏师
  • 2026山东米线加盟推荐,行业前列加盟品牌实力盘点 - 品牌鉴赏师
  • Stanford Dexcap:
  • Stanford UMI:由斯坦福大学开发的革新性训练框架,让“机器人学习”脱离了对昂贵机器人的依赖,实现了“在野外(In-the-wild)”进行大规模、低成本的技能采集。
  • 2026年指挥中心厂家推荐,国产化软硬件适配与系统稳定性权威测评 - 品牌鉴赏师
  • [特殊字符]_网络IO性能优化:从TCP到HTTP的层层优化[20260204143626]
  • 接口自动化测试报告
  • VASP+Wannier90 计算位移电流和二次谐波SHG
  • 【人工智能学习-AI入试相关题目练习-第十八次】
  • 数字图像处理篇---闭运算
  • 【大学院-筆記試験練習:线性代数和数据结构(24)】