【C# 排序】基数排序 Radix sort

定义

基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。

基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。

基数排序有两种方法:基数排序的方式可以采用LSD(Least significant digital)或MSD(Most significant digital),LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。

这三种排序算法都利用了桶的概念,但对桶的使用方法上有明显差异:

  • 基数排序:根据键值的每位数字来分配桶;
  • 计数排序:每个桶只存储单一键值;
  • 桶排序:每个桶存储一定范围的数值;

使用场景

日期排序,数字排序

 

 


算法步骤

第一步

以LSD为例,一百以内数字排序;一百以内数字可以划分为  十位+个位,每个位都是0~9。因此就可以分为10组。

(1)先从权值低的个位开始排序,分别根据个位数字,将数字分配到不同的组中。

(2)再从权值高的十位开始排序,分别根据十位数字,将数字分配到不同的组中。
假设原来有一串数值如下所示:
73, 22, 93, 43, 55, 14, 28, 65, 39, 81
首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中:
0
1 81
2 22
3 73 93 43
4 14
5 55 65
6
7
8 28
9 39

第二步

接下来将这些桶子中的数值重新串接起来,成为以下的数列:
81, 22, 73, 93, 43, 14, 55, 65, 28, 39
接着再进行一次分配,这次是根据十位数来分配:
0
1 14
2 22 28
3 39
4 43
5 55
6 65
7 73
8 81
9 93

第三步

接下来将这些桶子中的数值重新串接起来,成为以下的数列:
14, 22, 28, 39, 43, 55, 65, 73, 81, 93
这时候整个数列已经排序完毕;如果排序的对象有三位数以上,则持续进行以上的动作直至最高位数为止。
LSD的基数排序适用于位数小的数列,如果位数多的话,使用MSD的效率会比较好。MSD的方式与LSD相反,是由高位数为基底开始进行分配,但在分配之后并不马上合并回一个数组中,而是在每个“桶子”中建立“子桶”,将每个桶子中的数值按照下一数位的值分配到“子桶”中。在进行完最低位数的分配后再合并回单一的数组中。

 LSD 基数排序动图演示

时间和空间复杂度

空间:O(r)

时间:O(d(n+r))

分配O(n)、一趟收集O(r)、总共d趟分配、收集,总的时间复杂度=O(d(n+r))
r:0~9,10进制数字每个部分取值都是0~9

d:拆分成几个部分,100以内数字可以拆分为十位+个位 因此d=2,1000以内的数字可以拆分为 百位+十位+个位,因此d=3

 n:数字个数。

posted @ 2022-06-13 17:31  小林野夫  阅读(141)  评论(0编辑  收藏  举报
原文链接:https://www.cnblogs.com/cdaniu/