让A1,A2,...,An
为[0,2k]
之间的实数(k为常数)。众所周知,对于任何一对Ai,AJ
然后|Ai-Aj|>=k/n
,
描述在O(n)
运行时最差情况下对数字进行排序的算法。
我知道答案应该是桶式的。无法理解为什么,如果是这样,我如何选择正确数量的水桶? |Ai-Aj|>=k/n
实际上有何帮助?
答案 0 :(得分:7)
条件| A i - A j | ≥k/ n表示如果将范围[0,2k]划分为2n个不同的桶(每个桶的大小为2k / 2n = k / n),则每个范围中最多只能有一个数字(除非可能,数据位于存储桶的端点。)如果您更紧密地创建存储桶(例如,通过创建3n存储桶),则每个存储桶的大小小于k / n,因此最多只能包含一个数字。
然后,您可以使用存储桶排序算法对数字进行排序:
第一步需要O(n)时间,因为您正在创建一个大小为3n的数组。下一步需要时间O(n),因为您每次访问每个O(n)数字并在每一步执行O(1)工作。最后一步还需要O(n)时间,因为你总共访问了3n个桶。
希望这有帮助!