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/10 13:14:26

深入探讨大数据领域Eureka的服务发现机制

深入探讨大数据领域Eureka的服务发现机制 关键词&#xff1a;Eureka、服务发现、微服务架构、心跳机制、自我保护模式 摘要&#xff1a;在微服务架构盛行的今天&#xff0c;如何让成百上千个服务“互相找到对方”成为关键问题。本文将以“小区快递站”为类比&#xff0c;用通俗…

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

[特殊字符]_网络IO性能优化:从TCP到HTTP的层层优化[20260204143626]

作为一名专注于网络性能优化的工程师&#xff0c;我在过去的项目中积累了丰富的网络IO优化经验。最近&#xff0c;我参与了一个对网络性能要求极高的项目——实时视频流平台。这个项目让我重新审视了Web框架在网络IO方面的表现。今天我要分享的是基于真实项目经验的网络IO性能优…

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

数字图像处理篇---常见的形态学操作

我们来用一个生动的比喻&#xff0c;把图像形态学操作讲清楚。 核心理念&#xff1a;用“探照灯”探测形状 想象一下&#xff0c;你有一张黑白剪影图&#xff08;比如一个白色字母在黑色背景上&#xff09;。形态学操作就像拿着一盏特定形状&#xff08;比如圆形、方形&#…

作者头像 李华
网站建设 2026/6/10 2:15:15

李想汽车研究院:让AI从“工具使用者“进化为“工具创造者“

在人工智能的发展历程中&#xff0c;一个令人兴奋的新突破正在悄然发生。这项由李想汽车Base Model团队主导的开创性研究&#xff0c;发表于2026年2月的arXiv预印本平台&#xff08;论文编号&#xff1a;arXiv:2602.01983v1&#xff09;&#xff0c;为我们展示了一个全新的可能…

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

推荐 5 个好用的 AI 简历优化工具

在求职竞争日益激烈的当下&#xff0c;一份适配ATS系统、贴合HR筛选逻辑、能凸显个人核心竞争力的简历&#xff0c;是敲开企业大门的关键。很多求职者明明自身条件优秀&#xff0c;却因简历表述空洞、关键词缺失、排版杂乱&#xff0c;屡屡错失面试机会。而中文AI简历优化工具&…

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

Spring Boot 使用 PageHelper 分页异常:排序引发的“隐形坑”全解析

做Spring Boot项目开发的小伙伴&#xff0c;大概率都用过PageHelper做分页查询——毕竟它简洁高效&#xff0c;一行代码就能实现分页&#xff0c;之前项目里一直用得顺风顺水&#xff0c;从没出过错。 可就在昨天&#xff0c;分页突然“罢工”了&#xff0c;排查了大半天才找到…

作者头像 李华