了解 C 中的基数排序

Posted

技术标签:

【中文标题】了解 C 中的基数排序【英文标题】:Understanding Radix Sort in C 【发布时间】:2013-09-18 07:06:07 【问题描述】:

我使用这个program here 作为参考,看看算法是如何实现的。除了这部分,我大部分都理解:

/*
 * update all the buckets. If bucket[8] has 2,
 * then there are 2 elements present till bucket 8
 */
for (i = 1; i < 10; i++)
        bucket[i] = bucket[i] + bucket[i-1];  

我不明白作者在那个循环中做了什么。有人可以解释发生了什么吗? 是的,我正在用纸笔看看发生了什么。只是想我可以澄清一下

【问题讨论】:

我会推荐使用算法而不是程序的纸笔方法。 @thefourtheye 我理解它背后的逻辑。但是,我对正在更新的魔法桶感到困惑 你为什么不删除那行,看看接下来会发生什么 @dare 它会打印零。 评论很糟糕,但我不清楚为什么该代码的作用并不明显,特别是如果您手动完成它:bucket[1] 【参考方案1】:

这个函数是取累积和,现在bucket[i]包含了它自己和它之前的所有bucket的累积和。评论的意思是 bucket[8] == 2 意味着桶 0 到 8 的总和 = 2

编辑:我个人认为http://www.youtube.com/watch?v=Nz1KZXbghj8&noredirect=1 有一个很好的基数排序解释。

【讨论】:

【参考方案2】:

如果您对该行感到困惑,可以阅读有关计数排序的内容。了解有关基数排序的重要事项之一是它不会自行排序。有一个子算法需要用到,而且经常是计数排序。

您提供的链接没有说明这一点,我认为这是一个重要的混淆。当你阅读

“在第一次通过时,排序所有数据基于最低有效位”

它不会告诉您如何排序。您可以使用任何其他稳定排序进行排序,并且代码会发生巨大变化。

所有这一切都在说,如果这是您不理解的唯一行,那么您已经弄清楚了基数排序。阅读有关计数排序以了解它的工作原理,并确保您了解为什么它是作为基数排序子例程的不错选择。

【讨论】:

我一定要接受你的回答,因为这为我解决了一切。这是关于计数排序的精彩讲座:youtube.com/watch?v=3mxp4JLGasE

以上是关于了解 C 中的基数排序的主要内容,如果未能解决你的问题,请参考以下文章

C中基数排序的不同基础

使用 OpenMP 并行化 C 中的基数排序

基数排序和更改基数

浮点数在c中的基数排序

c中的基数排序算法[关闭]

算法计数排序桶排序和基数排序详解