关于在Java中实现基数排序的问题
下面的基数排序执行四次计数排序(256个桶,32位整数,从最低有效位开始),从关于在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
公共类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;
}