【数据结构与算法】(17):详解“计数排序”和“基数排序”

本文深入解析计数排序和基数排序两种桶思想排序算法,通过实例演示排序过程,并分析这两种算法的时间和空间复杂度。

🤡博客主页:醉竺

🥰本文专栏:《数据结构与算法》

😻欢迎关注:感谢大家的点赞评论+关注,祝您学有所成!


✨✨💜💛想要学习更多数据结构与算法点击专栏链接查看💛💜✨✨ 


目录

1. 计数排序 

1.1 思想 

1.2 计数排序代码 

2. 基数排序 

2.1 什么是基数排序 

2.2 基数排序算法效率分析

2.3 基数排序算法的应用

3. 常见排序算法复杂度及稳定性汇总 


        前面我们学习了许多种类的排序,这次我们学习一种不同思想的排序种类——桶思想排序。桶排序有什么不同吗?如果说前面的排序主要是通过关键字的比较和记录的移动,而桶思想的排序往往并不需要进行关键字的比较。如果大家还不了解桶排序的思想,推荐大家一定要先快速看一下这篇很简单的文章《什么是桶排序?基于桶排序思想排序算法有哪些?》

        这节课我们将学习一下桶思想排序中的计数排序基数排序算法,让我们开始这次的学习旅程吧。

1. 计数排序 

        计数排序是通过计数而不是比较来进行排序的。算法比较简单,适合于待排序记录数量多但排序关键字的范围比较小的整数数字排序情形。

1.1 思想 

        计数排序,这种排序算法是利用数组下标来确定元素的正确位置的。 假设数组中有10个整数,取值范围为0~10,要求用最快的速度把这10个整数从小到大进行排序。 可以根据这有限的范围,建立一个长度为11的数组。数组下标从0到10,元素初始值全为0。

        假设数组数据为:{ 9,1,2,7,8,1,3,6,5,3 } 

        下面就开始遍历这个无序的随机数列,每一个整数按照其值对号入座,同时,对应数组下标的元素进行 加1操作 例如第1个整数是9,那么数组下标为9的元素加1

最终,当数列遍历完毕时,数组的状态如下: 

该数组中每一个下标位置的值代表数列中对应整数出现的次数 直接遍历数组,输出数组元素的下标值,元素的值是几,就输出几次,0不输出。
则上述数组顺序输出是:1、1、2、3、3、5、6、7、8、9

        计数排序如果起始数不是从0开始,比如分数排序: 95,94,91,98,99,90,99,93,91,92 数组起始数为90,这样数组前面的位置就浪费了。又或者说,如果遇到要排序的数字是负数呢?

所以为了解决这个问题,按照下面方法: 

确定要排序的整数数字的最大值最小值从而确定出计数数组定义多大合适。当然,在根据计数数组来输出排序结果时,计数数组下标为0的元素代表的应该是待排序关键字中的最小值,而不再是0本身。
比如,对-10到10之间的元素排序,定义的计数数组大小应该是21(最大值-最小值+1)。而计数数组下标为0的元素代表的应该是-10。

1.2 计数排序代码 

有了上述讲解之后,下面就是计数排序的代码实现:

// 计数排序
void CountSort(int* myarray, int length)
{
	// 找出数组的最小值和最大值
	int min = myarray[0], max = myarray[0];
	for (int i = 0; i < lengt
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醉竺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值