news 2026/6/12 7:27:13

归并排序和基数排序是两种重要的排序算法,各自基于不同的思想实现高效、稳定的排序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
归并排序和基数排序是两种重要的排序算法,各自基于不同的思想实现高效、稳定的排序

归并排序和基数排序是两种重要的排序算法,各自基于不同的思想实现高效、稳定的排序。


一、归并排序(Merge Sort)

核心逻辑:分治法

  • 分解:将待排序数组从中间分割为两个子数组,递归地对左右两部分进行排序。
  • 合并:使用Merge函数将两个已排序的子数组合并成一个有序数组。
关键函数说明:
voidMSort(intdata[],ints,intt){if(s<t){intm=(s+t)/2;MSort(data,s,m);// 排序左半部分MSort(data,m+1,t);// 排序右半部分Merge(data,s,m,t);// 合并两个有序段}}
  • Merge(data, s, m, t)实现:
    • 创建临时数组暂存原数组片段
    • 使用双指针分别遍历左半[s, m]和右半[m+1, t]
    • 按升序将较小元素复制到结果中
    • 复制剩余元素
    • 将临时数组内容拷贝回原数组
入口函数:
voidMergeSort(intdata[],intn){MSort(data,0,n-1);}
  • 时间复杂度:O(n log n),无论最好、最坏、平均情况
  • 空间复杂度:O(n) —— 需要额外的临时数组用于合并
  • 稳定性:稳定(相等元素相对位置不变)
  • 适用场景:要求稳定排序或链表排序时表现优异

二、基数排序(Radix Sort)

基本思想:按位排序 + 分配收集

将整数视为由多个“位”组成的数字串(如十进制下个、十、百位),从最低位开始逐位排序。

排序步骤:
  1. 设定 r 个队列(例如 r=10 对应数字 0~9)
  2. 从最低有效位(LSD)开始处理每一位:
    • 分配:根据当前位上的数值,把每个数放入对应编号的队列中
    • 收集:按队列 0→r-1 的顺序取出所有元素,形成新的序列
  3. 重复上述过程直到最高位处理完毕

示例:排序 [170, 45, 75, 90, 2, 802, 24]

第一次(个位)后:[170, 90, 2, 802, 24, 45, 75]
第二次(十位)后:[2, 802, 24, 45, 75, 170, 90]
第三次(百位)后:[2, 24, 45, 75, 90, 170, 802]

特性分析:
  • 稳定性:稳定 —— 队列先进先出保证相同关键字顺序不乱
  • 时间复杂度:O(d(n + r))
    • d:最大数的位数(如最大为999,则d=3)
    • n:元素个数
    • r:基数(如十进制r=10)
  • 空间复杂度:O(r + n)
    • 需要 r 个队列头尾指针(链式队列)
    • 每个元素需存储指针(若用链表结构)
应用场景:
  • 整数排序(尤其是固定位宽的键值,如电话号码、身份证号)
  • 外部排序中的辅助手段
  • 当 d 较小且 r 不大时效率很高,可达到线性时间趋势

总结对比:

特性归并排序基数排序
排序依据比较元素大小按位分配
是否比较排序
时间复杂度O(n log n)O(d(n + r))
空间复杂度O(n)O(n + r)
稳定性稳定稳定
适用数据类型可比较任意对象数字、字符串等可分解关键字
最佳应用场景要求稳定、通用性强数据范围集中、位数少

归并排序中的Merge函数是核心操作,用于将两个已排序的子数组合并为一个有序数组。以下是完整的 C 语言代码实现,包含详细注释:

#include<stdio.h>#include<stdlib.h>// 合并函数:将 data[s..m] 和 data[m+1..t] 两个有序子数组合并为有序数组voidMerge(intdata[],ints,intm,intt){intn1=m-s+1;// 左半部分长度intn2=t-m;// 右半部分长度// 动态分配临时数组存储左右两部分int*left=(int*)malloc(n1*sizeof(int));int*right=(int*)malloc(n2*sizeof(int));if(!left||!right){printf("内存分配失败\n");exit(1);}// 复制数据到临时数组for(inti=0;i<n1;i++)left[i]=data[s+i];for(intj=0;j<n2;j++)right[j]=data[m+1+j];// 归并过程:双指针法合并inti=0,j=0,k=s;while(i<n1&&j<n2){if(left[i]<=right[j]){// 使用 <= 保证稳定性data[k++]=left[i++];}else{data[k++]=right[j++];}}// 复制剩余元素while(i<n1)data[k++]=left[i++];while(j<n2)data[k++]=right[j++];// 释放临时内存free(left);free(right);}// 递归分治排序voidMSort(intdata[],ints,intt){if(s<t){intm=s+(t-s)/2;// 防止整数溢出MSort(data,s,m);MSort(data,m+1,t);Merge(data,s,m,t);}}// 入口函数:对长度为 n 的数组进行归并排序voidMergeSort(intdata[],intn){MSort(data,0,n-1);}// 示例测试程序intmain(){intarr[]={38,27,43,3,9,82,10};intn=sizeof(arr)/sizeof(arr[0]);printf("排序前: ");for(inti=0;i<n;i++)printf("%d ",arr[i]);printf("\n");MergeSort(arr,n);printf("排序后: ");for(inti=0;i<n;i++)printf("%d ",arr[i]);printf("\n");return0;}

输出结果:

排序前: 38 27 43 3 9 82 10 排序后: 3 9 10 27 38 43 82

关键点说明:

  • 临时数组:使用malloc分配空间暂存左右子数组,避免覆盖。
  • 稳定性保障:合并时使用<=判断,确保相等元素保持原有顺序。
  • 边界处理:正确计算索引范围[s..m][m+1..t]
  • 资源管理:及时释放动态分配的内存。

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

经济学专业背景求职者突破年龄限制的实战策略

一、精准定位&#xff1a;年龄限制背后的真实职场需求与技能补充经济学专业背景的求职者在面对年龄壁垒时&#xff0c;可考虑通过补充人工智能等前沿技能&#xff0c;增强自身复合竞争力。当前市场对既懂经济分析又掌握AI应用能力的复合型人才需求显著增加。经济学AI的复合优势…

作者头像 李华
网站建设 2026/5/31 18:04:25

vue航空航天太空科普网站 可视化大屏改_2dhz0

目录Vue航空航天科普网站的可视化大屏设计核心功能模块设计技术实现方案交互体验优化开发技术核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部…

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

C++学习记录-旧题新做-分割链表

旧题链接&#xff1a;https://blog.csdn.net/chamao_/article/details/143628470?fromshareblogdetail&sharetypeblogdetail&sharerId143628470&sharereferPC&sharesourcechamao_&sharefromfrom_link C解法&#xff1a; /*** Definition for singly-lin…

作者头像 李华
网站建设 2026/6/11 0:32:38

学长亲荐!8款AI论文写作软件测评,研究生开题报告必备

学长亲荐&#xff01;8款AI论文写作软件测评&#xff0c;研究生开题报告必备 学术写作工具测评&#xff1a;2026年研究生必备推荐 随着AI技术的不断进步&#xff0c;越来越多的研究生开始依赖AI论文写作软件来提升科研效率。然而&#xff0c;面对市场上种类繁多的工具&#xff…

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

博物馆解说系统升级:用GLM-TTS替代传统录音

博物馆解说系统升级&#xff1a;用GLM-TTS替代传统录音 在一座大型历史博物馆里&#xff0c;策展团队临时决定更换一件珍贵文物的说明文字。按照惯例&#xff0c;这意味着要重新联系播音员、预约录音棚、剪辑音频、上传到导览系统——整个流程至少三天起步。但这次&#xff0c…

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

PHP的$_SESSION的庖丁解牛

$_SESSION 是 PHP 提供的 服务端会话管理机制&#xff0c;用于在无状态的 HTTP 协议上模拟用户状态。 它看似简单&#xff0c;但涉及 存储机制、安全边界、生命周期、分布式挑战 四重工程细节。 错误使用会导致 会话劫持、状态污染、内存泄漏、扩展性瓶颈。一、机制原理&#x…

作者头像 李华