桶排序和基数排序有啥区别?
Posted
技术标签:
【中文标题】桶排序和基数排序有啥区别?【英文标题】:What is the difference between bucket sort and radix sort?桶排序和基数排序有什么区别? 【发布时间】:2011-05-26 14:14:27 【问题描述】:桶排序和基数排序是近亲;桶排序从 MSD 到 LSD,而基数排序可以在两个“方向”(LSD 或 MSD)上进行。这两种算法是如何工作的,特别是它们有何不同?
【问题讨论】:
【参考方案1】:桶排序和基数排序类似于姐妹排序算法,因为它们不是比较排序,并且总体思路相似。而且,它们在实现上都有点抽象。
基数排序:
基数表示基数(二进制、八进制、十进制等)。因此,此排序适用于数字(也用于字符串)。这适用于每个元素 E 类似于 ek...e2e1e0,其中 e i 在某个范围内。 (通常从 0 到十进制的 0-9 或 ASCII 字符的 0-255)
然后它使用 k 次稳定子排序算法(它必须是稳定的,否则基数排序将不起作用)对数字进行排序。这种子排序算法通常也是计数排序或桶排序,但它不能是基数排序本身。
您可以从最高有效数字或最低有效数字开始,因为它会在每次传递(从 k 到 0 或 0 到 k)中随机排列每个数字
是一种稳定的排序算法。
桶排序:
它将数组分成较小的组或桶,并使用子排序算法或对其自身的递归调用对它们进行单独排序,然后组合结果。例如,通过将球员添加到球队的存储桶中,然后按球衣号码对他们进行排序,或者将数字从 1-30 排序到 1-10、11-20、21-30 的 3 个存储桶中。
合并步骤很简单(与合并排序不同)。只需将每个桶的元素复制回原始数组或将每个桶的头部与前一个桶的尾部连接(如果是链表)
基数/基数在对数字进行排序时可能是组/桶的类型/实例。因此,您可以将 MSD 基数视为桶排序的修改实例
桶排序是非就地,而是稳定的排序算法。但是,桶排序的某些变体可能不稳定(如果您使用不稳定的子排序算法)
【讨论】:
一个小小的说明 - MSD 基数排序的一些实现是不稳定的。【参考方案2】:RadixSort
和 BucketSort
的初始 pass 完全相同。根据最大数字的位数,将元素放入增量范围(例如 0-10、11-20、... 90-100)的 buckets
(或 bins
)中。
然而,在下一轮中,BucketSort
将这些“桶”排序并将它们附加到一个数组中。但是,RadixSort
会在不进一步排序的情况下附加存储桶,并根据数字的第二位(十位)对其进行“重新存储”。因此,BucketSort 对于“密集”数组更有效,而 RadixSort 可以很好地处理稀疏(嗯,不完全稀疏,但间隔)数组。
【讨论】:
您能否扩展此答案以解释为什么这两种方法的时间复杂度不同?即为什么桶排序是 O(n+k),而基数排序是 O(nk)? @ShaunBudhram 这是个老问题,但如果有人读到这篇文章想知道。从描述中可以看出,桶排序对 N 进行一次遍历,然后合并 K 个桶(桶内的顺序是任意的)。虽然基数排序对每个存储桶进行一次传递,但在这里我认为对字符串进行排序会是更好的例子,因此您需要进行 K 次复杂度为 N 的传递。 您所说的“BucketSort 将这些'桶'排序”是什么意思?每个桶是用不同的算法排序的还是什么?因为如果按 10 秒分组,每个存储桶都不会完全排序。 “因此,BucketSort 对于‘密集’数组更有效,而 RadixSort 可以很好地处理稀疏数组。” - 为什么会这样?以上是关于桶排序和基数排序有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章