推出一个新系列,《看图轻松理解数据结构和算法》,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握。本系列包括各类堆、各类队列、各类列表、各类树、各类图、各类排序等等几十篇的样子。mysql
基数排序(Radix Sort)算法是一种非比较的排序算法,早在 1887 年 Herman Hollerith 就已经在打孔卡片制表机中使用该算法。通常多用于对整数的排序,但因为整数与某些字符能互相转换,因此它也可以用于字符串的排序。简单来讲,基数排序算法就是将整数或字符串切分红不一样的数字或字符,而后按对应位置的数或字符分别进行比较。算法
基数排序具有稳定性,即能保证相同值元素之间的相对顺序在排序先后一致。基于计数排序的方式主要是经过对计数数组进行前缀和运算,外加经过额外的辅助数组,最后逆序循环将待排序数组中的全部元素放置到辅助数组中,以达到稳定性效果。而基于桶的方式则是经过在每一个桶中控制顺序,从而达到稳定性效果。sql
基数排序的时间复杂度为Ο(w(n+k)),其中n为待排序数组长度;k为关键字的取值范围,等于进制数,好比十进制则k=10;w为待排序数组元素最大的字长,好比最大字长元素为358
,则字长为3。数组
当k肯定后,时间复杂度其实就是O(wn),但有时还须要考虑字长w,不能简单将其认定为常数。假如取基数为B(即B进制),待排序集合最大元素为N,则w为大于的最小整数。因此并非说基数排序就必定完胜最好的比较排序(O(n * log n)),实际过程当中还跟所取的基和待排序集合具体的状况相关。网络
基数排序能够采用最高有效数位(MSD)和最低有效数位(LSD)两种方式,其中LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。数据结构
在算法过程当中,对于LSD,对某个有效数位分配后须要执行一次合并,而后再对下一位分配;而对于MSD,对某个有效数位分配后不执行合并,它将继续对相同高位的元素继续进行分配,直到没法继续分配时执行合并操做。并发
基于桶方式是指使用桶做为辅助工具,过程当中循环每一个有效数位将元素分配到对应的桶中,从而实现基数排序。机器学习
基于桶方式的基数排序的操做步骤以下:数据结构和算法
一样是对前面的8位小学生的语数英总成绩进行基于桶方式的基数排序操做。一共有8个学生,因此待排序数组长度为8。并且由于使用十进制,因此桶的索引范围是0-9。此外每一个桶对应建立一个队列,这里假设队列长度为5,长度也能够为待排序数组长度,但实际中更多使用动态扩展策略。工具
第一阶段:针对个位数将元素放到对应的桶中。
待排序数组的第一个元素的健值为198,放到编号8的桶中。
第二个元素的健值为248,放到编号为8的桶中。
第三个元素的健值为98,放到编号为8的桶中。
第四个元素的健值为247,放到编号为7的桶中。
相似地,将剩下的元素都放到对应桶中的队列,能够看到每一个桶中的队列维护了顺序性。
接着按桶顺序将桶中队列输出到原数组中,先输出编号为0的桶。
接着输出编号为7的桶。
再输出编号为8的桶。
最后输出编号为9的桶。
第二阶段:针对十位数将元素放到对应的桶中。
待排序数组的第一个元素的健值为80,放到编号8的桶中。
第一个元素的健值为247,放到编号4的桶中。
将剩下的元素都放到对应桶中的队列。
将编号为4的桶的队列输出到原数组中。
将编号为8的桶的队列输出到原数组中。
将编号为9的桶的队列输出到原数组中。
第三阶段:针对百位数将元素放到对应的桶中。
第一个元素的健值为247,放到编号2的桶中。
第二个元素的健值为247,放到编号2的桶中。
将剩下的元素都放到对应桶中的队列。
将编号为0的桶的队列输出到原数组中。
将编号为1的桶的队列输出到原数组中。
将编号为2的桶的队列输出到原数组中。
至此,以上完成整个排序过程。
-------------推荐阅读------------
个人开源项目汇总(机器&深度学习、NLP、网络IO、AIML、mysql协议、chatbot)
跟我交流,向我提问:
欢迎关注: