排序方法之六:基数排序
Posted 大师兄编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序方法之六:基数排序相关的知识,希望对你有一定的参考价值。
排序方法之基数排序
基数排序属于“分配式排序”,又称“桶子法”,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,借以达到排序的作用。
不用比较大小,这怎么排序呢?是不是很多小伙伴都很有疑问?不怕,下面跟随大师兄一起近距离了解它的过程。
1
算法介绍
将整数按位数切割成不同的数字,然后按每个位数分别比较。
具体做法是:将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。
基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。
2
算法思路
设定原始序列 :{ 464、847、43、111、236、5、107、83 }
第一步:观察序列我们可以知道,序列里面最长的数位长度为三位,所以我们就要把所有的元素统一成三位,不足的前面补零
得到序列结果:{ 464、847、043、111、236、005、107、083 }
第二步:我们都知道,每个位的数的取值范围是从0~9的,所以我们的“桶”(也就是基,在后面算法分析中我们详细说一下)的个数就为10个,分别存放数0~9
第三步:将序列中的每个元素依次取“个位”数放入对应的桶中得到以下结果
083 |
107 |
||||||||
111 |
043 |
464 |
005 |
236 |
847 |
||||
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
我们把每个元素按照个位的数依次序放入了对应对的“桶”中,注意顺序哦,先放入桶的在下面。然后再从桶第一个桶开始依次取出元素先放入的先取出哦
得到序列{ 111,043、083、464、005、236、847、107}
第四步:我们把第二步得到的序列按照第“十位”数再次放入对应的桶中,得到以下结果:
107 |
847 |
||||||||
005 |
111 |
236 |
043 |
464 |
083 |
||||
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
然后再次依次从“桶”中取出元素
得到序列{005、107、111、236、043、847、464、083}
得五步:我们以第“百位”数字分别放入对应的“桶”中
083 |
|||||||||
043 |
111 |
||||||||
005 |
107 |
236 |
464 |
847 |
|||||
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
然后再次依次从“桶”中取出元素
得到序列{005、043、083、107、111、236、464、847}
此时我们发现,所有元素竟然已经排好序了,是不是很神奇。
3
图文说明
这里每一轮按照哪个位的我用红色标注了的,大家只看红色部分数字依次是不是顺序排序的呢?
4
代码实现
java实现代码
php实现代码
5
算法分析
注:这里n为关键字数量,也就是规模。而d表示关键字的位数,比如847中d=3。r为关键字的基的个数,就是组成关键字数据的种类,比如十进制一共有0~9一共十个数字,即r=10,若关键字由英文字母组成(不区分大小写),则r=26
1、稳定性:因为每次都是从左到右依次取得数据,且由队列实现,按照先进先出的规则,,所以是稳定的。
2、空间复杂度:O(r),需要开辟关键字基的个数个队列。
3、时间复杂度:总共需要d次分配和收集,一次分配需要将n个关键字放入各自的队列中,一次收集需要将r个桶都收集一遍。所以一次分配和收集时间复杂度为O(n+r),d次就需要O(d(n+r)).
今天的基数排序是从低位开始
其实还可以从高位开始
或者加私人微信进微信群:bin18382734270
与大师兄一起品味酸甜苦辣
我知道你在看哟
以上是关于排序方法之六:基数排序的主要内容,如果未能解决你的问题,请参考以下文章