基数排序如何用于 32 位(或更高)整数排序?

Posted

技术标签:

【中文标题】基数排序如何用于 32 位(或更高)整数排序?【英文标题】:How does Radix Sort work for 32-bit (or higher) integersorting? 【发布时间】:2013-10-16 06:34:03 【问题描述】:

我明白 32 位整数被分解为 8 位块。有人可以给我更多关于通行证如何工作的解释吗?一个简单的例子将帮助我更好地理解它。例如,我有 2147507648 和 2147507672。我将它们分解为 8 位块。 128 0 093 216 是 2147507672 的细分,128 0 093 192 是 2147507648 的细分。

我了解 LSD 基数排序如何用于基数 10。如果有人能告诉我在获得 8 位块后如何对这些 32 位整数进行排序,我将不胜感激。

非常感谢!

【问题讨论】:

【参考方案1】:

对一组数字进行基数排序背后的一般思想是将数字写入某个以 b 为底的数字,然后一次处理一个以 b 为底的数字。如果您对以 10 为基数的基数排序感到满意,那么调整算法以使其在其他基数中工作并没有太多工作量。

举个例子,假设我们想做一个base-2(二进制)基数排序。在这种情况下,我们将以 2 为底(二进制)写入数字。我们将有两个桶,而不是十个桶。我们不是一次看一个数字的位数,而是一次看一个数字的位。除此之外,算法与base-10基本相同。

当您将数字分成 8 位组时,您可以考虑将数字以 256 为基数写入。为什么?好吧,类比推理,假设您采用以 10 为底的基数排序(您习惯使用的那种),而不是 10 个桶,而是 100 个桶。然后,不是一次处理一个数字,而是一次处理两个数字。这仍然可以正常工作(我希望你明白为什么!)并且实施起来并不难。此过程与使用 base-100 基数排序完全相同 - 通过将相邻的 base-10 数字组合在一起,您可以形成 base-100 数字。作为另一个示例,将数字分组为三个给出以 1000 为底的基数排序。所以现在让我们回到二进制。每个位都是以 2 为底的数字。一组两位可以被认为是一个基数为 4 的数字。一组四位可以被认为是一个基数为 16 的数字,一组八位因此形成一个基数为 256 的数字。

因此,为了回答您的问题,从 base-10 基数排序基数排序转换为每个 8 位块的方法是考虑您正在做什么作为基数 256 基数排序,然后相应地实施算法。

【讨论】:

【参考方案2】:

在您进入Radix Sort 之前,您是否对Counting Sort 非常熟悉? 如果您了解Counting Sort,那么您将很容易了解基数排序的工作原理并能够自己实现它。

您需要了解的另外几件事是跟踪数字的频率,然后计算累积频率。累积频率决定了最终排序数组中第 th 个元素的位置。

这里:http://www.youtube.com/watch?v=3mxp4JLGasE

【讨论】:

是的,我通过简单的例子理解了它:-)。我只是想了解它背后的数学是如何工作的。我刚刚了解了一些基于比较的排序算法。我稍后会尝试执行。 基数排序基本上是根据数字的个位、十位、百位位置重复应用于数字的计数排序 -1,这应该是一条评论。它不包含任何关于任何一种排序的真实信息,只是一个关于计数的解释链接,从计数到基数还有一个不平凡的步骤,你没有解释。还希望 SO 至少将链接中的要点复制到您的答案中,因为视频在未来某个时候出现故障并非不可能。 @KillianDS 你能告诉我如何让答案更好吗? :)

以上是关于基数排序如何用于 32 位(或更高)整数排序?的主要内容,如果未能解决你的问题,请参考以下文章

非负整数的基数排序(按位)

关于Java中基数排序实现的问题

在 uint64 中对 38 位进行基数排序?

基数排序及其并行化

什么时候使用基数排序合适?

#19 基数排序(Radix Sort)