L'algoritmo di ordinamento è il seguente:
Mentre l'elenco non è ordinato, scatta la metà di tutti gli elementi (rimuovili dall'elenco). Continua fino a quando l'elenco non viene ordinato o rimane solo un elemento (che viene ordinato per impostazione predefinita). Questo algoritmo di ordinamento può fornire risultati diversi in base all'implementazione.
La procedura di rimozione degli articoli dipende dall'implementazione per decidere, ma l'elenco dovrebbe essere lungo la metà rispetto a prima dopo un passaggio della procedura di rimozione degli articoli. L'algoritmo può decidere di rimuovere la prima metà o l'elenco, l'ultima metà dell'elenco, tutti gli elementi dispari, tutti gli elementi pari, uno alla volta fino a quando l'elenco è lungo la metà o qualsiasi altro non menzionato.
L'elenco di input può contenere una quantità arbitraria di elementi (entro limiti ragionevoli, diciamo fino a 1000 elementi), non solo elenchi perfettamente divisibili di 2 ^ n elementi. Dovrai rimuovere (n + 1) / 2 o (n-1) / 2 elementi se l'elenco è dispari, codificato o deciso casualmente durante il runtime. Decidi tu stesso: cosa farebbe Thanos se l'universo contenesse una strana quantità di esseri viventi?
L'elenco viene ordinato se nessun elemento è più piccolo di qualsiasi elemento precedente. I duplicati possono verificarsi nell'input e possono verificarsi nell'output.
Il programma dovrebbe includere un array di numeri interi (tramite stdin o come parametri, singoli elementi o un parametro array) e restituire l'array ordinato (o stamparlo su stdout).
Esempi:
// A sorted list remains sorted
[1, 2, 3, 4, 5] -> [1, 2, 3, 4, 5]
// A list with duplicates may keep duplicates in the result
[1, 2, 3, 4, 3] -> [1, 3, 3] // Removing every second item
[1, 2, 3, 4, 3] -> [3, 4, 3] -> [4, 3] -> [3] // Removing the first half
[1, 2, 3, 4, 3] -> [1, 2] // Removing the last half
[1, 2, 4, 3, 5]
potrebbe dare risultati diversi:
// Removing every second item:
[1, 2, 4, 3, 5] -> [1, 4, 5]
o:
// Removing the first half of the list
[1, 2, 4, 3, 5] -> [3, 5] // With (n+1)/2 items removed
[1, 2, 4, 3, 5] -> [4, 3, 5] -> [3, 5] // With (n-1)/2 items removed
o:
// Removing the last half of the list
[1, 2, 4, 3, 5] -> [1, 2] // With (n+1)/2 items removed
[1, 2, 4, 3, 5] -> [1, 2, 4] // With (n-1)/2 items removed
o:
// Taking random items away until half (in this case (n-1)/2) of the items remain
[1, 2, 4, 3, 5] -> [1, 4, 3] -> [4, 3] -> [4]
[9, 1, 1, 1, 1]
. Il mio algoritmo non è riuscito su questo input