【发布时间】:2013-05-18 19:11:28
【问题描述】:
我想探索我对桶排序的分析,如下所示。
桶排序有多种实现方式。其中一些如下。
类型 1:
如果我们知道要排序的元素的范围,我们可以设置
每个可能的元素的桶,并且只是将元素扔到它们相应的桶中。然后我们
按顺序清空桶,结果是一个排序列表。
在实现这个算法时,我们可以很容易地使用一个数组来表示我们的桶,其中的值
每个数组索引将代表相应存储桶中元素的数量。如果我们有整数
在范围 [0..max] 上,然后我们设置一个 (max + 1) 整数数组并将所有值初始化为
零。然后我们依次通过未排序的数组,读取每个元素的值,然后
到桶数组中的相应索引,并增加那里的值。
时间:O(N)
空格:O(1)
类型 2:
示例:按年龄对一组人进行排序
年龄与用于排序的任意整数有些不同。因此,它的范围很小 [0-150](所有人的年龄都在 0 到 150 之间)。所以最快的排序方法是分配151个链表(我们称之为桶),并根据每个人的年龄将其数据结构放入桶中:
时间:O(N+K)
空间:O(N+K)
类型 3(类型 2 的变体,如 Wikepedia 所示)
函数 nextSort 是一个排序函数,用于对每个桶进行排序。如果使用的插入排序比最差的将是 O(n^2) 或者将使用合并排序,这样我就可以保持比 O(nlgn) 更稳定。
-
问题:
1>怎么算线性排序,是因为Type 1还是Type 2?
2>如果我使用像 WIkepedia 这样的类型 3,哪种排序对每个存储桶进行有效排序?
我知道在实践中使用插入排序的原因是我们希望存储桶很小,对于小列表,插入排序比其他任何东西都快得多。即使在实现合并排序或快速排序时,当列表变得足够小(比如低于 20 项左右)时,也会使用插入排序。
3>对于类型 3,我可以在什么基础上决定存储桶的范围?
这很重要,因为如果您尝试使用大量存储桶(例如远大于 n)进行存储桶排序,则运行时可能会受到支配直到扫描所有存储桶以查找您实际使用的存储桶所需的时间,即使它们中的大多数是空的。
我做了分析基于:
Wikepedia
How could the complexity of bucket sort is O(n+k)?
Design and Analysis of Algorithms
Lecture notes for January 23, 1996
http://www1bpt.bridgeport.edu/~dichter/lilly/bucketsort.htm
http://cs.nyu.edu/courses/fall02/V22.0310-002/lectures/lecture-23.html
How is the complexity of bucket sort is O(n+k) if we implement buckets using linked lists?
@987654328 @
【问题讨论】:
标签: algorithm sorting bucket-sort