MediaInfo终极实战指南:高效多媒体文件分析工具深度解析
2026/6/16 21:02:49
归并排序和基数排序是两种重要的排序算法,各自基于不同的思想实现高效、稳定的排序。
核心逻辑:分治法
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);}基本思想:按位排序 + 分配收集
将整数视为由多个“位”组成的数字串(如十进制下个、十、百位),从最低位开始逐位排序。
示例:排序 [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(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 82malloc分配空间暂存左右子数组,避免覆盖。<=判断,确保相等元素保持原有顺序。[s..m]和[m+1..t]。