Il riordino può essere fatto in modo "zoppo", ad es. stampa livello per livello.
Non sono riuscito a rimuovere la ricorsione, ma non è necessaria una coda.
Anche perché stiamo lavorando con un array, non è necessario toccarlo più di N volte - ad es. tocchiamo ogni elemento solo una volta.
Ecco l'implementazione concettuale che elenca solo i primi livelli, ma l'idea è chiara.
Implementazione in C ++, ma C sarebbe quasi il simile.
#include <cstdio>
void reorder(size_t const start, size_t const end, size_t const level, size_t const clevel = 0){
if (start >= end){
printf("NULL\n");
return;
}
size_t const mid = start + ((end - start) >> 1);
if (clevel == level){
// here we touch the array
printf("%zu\n", mid);
return;
}
reorder(start, mid, level, clevel + 1);
reorder(mid + 1, end, level, clevel + 1);
}
void reorder(size_t const size, size_t const maxLevels){
for(size_t level = 0; level < maxLevels; ++level)
reorder(0, size, level);
}
int main(){
reorder(20, 4);
}
Ecco un altro esempio:
link