基数排序接受一个
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 Th位上有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
One hundred.米n>米row>
One hundred.
100
10米n>米row>
10
10
1米n>米row>
1
1
我们已经习惯了十进制,所以很容易看出我们需要a
2米n>米row>
2
2 十位和a
2米n>米row>
2
2 在个位上做
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 .
提交你的答案
需要多少位数字来表示十进制64在基数2(二进制)?
基数排序的工作原理是将每个数字从最低有效位数排序到最高有效位数。所以在以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, \dots, 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, \dots, 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 在它的列表中,计数排序已经遍历了所有
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>
一个
一个 .计数排序动画
基数排序是a稳定的排序 ,这意味着它保留了具有相同键值的元素的相对顺序。这是非常重要的。
例如,自从数字列表
[米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 )在十位上有相同值的数字之间(或当前正在排序的任何位值)。基数排序的第二次传递将产生
[米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 >
6 8> 66 所以1列的顺序是
8米n><米o>
>米o>
6米n>米row>
8 >
8 > 6 必须保留,以便排序正常工作并产生正确的答案。
[1]