计数排序是排序算法,平均时间复杂度为O(n + K),计数排序假定每个输入元素是0到K范围内的整数。
为什么我们不能对未排序的数组中的最大值进行线性搜索,将其等于K,从而对其应用计数排序?
答案 0 :(得分:3)
如果您的输入是具有maximum - minimum = O(n log n)
的数组(即值的范围受到合理限制),这实际上是有意义的。如果不是这种情况,基于标准比较的排序算法甚至像基数排序这样的整数排序算法渐渐变得更好。
为了举例说明,以下算法生成一系列输入,其中计数排序具有运行时复杂度Θ(n^2)
:
def generate_input(n):
array = []
for i := 1 to n:
array.append(i*i);
shuffle(array)
return array
答案 1 :(得分:1)
您问题的标题是为什么计数排序不用于大输入?
我们在计算排序方面做了什么?我们采用另一个数组(假设b [])并将所有元素初始化为零。然后,如果索引是给定数组的元素,则递增索引。然后我们运行一个从给定数组的下限到上限的循环,并检查我的数组(b [])的索引元素是否为0。如果它不为零,则表示该索引是给定数组的元素。
现在,如果这两者之间的差异(上限和下限)非常高(如10 ^ 9或更高),那么单个循环足以杀死我们的PC。 :)
答案 2 :(得分:0)
根据Big-O notation definition,如果我们说f(n) ∈ O(g(n))
,则表示有C > 0
和n = N
的值f(n) < C*g(n)
,其中C
}和N
是常量。关于C
的价值,以及n = N
不平等是真的,没有任何说法。
在任何算法分析中,必须考虑图灵机的每个操作的成本(比较,移动,求和等)。这些成本的价值是C
和N
的值必须大到(或小)的决定因素,以便将不平等变为真或假。删除这些成本是我在算法分析过程中常常做的一个天真的假设。
声明&#34;计数排序为O(n+k)
&#34;实际上意味着排序是多项式和线性的给定C
,n > N
,n > K
,其中C
,N
和K
是常量。因此,对于较小的输入,其他算法可能具有更好的性能,因为只有在给定的条件为真时,不等式才是真的。