关于在Java中实现基数排序的问题

关于在Java中实现基数排序的问题,java,algorithm,sorting,bit-manipulation,radix-sort,Java,Algorithm,Sorting,Bit Manipulation,Radix Sort,下面的基数排序执行四次计数排序(256个桶,32位整数,从最低有效位开始),从 公共类LSD{ 私有最终静态整数位每字节=8; //LSD对整数数组进行排序,将每个整数视为4个字节 //假设整数是非负的 //[2-3倍于数组。sort()] 公共静态无效排序(int[]a){ int BITS=32;//每个int是32位 int W=位/位/字节;//每个int为4个字节 int R=1>位/字节*d)和掩码; 计数[c+1]++; } //计算累积量 for(int r=0;r

下面的基数排序执行四次计数排序(256个桶,32位整数,从最低有效位开始),从

公共类LSD{
私有最终静态整数位每字节=8;
//LSD对整数数组进行排序,将每个整数视为4个字节
//假设整数是非负的
//[2-3倍于数组。sort()]
公共静态无效排序(int[]a){
int BITS=32;//每个int是32位
int W=位/位/字节;//每个int为4个字节
int R=1>位/字节*d)和掩码;
计数[c+1]++;
}
//计算累积量
for(int r=0;r>每字节的位*d)&掩码;
aux[count[c]+]=a[i];
}
//复写
对于(int i=0;i
除此部分外,我了解大部分代码:

if (d == W-1) {
    int shift1 = count[R] - count[R/2];
    int shift2 = count[R/2];
    for (int r = 0; r < R/2; r++)
        count[r] += shift1;
    for (int r = R/2; r < R; r++)
        count[r] -= shift2;
}
if(d==W-1){
int shift1=计数[R]-计数[R/2];
int shift2=计数[R/2];
对于(int r=0;r

这段代码的目的是什么?谢谢

代码块完全按照注释所述执行:

对于最高有效字节,0x80-0xFF位于0x00-0x7F之前

原因是:因为您使用的是
int
,所以最重要的位是符号位。因此,在
0x80-0xFF
范围内具有最高有效字节的数字是负数,因此应放在正数之前,正数的最高有效字节在
0x00-0x7F
范围内

如果您想知道代码块是如何实现的,这里有一个简单的想法:

因为您了解数据是如何移动的,所以我假设您了解整个代码中
count[]
的作用。在代码块中,
R
是上界,即
0xFF+1
R/2
0x7F+1
。因此,
count[R]-count[R/2]
0x80
0xFF
范围内的总数。因此,通过将
count[R]-count[R/2]
移位到
count[0..R/2]
并从
count[R/2..R]
中减去它,将有助于
0x00
0x7F
范围内的数字比
0x80
0xFF
范围内的数字具有更高的
count值,最终导致0x80-0xFF出现在0x00-0x7F之前


最后,您可能会好奇:如果第一位是符号位,为什么
11111111
大于
10000001
?那不是
-(127)<-(1)
?这是因为在计算机系统中,我们使用有符号整数代替有符号整数,因此
11111111
实际上意味着
-1
,而
10000001
实际上意味着
-127

谢谢,非常好的解释!在这种情况下,这段代码实际上适用于包含非负整数的
inta[]
(与代码作者在第4-5行注释中的假设相反)?
if (d == W-1) {
    int shift1 = count[R] - count[R/2];
    int shift2 = count[R/2];
    for (int r = 0; r < R/2; r++)
        count[r] += shift1;
    for (int r = R/2; r < R; r++)
        count[r] -= shift2;
}