Мне дали задачу для одного из моих курсов 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];
}
}
}
Я также хотел бы добавить, что все определенные константы и глобальные переменные являются обязательными, поскольку мне сказали использовать их в моей сортировке по основанию.
int *buckets[NUM_BUCKETS];
объявляет массив из 16 указателей на целые числа. определение указателей не там, где указывают указатели. Поскольку эта строка находится в пространствеfile global
(которое автоматически инициализируется всеми 0x00), результатом является массив из 16 указателей, каждый из которых содержит NULL. - person user3629249   schedule 25.10.2015buckets[j][ bucket_sizes[bucket_index]]=values[j];
- это 1) выбор нулевого указателя, 2) (неправильно) индексация, куда указывает этот указатель (т.е. некоторый индекс вне адреса 0.) Затем записать значение в какое-то небольшое смещение от адреса 0. В целом, вероятно не то, что вы хотите, и почти наверняка вызовет событие ошибки сегмента во время выполнения. - person user3629249   schedule 25.10.2015