在基数排序中,我们首先按最低有效位排序,然后再按第二最低有效位排序,依此类推,最后得到排序列表。
现在,如果我们有数字的列表,则需要位来区分这些数字。因此,我们进行的基数排序次数将为。每遍花费时间,因此基数排序的运行时间为
但是众所周知,它是线性时间算法。为什么?
在基数排序中,我们首先按最低有效位排序,然后再按第二最低有效位排序,依此类推,最后得到排序列表。
现在,如果我们有数字的列表,则需要位来区分这些数字。因此,我们进行的基数排序次数将为。每遍花费时间,因此基数排序的运行时间为
但是众所周知,它是线性时间算法。为什么?
Answers:
如果我们有数字的列表,我们需要对数n位
否:如果我们有一个介于到2 k − 1之间的数字列表,则需要k位。通常,k和log n之间没有关系。
如果数字都是不同的,那么,和基数排序上不同数字因此具有的时间复杂度Ω (Ñ 登录Ñ )。通常,基数排序的复杂度为Θ (n,其中 n是要排序的元素数, k是每个元素中的位数。
要说基数排序的复杂度为意味着对数字采用固定的位大小。这意味着对于足够大的n,将存在许多重复值。
有一个普遍的定理,即一次通过比较两个元素而工作的数组或列表排序方法在最坏的情况下不能比运行得更快。基数排序无法通过比较元素来工作,但是相同的证明方法有效。基数排序是决定要应用于数组的排列的决策过程;有n !数组的排列和基数排序采用二进制决策,即它决定在每个阶段是否交换两个元素。经过m个二元决策后,基数排序可以确定2 m个排列之间。达到n !可能的排列,有必要。
我在上面没有写过的证明中的一个假设是,算法必须在元素不同的情况下起作用。如果先验地知道这些元素不是全部不同,则潜在排列的数量小于全部。当排序ķ位数字,它是只可能有Ñ不同元件时Ñ ≤ 2 ķ ; 在那种情况下,基数排序的复杂度确实是Ω (n log n )。对于较大的n值,必须存在冲突,这说明了基数排序如何具有小于Θ (时 Ñ > 2 ķ。
分析时要小心:您认为要在时间内进行排序是什么?这是因为您的每个数字都在0到k − 1的范围内,这意味着您的数字可以采用k个可能的值。您需要一个稳定的排序算法,因此您可以例如选择计数排序。计数排序以Θ (n + k )时间进行。如果k = O (n ),则计数排序以线性时间运行。
您的每个字符串或数字都有数字。如您所说,您使d越过了它们。因此,基数排序显然在Θ (d (n + k ))时间进行。但是,如果我们认为d是常数并且k = O (n ),我们会发现基数排序是线性时间。
I think the assumption is wrong. You can perform radix sort with numbers in, e.g., hex. Thus, at each step you split you array of numbers into buckets.