基数排序 C++ 不屏蔽位

Posted

技术标签:

【中文标题】基数排序 C++ 不屏蔽位【英文标题】:Radix Sort C++ Not masking bits 【发布时间】:2012-03-09 05:19:39 【问题描述】:

我有一个队列和一个队列数组。 buckets 是数组,collector 是队列。 pass 是一个整数,它保存了它的传递。我有一个方法可以返回队列的第一个单元格的包含,称为peek()shiftOne() 是一种将一个队列的头部移动到另一个队列尾部的方法。

现在这段代码对我不起作用

bucket[((collector.peek()>>(pass * 8)) &0xFF)].shiftOne(collector);

我一步一步地走了,结果我没有正确地掩盖这些位。我可以改变它们,但仅此而已。所以我将尝试访问元素 102 以获得 10 元素数组。我究竟做错了什么?我知道peek()shiftOne(),因为我可以使用幂和模数进行排序。

【问题讨论】:

80xFF 与使用 radix-256 排序一致,在这种情况下,您的数组应该是 256 个元素(访问元素 102 就可以了) 【参考方案1】:

您将基数 10 与基数 2 混淆了。

位移是除以 2,例如:102 >> 1 = 102 / 2 = 51。 类似地:102 >> 8 = 102 / 2^8 = 102 / 256 = 0(在int 术语中)。

例如代码(i >> 8) & 0xFF用于提取给定i值的第二个字节的内容。

对于您的情况 - 坚持使用模数除以 10。

【讨论】:

实际上,他一次移动 8 位,因此看起来像是混淆了 radix-256 和 radix-10。

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

C++ 简单实现基数排序(list容器)

LSD基数排序c++代码

对 32 位数字使用基数排序

C++ 基数排序算法

基数排序(radixSort)

最高有效位基数排序如何比最低有效位基数排序更有效?