news 2026/4/18 8:56:33

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/4/18 7:05:36

k8s静态pod

静态 Pod 其实很好理解&#xff1a;它就是“这台节点自己养的 Pod”。我们平时用 kubectl apply 创建的 Pod&#xff0c;是先写进 API Server&#xff0c;再由调度器挑节点、控制器去拉起&#xff1b;那静态 Pod 走的路完全不一样——它直接由 kubelet 在本机创建和保活&#x…

作者头像 李华
网站建设 2026/4/18 8:53:06

用户画像的未来趋势:大数据与元宇宙的深度融合

用户画像的未来趋势:大数据与元宇宙的深度融合 关键词:用户画像、大数据、元宇宙、数字孪生、隐私计算 摘要:用户画像是互联网时代企业理解用户的“数字钥匙”,而随着大数据技术的成熟和元宇宙的兴起,这把“钥匙”正在经历革命性升级。本文将带你一步步拆解用户画像的核心…

作者头像 李华
网站建设 2026/4/17 13:00:58

数字图像处理篇---顶帽

一句话比喻顶帽变换就像“找不同”游戏里的“找亮点”&#xff1a;从原图中减去开运算结果&#xff0c;专门找出那些“小而亮的细节”。核心思想&#xff1a;原图 - 开运算顶帽变换的公式很简单&#xff1a; 顶帽 原图 - 开运算后的图为什么叫“顶帽”&#xff1f;想象一下&am…

作者头像 李华
网站建设 2026/4/17 21:06:37

详解四大格式(PIL/OpenCV/NumPy/PyTorch)的转换原理与场景选择

文章目录&#x1f4ca; 四类图像数据的核心特性对比&#x1f504; 数据转换详解1. PIL Image 与 OpenCV (cv2) 的互转2. 与 PyTorch Tensor 的互转&#x1f4a1; 应用场景与库选择指南如何选择&#xff1f;&#x1f48e; 核心要点与最佳实践总结&#x1f4ca; 四类图像数据的核…

作者头像 李华
网站建设 2026/4/17 19:41:39

智泊AI大模型课程怎么样?

为什么说RAG智能体是大模型落地的正确路径&#xff1f; RAG&#xff08;检索增强生成&#xff09;本质是让AI每次回答前先去权威知识库找资料&#xff0c;再基于资料生成答案&#xff0c;核心价值是祛幻觉、保准确、实时更新&#xff0c;解决大模型 “知识过时、无中生有、数据…

作者头像 李华
网站建设 2026/4/8 21:19:29

Scala 变量

Scala 变量 概述 在Scala中,变量是用来存储数据的基本元素。变量可以存储任何类型的数据,例如数值、文本、布尔值等。Scala中的变量具有类型推断特性,这意味着变量在使用时不需要显式声明其类型。本文将详细介绍Scala变量的概念、特性、作用域以及如何声明和使用变量。 变…

作者头像 李华