你如何处理每个整数基数排序的地方?
背景:
我正在研究基数排序,我相信我对算法的工作原理有一个很好的想法。 但是,我无法理解您在浏览列表时如何实际“解读”每个元素。
我会再解释一下:
可以说我有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^0
, b = b^1
, b*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
数组之前。
上一篇: How do you handle the places for each integer Radix Sort?