Questo può essere fatto in tempo lineare.
- Assegna un array della stessa dimensione. Memorizza l'indice per il primo elemento non riempito e l'ultimo elemento non riempito.
-
Scorrere l'input. Per ogni articolo:
- se è negativo, aggiungilo all'array di output al primo elemento non riempito e incrementa tale indice.
- se è positivo, aggiungilo all'array di output all'ultimo elemento unfilled e decrementa tale indice.
Anche questo può essere fatto sul posto, ma farlo correttamente è leggermente più difficile. Abbiamo quindi un puntatore a sinistra e un puntatore destro. Spostiamo il puntatore a sinistra in avanti mentre punta a numeri negativi, e il puntatore a destra all'indietro mentre punta a numeri positivi. Se i puntatori sono passati a vicenda, l'algoritmo è finito. Altrimenti, scambiamo gli elementi sotto i puntatori e continuiamo.
Se il tuo algoritmo è molto critico per le prestazioni al punto che vuoi fare un uso ottimale degli effetti di memorizzazione nella cache, potrebbe non essere il caso di riempire i numeri positivi al contrario. In tal caso, potrebbe essere preferibile scrivere prima i numeri positivi in un piccolo buffer cache-friendly e copiare il buffer alla fine dell'array di output quando è pieno.