你如何处理每个整数Radix Sort的位置?

时间:2016-03-06 19:12:06

标签: java algorithm sorting radix-sort

背景
我正在研究基数排序,我相信我对该算法的工作原理有很好的了解。但是,我无法理解你实际上如何解释"通过列表时的每个元素。

我将再解释一下:

假设我有arrayToSort = [50, 4, 2, 10, 22, 284]

根据我的理解,我将从0到9排序到十位。所以,我有:

Bucket 0:50,10 铲斗1:空的 铲斗2:2,22
铲斗3:空车 4:4,284 (并且5 - 9是空的)

然后,我通过将每个桶中的元素(从桶0开始)放入新数组来重建数组。

问题:
这就是我陷入困境的地方:对于百分之一的地方,我做了第一次迭代我做的事情。但是我该怎么做2和4这样的元素呢?我假设我需要"垫"它们带有前导零。但是,如果我这样做,这是否意味着我需要将每个元素视为一个字符串,而我要进行比较以获得该填充(即" 0002")?根据我的理解,Java(我使用的语言)并没有实现带前导零的整数。但是在字符串和整数之间切换效率似乎很低。

问题:
你应该如何处理一些整数的问题,这些整数与数组中的其他整数没有相同的位数?

我已经看过伪代码和算法的实现,我仍然对如何处理获取整数中每个位置的值感到困惑。我无法理解如何在不带前导零的情况下实现算法(并将整数转换为字符串),而我所看到的例子并不是这样做的。以下是我尝试的几个网站:

  1. Oregon State Radix Sort
  2. Geek Viewpoint Radix Sort
  3. 旁注:
    如果有人想知道,这不是家庭作业。我只是想更熟悉不同的算法以及如何实现它们。

3 个答案:

答案 0 :(得分:2)

不用担心。数学提供"填充"你在想什么。

第一次,1号位给了桶。在您提供的Budd代码中,这是计算

hashIndex = (data[i] / 1) % 10;

这将产生从0到9的值,这取决于最低有效数字。即,对于10,101,942,13,41,你得到0,1,2,3,4。

在第二次迭代中,这变为

hashIndex = (data[i] / 10) % 10;

桶指数将是10位数:1,0,4,1,0。

只是为了第三次迭代的乐趣,

hashIndex = (data[i] / 100) % 10;

所以你有:0,1,9,0,0。

在下一次迭代中,你当然会全部为零。

答案 1 :(得分:0)

如果您使用的是2的幂数,则可以使用位操作来执行此操作。

示例

16 = 2 ^ 4水桶:

这允许您使用

计算数字
int input = ...
int digitNumber = ... // digit number from last digit to first one
int bucket = (index >> (4*digitNumber)) & ((1 << 4) - 1); // (index >> (4*digitNumber)) & 0xF

使用最高位时需要注意,因为交换此位会交换所表示数字的符号。这意味着您还需要按标记进行排序。

这只是对2的幂的优化。通常,您可以使用

找到数字
bucket = (input / d) % b;

其中d = 1=b^0b = b^1b*b = b^2,...,b^n^ =指数不是此处的XOR)。

虽然这对负数不起作用......你还需要用该公式不同地处理负数。

答案 2 :(得分:0)

您已清楚地了解算法的要点。您只对一个小的实现细节感兴趣。

在十进制系统中,我们有以下数字表示:

n = 10 0 * a 0 + 10 1 * a 1 + 10 2 * a 2 + ... + 10 i * a i + ... =Σ10 i < / SUP> *一个<子> I

其中0≤a i ≤9是一个数字。

示例:

4 = 10 0 * 4 +10 1 * 0 + 10 2 * 0 + ...

104 = 10 0 * 4 +10 1 * 0 + 10 2 * 1 + ...

事实上,你总是在任何地方都有一个数字。那些前导零只是不用十进制数表示。

因此,请考虑使用此功能查找数字:

int dig(int num, int place) {
    // divide by powerOf10 to put away lower place digits
    // take the reminder of division by 10 - the lowest digit
    return num / powersOf10[place] % 10;
}

之前预先计算powersOf10数组。