news 2026/6/4 16:43:21

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

作者头像

张小明

前端开发工程师

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/2 15:49:14

ssm springboot学生选修课 选课系统vue

目录 SSMSpringBootVue学生选课系统摘要 开发技术 核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; SSMSpringBo…

作者头像 李华
网站建设 2026/5/17 2:50:05

个人语音备份服务:为自己留下永恒的声音印记

个人语音备份服务&#xff1a;为自己留下永恒的声音印记 在某个深夜&#xff0c;你翻出一段十年前的录音——是父亲用他特有的低沉嗓音读着童话&#xff0c;那时你还小&#xff0c;如今他已不在。你多希望还能再听一次那句“晚安&#xff0c;我的宝贝”。声音&#xff0c;这种看…

作者头像 李华
网站建设 2026/5/2 7:59:29

亲测好用10个AI论文软件,研究生高效写作必备!

亲测好用10个AI论文软件&#xff0c;研究生高效写作必备&#xff01; AI 工具如何助力研究生高效论文写作 在研究生阶段&#xff0c;论文写作是一项既重要又繁琐的任务。随着人工智能技术的不断发展&#xff0c;越来越多的 AI 工具被应用于学术写作中&#xff0c;帮助学生提升效…

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

装备软件全数字仿真测试平台DSTP

1&#xff09;产品简介 装备软件全数字仿真测试平台&#xff08;DSTP&#xff09;是基于嵌入式处理器的全数字仿真测试系统&#xff0c;主要功能是仿真真实的嵌入式处理器内核&#xff08;包括处理器的内存、寄存器、运算器等&#xff09;&#xff0c;同时提供可视化的外部场景…

作者头像 李华
网站建设 2026/5/16 21:34:46

儿童早教内容生成:制作寓教于乐的有声读物

儿童早教内容生成&#xff1a;制作寓教于乐的有声读物 在幼儿园的午休时间&#xff0c;老师轻声讲着《小熊过河》的故事&#xff0c;孩子们闭着眼睛&#xff0c;嘴角微微上扬。这种温暖的场景&#xff0c;正是优质早教内容的魅力所在——它不只是传递知识&#xff0c;更是在构建…

作者头像 李华
网站建设 2026/5/26 13:09:53

windows 10系统,文件夹左侧列表丢失,列表出来和文件夹内容重叠

这个问题是Windows 10文件资源管理器&#xff08;Explorer&#xff09;中一个比较经典的界面显示Bug核心原因是&#xff1a; 文件资源管理器窗口的视图设置或缓存出现了错乱&#xff0c;导致左侧的导航窗格&#xff08;导航栏&#xff09;和右侧的主内容区布局冲突。方法一&…

作者头像 李华