我正在阅读Cormen等人的算法导论。人。在他们描述Radix排序的部分,他们说:
直观地说,您可以对最重要的数字进行排序, 递归地对每个结果箱进行排序,然后组合甲板 为了。不幸的是,因为10个箱子中的9个必须是卡片 放在一边分类每个箱子,这个程序产生很多 中等堆积的牌,你必须跟踪。
这是什么意思? 我不明白如何通过MSB排序会有问题吗?
答案 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
现在,零和一百个桶中的数字需要按下一个数字排序(其他两个桶每个只包含一个项目):
不需要按最低有效数字(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(与其他专业程序员一样)不喜欢在必要时进行繁琐的工作。