我从另一篇文章中读到了这条评论 - 并且想要打开一个单独的问题:
对于'密集'数组,存储桶排序更有效,而基数排序可以很好地处理稀疏(良好,不完全稀疏但间隔开)的数组。
请帮助理解这是怎么回事?
据我了解,人口的“密集度”将同时影响这两种算法的桶数
此外,插入排序(在每个桶中)不会受到密度的影响太大 - 或者它是什么?
答案 0 :(得分:3)
我认为“密集”与“间隔”背后的区别归结为被分类数据的分布均匀性,均匀分布的数据被认为是“密集的”。
由于存储桶排序根据数字值的上半部分按桶分区,因此具有均匀分布的输入将在每个存储桶中形成漂亮的短列表。相反,具有较大间隙的输入将形成许多空列表,并且少量长列表与原始输入的长度相当。这对于基数排序的中间步骤来说是个坏消息,因为“分散”步骤不会减少原始问题。
另一方面,基数排序并不关心输入中数字的分布:对于相同大小和最大成员中相同位数的任何输入,算法需要相同的时间。每个“数字”的步骤完全采用O(N)
步骤;一旦你完成了最重要的数字,你就完成了。被排序的值的分布不会影响算法的时间。
答案 1 :(得分:2)
我认为该评论中的'稀疏'和'密集'是指在同一个桶中结束的元素数量。
Bucket sort将输入范围拆分为多个桶,将每个元素放入正确的桶中,然后对这些桶进行排序。
例如,如果我们使用10个存储桶对0到999之间的数字进行排序,则第一个存储桶为[0-99]
,第二个存储桶为[100-199]
,依此类推。
如果几乎所有的值都小于100,它们都会在同一个桶中结束。在这种情况下,存储桶排序将与算法一样慢,以对各个存储桶进行排序(可以是插入排序)。
Radix sort不使用其他排序算法(如插入排序)对存储桶进行排序,而只是对每个数字分别应用某种排序。对于基数排序,与同一个桶中最终有多少元素无关。
要添加后者的示例,我们假设我们尝试对[711, 411, 611, 911, 211]
进行排序。
对最低有效数字进行排序会将所有元素放在同一个桶中(顺序不变)。对第二个有效数字进行排序也会做同样的事情。只有当最重要的数字被排序时,元素才会被放入不同的桶中。这没有性能影响。