代码之家  ›  专栏  ›  技术社区  ›  keser

计数排序不同的方法

  •  0
  • keser  · 技术社区  · 6 年前

    在计数排序算法中,我们用给定数组中最大值的大小初始化一个计数数组。此方法的运行时为o(n+max值)。但是,通过一个额外的循环,我们可以寻找给定数组的最小值和最大值;

    for 0 -> Length(given_array)
       if given_array[i] > max 
          max = given_array[i]
       if given_array[i] < min
          min = given_array[i]
    

    然后使用这些数据创建计数数组,比如95-100之间。在某些情况下,我们可以极大地减少运行时间。但是,我还没有看到这样的方法。它仍然是一个计数排序算法,还是有另一个我不知道的名字?

    1 回复  |  直到 6 年前
        1
  •  2
  •   ruakh Sivagopal Manpragada    6 年前

    计数排序通常在我们知道 正面的 这些值将被限制在一定的范围内。

    这个范围不需要从零开始;使用一个长度为6的数组是完全可以的,该数组的元素表示值95到100的计数(或者,就此而言,值的计数从-2到3)。所以,是的,你的方法仍然是“计数排序”。

    但是,如果您事先不知道这个限制,那么您不太可能通过对要检查的数据进行完整的传递来获得更快的结果。

    例如:假设您有1000000个元素,并且 知道 它们都在0-200范围内,但你认为它们是 可能 都在更窄的范围内。好吧,预扫描整个输入数组的成本将大于使用201元素工作数组的成本,这意味着它的成本比仅进行范围为0-200的计数排序可能节省的成本要高。

    此方法的运行时为o(n+max值)。

    运行时是 o (max(num_元素,range_大小)),由于landau(big-o)符号的魔力,它与 o (num_元素+范围大小)。如果max_值的渐进性大于num_元素和range_大小,则方法只影响渐进复杂性。