为什么不应该从MSD开始实现基数排序?

时间:2012-10-15 05:08:20

标签: algorithm sorting

我正在阅读Cormen等人的算法导论。人。在他们描述Radix排序的部分,他们说:

  

直观地说,您可以对最重要的数字进行排序,   递归地对每个结果箱进行排序,然后组合甲板   为了。不幸的是,因为10个箱子中的9个必须是卡片   放在一边分类每个箱子,这个程序产生很多   中等堆积的牌,你必须跟踪。

这是什么意思? 我不明白如何通过MSB排序会有问题吗?

2 个答案:

答案 0 :(得分:2)

考虑以下示例列表进行排序: 170,045,075,090,002,024,802,066,182,332,140,​​144

  • 按最高有效数字排序(数百)给出:

    • 零数百桶:045,075,090,002,024,066

    • 一百桶:170,182,140,​​144

    • 三百桶:332

    • 八百桶:802

  • 现在,零和一百个桶中的数字需要按下一个数字排序(其他两个桶每个只包含一个项目):

    • 零点数:002
    • 二十多岁:024
    • 四十年代:045
    • 六十年代:066
    • 七十年代:075
    • 九十年代:090
  • 不需要按最低有效数字(1s位置)排序,因为没有多个数据桶有多个数字。虽然这不是一百桶的情况(运动:自己递归排序)。因此,现在排序的零数百桶被连接,按顺序连接,用一,三和八百桶来给出:

    002, 024, 045, 066, 075, 090, 140, 144, 170, 182, 332, 801

您可以看到作者指的是中间递归排序步骤,这在LSD基数排序中是不必要的。

答案 1 :(得分:1)

它们指的是LSD基数排序的一个有用属性,因为你确保每个排序步骤都是稳定,你只需要在整个阵列上为每个数字运行一步,你就不要不必单独对任何子集进行排序。

采取Michael的示例数据:

0步后:

170,045,075,090,002,024,802,066,182,332,140,​​144

一步后(按单位排序):

170,090,140,​​002,802,182,332,024,144,045,075,066

经过2个步骤(排序数十):

002,802,024,332,140,​​144,045,066,170,075,182,090

经过3个步骤(数百个排序):

002,024,045,066,075,090,140,​​144,170,182,332,802

如果您使用二进制而不是基数10进行基数排序,则此属性变得特别有用。然后每个排序步骤只是一个分区为两个,这非常简单。至少,直到你想要这样做而不使用任何额外的内存。

当然,MSD基数排序工作只需要更多的簿记和/或非尾递归。这只是一个“问题”,因为CLRS(与其他专业程序员一样)不喜欢在必要时进行繁琐的工作。