CS コースの 1 つで、符号なし整数 (+ または -) をソートできる LSD 基数ソートをプログラムする必要があるという問題がありました。ソートされる値は 32 ビット整数値であるとします。
規定は、私のマスクが定数値でなければならないということです。これが私の質問の場所です。各桁が 4 ビット (16 進表現) で表される 32 ビット整数に対して & ビット演算を行う場合、マスクは 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];
}
}
}
また、基数ソートでこれらを使用するように言われたため、定義された定数とグローバル変数はすべて必須であることも付け加えておきます。