这种Bucket-Sort的实现是否被认为是“就地”?

时间:2009-09-27 21:07:08

标签: algorithm sorting

考虑以下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将是一个常数,即使它是一个大的。所以我猜这个定义是“就地”但我不确定。

所以鉴于上述算法和“就地”的定义,这个实现是否就地考虑了?

3 个答案:

答案 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无法绑定附加空间。