排序方法之六:基数排序

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

排序方法之六:基数排序
排序方法之六:基数排序
排序方法之六:基数排序

与大师兄一起品味酸甜苦辣

我知道你在看

以上是关于排序方法之六:基数排序的主要内容,如果未能解决你的问题,请参考以下文章

10.6 基数排序

10基数排序

基数排序的具体实现及其原理

基数排序算法的Java实现

基数排序和各种排序方法的比较

吴裕雄--天生自然数据结构:十大经典排序算法——基数排序