Существует гораздо более простой способ сделать это, и вместо radix*nkeys
места вам нужен только буфер размером nkeys
.
Выделите второй буфер, который может соответствовать клавишам nkeys
. Теперь сделайте первый проход по вашим данным и просто посчитайте, сколько ключей окажется в каждом сегменте. Теперь вы можете создать массив указателей размером radix
, где каждый указатель находится в начале этого блока в выходном буфере. Наконец, второй проход, хотя данные перемещают ключи. Каждый раз, когда вы перемещаете клавишу, увеличивайте указатель сегмента.
Вот код на C, который нужно преобразовать в C ++:
void radix_sort(int *keys, int nkeys)
{
int *shadow = malloc(nkeys * sizeof(*keys));
int bucket_count[10];
int *bucket_ptrs[10];
int i;
for (i = 0; i < 10; i++)
bucket_count[i] = 0;
for (i = 0; i < nkeys; i++)
bucket_count[keys[i] % 10]++;
bucket_ptrs[0] = shadow;
for (i = 1; i < 10; i++)
bucket_ptrs[i] = bucket_ptrs[i-1] + bucket_count[i-1];
for (i = 0; i < nkeys; i++)
*(bucket_ptrs[keys[i] % 10]++) = keys[i];
//shadow now has the sorted keys
free(shadow);
}
Но я, возможно, неправильно понял вопрос. Если вы делаете что-то немного отличное от radix, пожалуйста, добавьте некоторые детали.