排序算法详解:归并排序与计数排序
创作时间:
作者:
@小白创作中心
排序算法详解:归并排序与计数排序
引用
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) | 稳定 |
通过对比分析,我们可以根据具体的应用场景选择合适的排序算法。例如,当数据量较大时,归并排序是一个很好的选择;当数据范围集中时,计数排序则更为高效。
热门推荐
智齿盲袋会自己消退吗?形成原因/消退可能性/治疗建议一文解答
尺神经麻木怎么治疗
班级管理细则项目怎么写
糖尿病前期吃什么药最好
父母出资买房后的房产分割:三种常见情况详解
董宇辉不再担任与辉同行执行董事?详解公司治理结构中的关键角色
民法典购房定金要怎么退
马航MH370重启搜寻:十年未解谜团,芯片专家失踪未断中国产业崛起之路
降维打击:从《三体》到现代战争的技术演变
通信技术引领未来:探讨其深远影响与未来发展
多学科会诊助力急性脑梗死诊疗
如何让团队优势更互补
偶像的力量:肖战与粉丝间的双向奔赴
二项式系数之和怎么求?二项式系数C的计算方法详解
量增价跌,怎样辨别洗盘还是出货?
公司内部转岗面试说辞技巧
广州公积金提取方法及条件
如何分析投资亏损的原因?投资亏损的影响有哪些?
工资谈判是什么?如何有效进行谈判?
揭秘我国养老保险制度:缴费基数、年限、年龄如何影响退休金?
军人荣耀与担当:从身份意识、军事技能到战斗精神
远离关节之痛:生活中如何预防类风湿疾病
又一网络梗走红!网友:好强的攻击力
面对平庸之恶,没有一片雪花是无辜的
2025考研英语一试卷题型、复习资料及真题解析
控制高血压,从日常生活开始:饮食、运动与心理调节
石榴:色彩斑斓的果实与悠久的文化历史
做好初三数学复习的建议
老人、小孩沒胃口?專家曝5大增加食慾的食物、方法!
从本溪到张家界:旅行全指南,包括交通、景点与住宿建议