排序算法详解:归并排序与计数排序
创作时间:
作者:
@小白创作中心
排序算法详解:归并排序与计数排序
引用
CSDN
1.
https://m.blog.csdn.net/qq_66330780/article/details/144154012
本文将介绍两种重要的排序算法:归并排序和计数排序。通过对比分析它们的原理、实现方式及复杂度,帮助读者更好地理解这些排序算法的特点和适用场景。
一、归并排序
1.1 基本思想
归并排序(MERGE-SORT)是一种基于归并操作的高效排序算法,采用分治法(Divide and Conquer)策略。其基本思想是将数组分解成更小的子数组,对这些子数组进行排序,然后将已排序的子数组合并成一个完全有序的数组。
根据上面两个图我们可以大致了解到:归并排序是先把整个数组分解成像二叉树一样的形式,然后两两排序后进行合并,从而完成排序。代码实现上我们依然可以用递归思想完成。
1.2 代码实现
void _MergeSort(int* a, int* tmp, int begin, int end)
{
if (end <= begin)
return;
int mid = (end + begin) / 2;
_MergeSort(a, tmp, begin, mid);
_MergeSort(a, tmp, mid + 1, end);
int begin1 = begin, end1 = mid;
int begin2 = mid + 1, end2 = end;
int index = begin;
while (begin1 <= end1 && begin2 <= end2)
{
if (a[begin1] < a[begin2])
{
tmp[index++] = a[begin1++];
}
else
{
tmp[index++] = a[begin2++];
}
}
while (begin1 <= end1)
{
tmp[index++] = a[begin1++];
}
while (begin2 <= end2)
{
tmp[index++] = a[begin2++];
}
memcpy(a + begin, tmp + begin, (end - begin + 1) * sizeof(int));
}
// 归并排序递归实现
void MergeSort(int* a, int n)
{
int* tmp = (int*)malloc(sizeof(int) * n);
if (tmp == NULL)
{
perror("malloc fail");
return;
}
_MergeSort(a, tmp, 0, n - 1);
free(tmp);
}
这段代码可以实现偶数元素的四四归并、两两归并,奇数元素也可实现归并。
1.3 特性
- 空间复杂度:O(N),需要额外的存储空间来存放临时数组
- 时间复杂度:O(N*logN),在所有输入情况下都能保持稳定的时间复杂度
- 稳定性:稳定,相同元素的相对顺序在排序后保持不变
- 适用场景:适用于大数据量的排序,尤其是外排序场景
二、计数排序
2.1 基本思想
计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。其基本步骤如下:
- 统计相同元素出现次数
- 根据统计的结果将序列回收到原来的序列中
2.2 代码实现
void CountSort(int* a, int n)
{
int min = a[0], max = a[0];
for (size_t i = 0; i < n; i++)
{
if (a[i] < min)
min = a[i];
if (a[i] > max)
max = a[i];
}
int range = max - min + 1;
int* count = (int*)malloc(sizeof(int) * range);
printf("range:%d\n", range);
if (count == NULL)
{
perror("malloc fail");
return;
}
memset(count, 0, sizeof(int) * range);
// 统计数据出现次数
for (int i = 0; i < n; i++)
{
count[a[i] - min]++;
}
// 排序
int j = 0;
for (int i = 0; i < range; i++)
{
while (count[i]--)
{
a[j++] = i + min;
}
}
}
2.3 特性
- 时间复杂度:O(N+range),其中range是数组中最大值和最小值的差
- 空间复杂度:O(range),需要额外的空间来存储计数数组
- 适用性:只适合整形数据,且数据范围不宜过大
- 稳定性:稳定,相同元素的相对顺序在排序后保持不变
- 适用场景:适用于数据范围集中的场景
三、排序算法总结
稳定性是排序算法的一个重要特性,它指的是在排序过程中,相同元素的相对位置是否发生变化。例如,在比赛排名中,如果多个选手的成绩相同但完成时间不同,就需要使用稳定的排序算法来保持它们的原始顺序。
下表总结了常见排序算法的时间复杂度、空间复杂度和稳定性:
排序算法 | 时间复杂度 | 空间复杂度 | 稳定性 |
---|---|---|---|
归并排序 | O(N*logN) | O(N) | 稳定 |
计数排序 | O(N+range) | O(range) | 稳定 |
通过对比分析,我们可以根据具体的应用场景选择合适的排序算法。例如,当数据量较大时,归并排序是一个很好的选择;当数据范围集中时,计数排序则更为高效。
热门推荐
电影特效制作全攻略:从动作捕捉到后期特效
可爱的绘本,治愈每一个为友情emo的成年人。
孕妇缺钾的症状有哪些?
如何制定高效的流程优化方案?
馒头和红糖馒头的热量及营养价值详解
炼金男爵玩法出装攻略(掌握炼金男爵,制霸战场!)
鸟界国宝——东方白鹳
蝴蝶兰二次开花的全方位护理秘诀解析
“鸭脖大王”绝味食品,被立案调查
什么情况有龙虎榜?这种榜单如何影响市场?
什么情况有龙虎榜?这种榜单如何影响市场?
购房遇到问题 向谁投诉,买房者必读指南
五笔输入法口诀详解助你快速上手打字技巧
2025年南美巴西新能源电动车及充电桩市场分析
实证研究方法指南
从秦朝到汉朝,经过两个朝代的比较,最终郡县制战胜分封制
Matlab simulink建模与仿真 第十五章(信号源库)
如何区分PNP和NPN传感器?以及PLC如何连接两种传感器?
如何计算房屋维修基金?房屋维修基金的计算标准如何确定?
一起故意杀人案的法律剖析:从犯罪到审判的全过程
道德与法律:探讨杀恶人是否有罪的伦理和法律问题
女生160标准体重
脾胃虚,饮食调理这样做!
专业 | 随机误差的处理
德化匠心:冰种羊脂玉瓷对比评测
脑梗治疗出院后需要终身服药吗?医生:只有少数人不需要
封闭针:利弊权衡?骨科专家深入解析,揭示封闭针真实面貌
封闭针的副作用
散户持有股票的数量与投资策略的关系是什么?怎样根据关系制定合理策略?
电子产品的火灾风险和预防