为什么我们不能将计数排序应用于通用数组?

时间:2014-07-28 18:25:53

标签: algorithm sorting counting-sort

计算排序已知线性时间如果我们知道数组中的所有元素都是由给定数字限制的上限。如果我们采用一般数组,我们只能在线性时间扫描数组,找到数组中的最大值然后应用计数排序?

3 个答案:

答案 0 :(得分:5)

仅知道运行计数排序的上限是不够的:您需要有足够的内存来容纳所有计数器。

考虑一种情况,当你浏览一个64位整数数组时,发现最大的元素是2 ^ 60。这意味着两件事:

  • 你需要一个O(2 ^ 60)内存和
  • 完成排序需要O(2 ^ 60)。

O(2^60)O(1)相同的事实在这里没有什么帮助,因为常数因素太大了。这通常是伪多项式时间算法的问题。

答案 1 :(得分:2)

假设最大数字如235684121。 然后你将花费大量的RAM来保留你的桶。

答案 2 :(得分:0)

我想提一下@dasblinkenlight和@AlbinSunnanbo的答案,你想在O(n)传递中扫描数组,找到数组中的最大值是可以的。以下是维基百科:

  

但是,如果k的值尚未知晓则可能是   通过数据上的附加循环计算以确定最大值   实际发生在数据中的键值。

由于时间复杂度为O(n + k)k应该在一定限度内,因此您找到的k应该很小。正如@dasblinkenlight所提到的,O(large_value)实际上无法收敛到O(1)

虽然到目前为止我还不知道Counting排序的任何主要应用程序,除了用作Radix Sort 的子程序之外,它可以很好地用于字符串排序等问题>(即将“android”排序为“addnoir”),因为k只有255。