我的一个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];
}
}
}
我还想补充一点,所有定义的常量和全局变量都是必需的,因为我被告知要在我的基数排序中使用它们。
答案 0 :(得分:0)
而不是:
int *buckets[NUM_BUCKETS];
int bucket_sizes[NUM_BUCKETS];
...
buckets[j][ bucket_sizes[bucket_index]]=values[j];
建议:
int buckets[NUM_BUCKETS];
int bucket_size[NUM_BUCKETS];
...
buckets[bucket_size[bucket_index]]=values[j];
关于以下几行:
bucket_index = (values[j] & MASK) >> BITS_PER_PASS*i;
我希望能够提取4位的内容,例如:
bucket_index = (values[j] >> BITS_PER_PASS*i) & MASK;
其中MASK为0x0F,因为尝试选择16个不同“桶”中的一个(其中&amp; 0x0F将产生0到15范围内的值)
答案 1 :(得分:0)
我看到你正在使用一个名为bucket_sizes [NUM_BUCKETS]的数组和指针数组。这些可以在sort函数中声明。对于32位无符号整数,NUM_BUCKETS = 32 / BITS_PER_PASS。
您还需要第二个缓冲区来保存已排序的值,例如,buffer = malloc(n * sizeof(unsigned int);完成排序时不要忘记释放(缓冲区)。
指针数组应设置为buckets [0] = buffer,buckets [1] = buffer + bucket_sizes [0],buckets [2] = buffer + bucket_sizes [0] + bucket_sizes [1],... 。您可以使用局部变量来跟踪铲斗尺寸的总和。请注意,最后一个bucket_sizes [15]不用于设置指针数组。
每次传递交换缓冲区和值后(将它们视为指针)。由于它是偶数个通道,(8),排序后的数据最终会返回值。