non ho familiarità con queste implementazioni, ma qui è la funzione interna in uno dei miei implementazioni, per gli interi solo:
//-------------------------------------------------------------------------------------
//! 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
}
Non è direttamente leggibile perché utilizza un sacco di strutture ausiliarie e funzioni, ma l'idea è di mantenere un array separato con gli indici. Una volta ottenuta la posizione degli elementi nell'array di destinazione (pos), le ultime due righe aggiornano la matrice di valori e l'array di indice esattamente nello stesso modo.
Immagino che tu possa applicare la stessa idea a qualsiasi implementazione, ma dovresti modificare il codice.
L'ordinamento digitale non è un metodo di ordinamento basato sul confronto, è per questo che funziona meglio dei metodi basati su più confronti. – plasmacel
Ummmm. Sono abbastanza sicuro che l'OP abbia un'idea più che adeguata di come confrontare * sort *. Questo non è l'argomento di questa domanda. – WhozCraig
@plasma: Tuttavia, la tecnica mostrata (di inserimento indiretto) dovrebbe funzionare altrettanto bene per l'ordinamento digitale. Proverai la cifra da 'data [index]', ma poi inserirai 'index' nel bucket corrispondente. –