Radix排序列出了列表
n米我>米row>
n
n 以基数为单位的整数
b米我>米row>
b
b (基数),所以每个数字最多
d米我>米row>
d
d 数字的地方
d米我><米o>
=米o>
⌊米o>
(米o>
日志米我><米o>
米o>
b米我>米sub>
(米o>
k米我><米o stretchy="false">
)米o>
+米o>
1米n><米o stretchy="false">
)米o>
⌋米o>
d = \ lfloor(\ log_b(k)+1)\ rfloor
d = ⌊(日志ydF4y2Bag b (k)+ 1)⌋ 和
k米我>米row>
k
k 是列表中最大的数字。例如,需要三位数字来表示十进制
104.米n>米row>
104.
1 04 (在基础10中)。重要的是,由于算法的运行时间,基数排序可以与任何基础合作,
O米我><米o stretchy="false">
(米o>
d米我><米o stretchy="false">
(米o>
n米我><米o>
+米o>
b米我><米o stretchy="false">
)米o>
)米o>
O (d (n + b))
O (d(n+ b)) ,这取决于它使用的底座。算法以线性时间运行
b米我>米row>
b
b 和
n米我>米row>
n
n 具有相同的大小,所以知道
n米我>米row>
n
n ,
b米我>米row>
b
b 可以通过操作来优化算法的运行时间。
什么是十进制
22米n>米row>
22
2 2 在二进制(基地2)中。
显示答案
这是一个描述十进制数的表。在
1米n><米sup>
0米n><米n>0米sup>
10 ^ 0.
1 00 到底,有1个,在
1米n><米sup>
0米n><米n>1米sup>
10 ^ 1
1 01 放置10个,等等。
1米n><米sup>
0米n><米n>2米sup>
10 ^ 2.
102
1米n><米sup>
0米n><米n>1米sup>
10 ^ 1
101
1米n><米sup>
0米n><米n>0米sup>
10 ^ 0.
100
100.米n>米row>
100.
100
10米n>米row>
10
10
1米n>米row>
1
1
我们已经很习惯十进制了,所以很容易看出我们需要
2米n>米row>
2
2 在十位和a
2米n>米row>
2
2 在1的位置
22米n>米row>
22
2 2 .让我们为二进制做一个类似的表。
2米n><米n>4米sup>
2 ^ 4.
24
2米n><米n>3.。米sup>
2 ^ 3.
23.
2米n><米n>2米sup>
2 ^ 2
22
2米n><米n>1米sup>
2 ^ 1
21
2米n><米n>0米sup>
2 ^ 0.
20
16米n>米row>
16
16
8米n>米row>
8
8
4米n>米row>
4
4
2米n>米row>
2
2
1米n>米row>
1
1
使小数
22米n>米row>
22
2 2 在二进制中,我们可以添加
2米n><米n>4米sup>
+米o>
2米n><米n>2米sup>
+米o>
2米n><米n>1米sup>
=米o>
16米n><米o>
+米o>
4米n><米o>
+米o>
2米n><米o>
=米o>
22米n>米row>
2^4 + 2^2 + 2^1 = 16 + 4 + 2 = 22
2 4 + 22 + 21 = 16+ 4+ 2= 22 对应于a
1米n>米row>
1
1 在1 2 4的位置,还有a
0米n>米row>
0
0 在所有其他地方。在二进制,十进制
22米n>米row>
22
2 2 可以表示为
10110.米n>米row>
10110.
1 0110 .
提交你的答案
在基础2(二进制)中表示十进制64时需要多少位数?
通过将每个数字从最低有效数字排序到大多数有效数字来完成基数。因此,在基础10(十进制系统)中,基数排序将由1的位置中的数字排序,然后是10的位置等。为此,基数排序使用计数排序作为子程序,以对每个位置值中的数字进行排序。这意味着对于基础10中的三位数字,将调用计数排序来排序1的位置,然后将调用它排序10的位置,最后,它将被调用为排序100的地方,导致完全排序的列表。这是一个快速进修计数排序 算法。
计数排序子例程
计数排序使用三个列表:输入列表,
一个米我><米o stretchy="false">
[米o>
0米n><米o separator="true">
,米o>
1米n><米o separator="true">
,米o>
...米o>
,米o>
n米我><米o stretchy="false">
]米o>
a [0,1,\ dots,n]
一个 [0,1,...,n] ,输出列表,
B米我><米o stretchy="false">
[米o>
0米n><米o separator="true">
,米o>
1米n><米o separator="true">
,米o>
...米o>
,米o>
n米我><米o stretchy="false">
]米o>
B(0 1 \点,n)
B [0,1,...,n] 以及作为临时内存的列表,
C米我><米o stretchy="false">
[米o>
0米n><米o separator="true">
,米o>
1米n><米o separator="true">
,米o>
...米o>
,米o>
k米我><米o stretchy="false">
]米o>
C(0 1 \点k)
C [0,1,...,k] .注意
一个米我>米row>
一个
一个 和
B米我>米row>
B
B 有
n米我>米row>
n
n 插槽(每个元素的插槽),同时
C米我>米row>
C
C 包含
k米我>米row>
k
k 插槽(每个键值的插槽)。
计数排序从遍历开始
一个米我>米row>
一个
一个
,和每个元素
一个米我><米o stretchy="false">
[米o>
我米我><米o stretchy="false">
]米o>
(我)
一个 [我] ,它进入了索引
C米我>米row>
C
C 具有相同的价值
一个米我><米o stretchy="false">
[米o>
我米我><米o stretchy="false">
]米o>
(我)
一个 [我] (所以它去了
C米我><米o stretchy="false">
[米o>
一个米我><米o stretchy="false">
[米o>
我米我><米o stretchy="false">
]米o>
]米o>
C[[我]]
C [一个[我]] 的值增加
C米我><米o stretchy="false">
[米o>
一个米我><米o stretchy="false">
[米o>
我米我><米o stretchy="false">
]米o>
]米o>
C[[我]]
C [一个[我]] 一个。这意味着如果
一个米我>米row>
一个
一个 有七个
0米n>米row>
0
0 ' s在它的列表中,在计数排序完成所有操作之后
n米我>米row>
n
n 要点
一个米我>米row>
一个
一个 ,则为
C米我><米o stretchy="false">
[米o>
0米n><米o stretchy="false">
]米o>
C [0]
C [0] 将
7米n>米row>
7
7 .类似地,如果
一个米我>米row>
一个
一个 有两个
4米n>米row>
4
4 的,计数排序遍历了所有的元素
一个米我>米row>
一个
一个 ,
C米我><米o stretchy="false">
[米o>
4米n><米o stretchy="false">
]米o>
C [4]
C [4] (使用0索引)将等于
2米n>米row>
2
2 .
在这一步中,
C米我>米row>
C
C 跟踪有多少元素
一个米我>米row>
一个
一个 它们具有相同的特定索引值
C米我>米row>
C
C .换句话说,指数
C米我>米row>
C
C 对应于价值 元素在
一个米我>米row>
一个
一个 ,价值 在
C米我>米row>
C
C 对应于价值的总次数
一个米我>米row>
一个
一个 出现在
一个米我>米row>
一个
一个 .计数排序动画
基数排序稳定的排序 ,这意味着它保留具有相同键值的元素的相对顺序。这一点非常重要。
例如,自数字的列表
[米o>
56米n><米o separator="true">
,米o>
43米n><米o separator="true">
,米o>
51米n><米o separator="true">
,米o>
58米n><米o stretchy="false">
]米o>
(56, 43岁,51岁,58)
[ 56,43.,51,58] 将被分类为
[米o>
51米n><米o separator="true">
,米o>
43米n><米o separator="true">
,米o>
56米n><米o separator="true">
,米o>
58米n><米o stretchy="false">
]米o>
[51, 43岁,56、58]
[ 51,43.,56,58] 当1的位置是排序的(因为
1米n><米o>
<米o>
3.米n><米o>
<米o>
6米n><米o>
<米o>
8米n>米row>
1 <3 <6 <8
1 < 3.< 6< 8 )在第二次通过时,当10年代的位置进行排序时,排序将看到四个值中的三个是
5米n>米row>
5
5 .为了保持算法在排序1位时所确定的排序,保持排序是很重要的相对顺序 (即
1米n><米o>
<米o>
6米n><米o>
<米o>
8米n>米row>
1 < 6 < 8
1 < 6< 8 )在10位(或当前正在排序的任何位值)中具有相同值的数之间。基数排序的第二步将产生
[米o>
43米n><米o separator="true">
,米o>
51米n><米o separator="true">
,米o>
56米n><米o separator="true">
,米o>
58米n><米o stretchy="false">
]米o>
[43, 51岁,56、58]
[ 43.,51,56,58] .
计数排序只能对给定基数的一个位值进行排序。例如,以10为基数的计数排序只能对0到9的数字进行排序。要对两位数进行排序,计数排序需要以100为基数。基数排序功能更强大,因为它可以对多位数字进行排序,而不必搜索更大范围的键(如果基数更大,就会出现这种情况)。
在下面显示基数排序的图像中,注意每一列数字(每个位值)在算法移动到下一个位值之前都是按照问题中的数字排序的。这显示了基数排序是如何在给定的位值上保持相同值的数字的相对顺序的,记住,
66米n>米row>
66
6 6 和
68米n>米row>
68
6 8 都将显示为
6米n>米row>
6
6 在10年代,但是
68米n><米o>
>米o>
66米n>米row>
68> 66.
6 8> 66 ,所以订单在1的列中确定,即
8米n><米o>
>米o>
6米n>米row>
8> 6.
8 > 6 必须保留对排序的正常工作并产生正确的答案。
[1]