Algorithm 桶排序和基数排序有什么区别?

Algorithm 桶排序和基数排序有什么区别?,algorithm,language-agnostic,sorting,radix-sort,bucket,Algorithm,Language Agnostic,Sorting,Radix Sort,Bucket,桶排序和基数排序是近亲;桶排序从MSD到LSD,而基数排序可以在两个“方向”(LSD或MSD)上进行。这两种算法是如何工作的,特别是它们的区别是什么?RadixSort和BucketSort的初始过程完全相同。元素被放入增量范围(例如0-10、11-20、…90-100)的桶中(或桶中),具体取决于最大数字中的位数 但是,在下一个过程中,BucketSort将这些“bucket”排序,并将它们附加到一个数组中。但是,RadixSort在不进行进一步排序的情况下追加存储桶,并根据数字的第二位(十位

桶排序和基数排序是近亲;桶排序从MSD到LSD,而基数排序可以在两个“方向”(LSD或MSD)上进行。这两种算法是如何工作的,特别是它们的区别是什么?

RadixSort和BucketSort的初始过程完全相同。元素被放入增量范围(例如0-10、11-20、…90-100)的
桶中(或
桶中),具体取决于最大数字中的位数


但是,在下一个过程中,
BucketSort
将这些“bucket”排序,并将它们附加到一个数组中。但是,
RadixSort
在不进行进一步排序的情况下追加存储桶,并根据数字的第二位(十位)对其进行“重新存储”。因此,BucketSort对于“密集”数组更有效,而RadixSort可以很好地处理稀疏(不是完全稀疏,而是间隔)数组。

Bucket Sort和Radix Sort类似于姐妹排序算法,因为它们不是比较排序,其总体思想类似。而且,它们在实现上都有点抽象

基数排序

  • 基数表示基数(二进制、八进制、十进制等)。因此,此排序用于数字(也用于字符串)。当每个元素E类似于ek…e2e1e0,其中ei在某个范围内时,这就起作用了。(通常以0为基数,如十进制中的0-9或ASCII字符中的0-255)

  • 然后,它使用稳定子排序算法的k个过程(它必须是稳定的,否则基数排序将不起作用)对数字进行排序。此子排序算法通常也是计数排序或桶排序,但不能是基数排序本身

  • 您可以从最高有效位或最低有效位开始,因为它会在每次传递(从k到0或0到k)中洗牌每个数字

  • 这是一种稳定的排序算法

桶排序:

  • 它将数组分成较小的组或桶,并使用子排序算法或对自身的递归调用对它们进行单独排序,然后组合结果。例如,将球员放入球队的各个桶中,然后根据球衣号码对其进行排序,或者类似于将1-30之间的号码排序为1-10、11-20、21-30三个桶

  • 合并步骤很简单(与合并排序不同)。只需将每个bucket的元素复制回原始数组,或者将每个bucket的头部与前一个bucket的尾部连接起来(如果是链表)

  • 基数/基数可以是排序数字时组/桶的类型/实例。因此,您可以将MSD基数视为桶排序的修改实例

  • 桶排序是不到位的稳定的排序算法。但是,桶排序的某些变体可能不稳定(如果使用不稳定的子排序算法)


您能否扩展此答案,解释这两种方法的时间复杂性为何不同?i、 为什么桶排序是O(n+k),而基数排序是O(nk)?@ShaunBudhram这是一个老问题,但如果有人读到这篇文章想知道。从描述中可以明显看出,bucket sort对N进行一次传递,然后合并K个bucket(bucket中的顺序是任意的)。虽然基数排序对每个bucket进行一次传递,但这里我认为字符串的排序将是更好的示例,因此您执行复杂度为N的K次传递。您所说的“BucketSort对这些‘bucket’进行排序”是什么意思?每个桶是用不同的算法排序的还是什么?因为如果按10秒分组,每个存储桶都不会完全排序。“因此,BucketSort对于“密集”数组更有效,而RadixSort可以很好地处理稀疏数组。”-为什么会这样?一个小注释-MSD Radix sort的一些实现不稳定。