你如何处理每个整数基数排序的地方?

背景:
我正在研究基数排序,我相信我对算法的工作原理有一个很好的想法。 但是,我无法理解您在浏览列表时如何实际“解读”每个元素。

我会再解释一下:

可以说我有arrayToSort = [50, 4, 2, 10, 22, 284]

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

斗0:50,10
第1桶:空
时段2:2,22
第3桶:空
桶4:4,284(和5 - 9是空的)

然后,我将通过将每个存储桶中的元素(从存储桶0开始)放入新阵列中来重新构建阵列。

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

题:
你应该如何处理与阵列中其他整数数量不相同的整数的问题?

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

  • 俄勒冈州基数排序
  • 极客观点基数排序
  • 边注:
    如果有人想知道,这不是作业。 我只是想更熟悉不同的算法以及如何实现它们。


    别担心。 数学提供了你正在考虑的“填充”。

    第一次通过,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。

    在下一次迭代中,你当然会得到全零。


    如果您使用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的幂运算)。

    这对于负数不起作用,但是......您还需要用该公式处理负数。


    您已经清楚地理解了该算法的要点。 你只关心一个小的实现细节。

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

    n = 100 * a0 + 101 * a1 + 102 * a2 + ... + 10i * ai + ... =&Sum; 10i * ai

    其中0&leq; ai&leq; 9是一个数字。

    例子:

    4 = 100 * 4 + 101 * 0 + 102 * 0 + ...

    104 = 100 * 4 + 101 * 0 + 102 * 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数组之前。

    链接地址: http://www.djcxy.com/p/70797.html

    上一篇: How do you handle the places for each integer Radix Sort?

    下一篇: find a missing number using limited memory