我的一门 CS 课程遇到了一个问题,我必须编写一个可以对无符号整数(+ 或 -)进行排序的 LSD 基数排序。假设要排序的值是 32 位整数值。
规定是我的掩码必须是一个常数值,这就是我的问题所在。如果我对 32 位整数进行 & 按位运算,其中每个数字由 4 位(十六进制表示)表示,我的掩码应该是 28 吗?(因为我希望二进制中有 28 位 1)
另外,如果有人注意到任何其他错误,请您注意它们吗?
#define BITS_PER_PASS 4
#define NUM_PASSES 8
#define NUM_BUCKETS 16
#define MASK 28
int *buckets[NUM_BUCKETS];
int bucket_sizes[NUM_BUCKETS];
void radix_sort( int *values, int n )
{
int i, j;
int bucket_index;
int *p;
for( i=0; i < NUM_PASSES; i++ )
{
for( j=0; j < NUM_BUCKETS; j++ )
{
bucket_sizes[j]=0;
}
for( j=0; j < n; j++ )
{
bucket_index = (values[j] & MASK) >> BITS_PER_PASS*i; //QUESTION
buckets[j][ bucket_sizes[bucket_index]]=values[j];
bucket_sizes[bucket_index]++;
}
p = values;
for( j=0; j < NUM_BUCKETS; j++ )
{
memcpy((void *)p, (void *)buckets[j], sizeof(int)*bucket_sizes[j]);
p+=bucket_sizes[j];
}
}
}
我还想补充一点,所有定义的常量和全局变量都是强制性的,因为我被告知在我的基数排序中使用它们。