了解 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 中的基数排序的主要内容,如果未能解决你的问题,请参考以下文章