Я не знаком с этими реализациями, но вот внутренняя функция в одной из моих реализаций, только для целых чисел:
//-------------------------------------------------------------------------------------
//! sort the source array based on b-th byte and store the result in destination array
//! and keep index (how to go from the sorted array to the un-sorted)
template<typename T, typename SS, typename SD> inline
void radix_sort_byte(size_t b, array<T, SS>& src, array<T, SD>& dest,
size_array& ind_src, size_array& ind_dest)
{
b *= 8;
size_t B = 256, N = src.size();
size_array bytes = (src >> b) & 0xff; // current byte of each element
size_array count(B, size_t(0)); // occurrences of each element
++count[bytes];
if(count[0] == N) // all bytes are zero; order remains unchanged
{ dest = src; ind_dest = ind_src; return; }
size_array index = shift(cumsum(count), 1); // index-list for each element
size_array pos(N); // position of each element in the destination array
for(size_t i=0; i<N; i++) pos[i] = index[bytes[i]]++;
dest[pos] = src; // place elements in the destination array
ind_dest[pos] = ind_src; // place indices
}
Это не читаемое, поскольку он использует множество вспомогательных структур и функций, но идея состоит в том, что вы сохраняете отдельный массив с индексами. Когда у вас есть позиция элементов в целевом массиве (pos), последние две строки точно обновляют массив значений и индексный массив.
Я думаю, вы можете применить ту же идею к любой реализации, но вам придется изменить код.
Radix sort - это метод сортировки, основанный на сравнении, поэтому он работает лучше, чем большинство методов сравнения. – plasmacel
Ummmm. Я достаточно уверен, что у OP есть более чем адекватная идея о том, как сортировать сравнение *. Это не предмет этого вопроса. – WhozCraig
@plasma: Тем не менее, техника, показанная (вставки косвенности), должна работать одинаково хорошо для сортировки радикса. Вы проверите цифру из 'data [index]', но затем вставьте 'index' в соответствующее ведро. –