考虑以下bucket-sort实现:
Algorithm BucketSort(S)
input: Sequence S of items with integer keys in range [0,N-1]
output: Sequence S sorted in nondecreasing order of keys.
let B be an array of N sequences, each of which is initially empty
for each item x in S do
let k be the key of x
remove x from S and insert it at the end of bucket (sequence) B[k].
for i←0 to N-1 do
for each item x in sequence B[i] do
remove x from B[i] and insert it at the end of S.
此实施是否被视为“就地”?
我的教科书给出了“就地”的以下定义:
请记住,排序算法是 就地,如果它只使用常数 除此之外的内存量 正在排序的对象需要。
现在,我知道上面的算法使用O(n + N)内存,其中N是范围的上限。然而,我可能错了,我认为N将是一个常数,即使它是一个大的。所以我猜这个定义是“就地”但我不确定。
所以鉴于上述算法和“就地”的定义,这个实现是否就地考虑了?
答案 0 :(得分:2)
您列出的算法肯定不在原地。
你有另一个指针(B)必须 GROW 与S相同的尺寸,但由于任何原因不能与S同时存在。因此,您必须至少有O(S)额外空间。仅仅因为您从S中删除值并不会使您在另一个变量B中仍然需要相同数量的空间。
另外,仅仅因为桶的数量可能是常数并不意味着您可以忘记S中的所有元素必须最终位于不同的位置(B)。注意len(S)>的情况。 Ñ
如果你想进行就地排序,你需要将所有元素保存在S中并将它们随意移动,以便常量额外空间是交换例程的临时持有者,如果你使用的话,可能是一些堆栈内存一个递归的解决方案。
答案 1 :(得分:1)
Bucketsort绝对不是一种“就地”排序算法。
整个想法是元素在移动到存储桶时自行排序。在最糟糕的情况下(顺序值,但没有重复),所需的额外空间与原始数组一样大。
答案 2 :(得分:0)
存储区N
的数量仅限于(在映射键之后)输入序列n
的长度S
,因为S
中的每个项目可能都有不同的关键。因此,该算法需要线性附加空间,因此不是就地的。如果未重新映射密钥,则n
无法绑定附加空间。