在计数排序算法中,我们在给定数组中初始化一个具有最大值的大小的计数数组。此方法的运行时间为O(n +最大值)。但是,通过额外的循环,我们可以查找给定数组的最小值和最大值;
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之间。在某些情况下,我们可以大大减少运行时间。但是,我还没有看到这样的方法。它仍然是计数排序算法,还是还有我不知道的另一个名字。
答案 0 :(得分:2)
当我们知道 upfront 将值限制在一定范围内时,通常使用计数排序。
此范围无需从零开始;最好使用长度为6的数组,该数组的元素表示从95到100的值的计数(或者就此而言,从-2到3的值的计数)。因此,是的,您的方法仍然是“计数排序”。
但是,如果您不预先知道此限制,则不可能通过对数据进行完整的传递来获得更快的结果。
例如:假设您有1,000,000个元素,并且您知道它们都在0-200范围内,但是您认为它们全部可能是 范围要窄得多。好吧,预扫描整个输入阵列的成本将大于使用201元素的工作阵列的成本,这意味着与仅进行范围为0的计数排序相比,它的成本超出了其可能节省的成本。 200。
此方法的运行时间为O(n +最大值)。
运行时间为 O (max(num_elements,Â_range_size)),由于Landau(big-O)表示法的神奇之处,它与 O 相同(num_elements + range_size)。仅当max_value渐近大于num_elements和range_size时,您的方法才会影响渐近复杂度。