Dovrei ordinare un elenco di numeri, ma sono super pigro. È davvero difficile capire come scambiare tutti i numeri fino a quando non sono tutti in ordine crescente, quindi ho trovato il mio algoritmo che garantirà che il nuovo elenco sia ordinato¹. Ecco come funziona:
Per un elenco di dimensioni N , avremo bisogno di iterazioni N-1 . Ad ogni iterazione,
Controlla se l'ennesimo numero è più piccolo dell'N + 1º numero. In tal caso, questi due numeri sono già ordinati e possiamo saltare questa iterazione.
In caso contrario, è necessario ridurre continuamente i primi N numeri fino a quando questi due numeri non sono in ordine.
Facciamo un esempio concreto. Diciamo che l'input è stato
10 5 7 6 1
Nella prima iterazione, confronteremo 10 e 5. 10 è maggiore di 5, quindi lo diminuiamo fino a quando non è più piccolo:
4 5 7 6 1
Ora confrontiamo 5 e 7. 5 è più piccolo di 7, quindi non abbiamo bisogno di fare nulla su questa iterazione. Quindi andiamo al prossimo e confrontiamo 7 e 6. 7 è più grande di 6, quindi diminuiamo i primi tre numeri fino a quando è più piccolo di 6, e otteniamo questo:
2 3 5 6 1
Ora confrontiamo 6 e 1. Ancora una volta, 6 è più grande di 1, quindi diminuiamo i primi quattro numeri fino a quando è più piccolo di 1, e otteniamo questo:
-4 -3 -1 0 1
E abbiamo finito! Ora la nostra lista è in perfetto ordine. E, per rendere le cose ancora migliori, abbiamo dovuto solo scorrere l'elenco N-1 volte, quindi questo algoritmo ordina gli elenchi in O (N-1) tempo, che sono abbastanza sicuro che sia l'algoritmo più veloce che ci sia.
La tua sfida per oggi è implementare questo Lazy Sort. Al programma o alla funzione verrà assegnato un array di numeri interi in qualsiasi formato standard desiderato e sarà necessario eseguire questo ordinamento lento e restituire il nuovo elenco "ordinato" . L'array non sarà mai vuoto o conterrà numeri non interi.
Ecco alcuni esempi:
Input: 10 5 7 6 1
Output: -4 -3 -1 0 1
Input: 3 2 1
Output: -1 0 1
Input: 1 2 3
Output: 1 2 3
Input: 19
Output: 19
Input: 1 1 1 1 1 1 1 1 1
Output: -7 -6 -5 -4 -3 -2 -1 0 1
Input: 5 7 11 6 16 2 9 16 6 16
Output: -27 -25 -21 -20 -10 -9 -2 5 6 16
Input: -8 17 9 7
Output: -20 5 6 7
Come sempre, questo è code-golf , quindi scrivi il programma più corto che puoi!
¹ Ciò non significa che cosa significhi, ma è tecnicamente vero
² Sto scherzando completamente, per favore non odiarmi
<sarcasm>
Questo algoritmo di ordinamento in realtà continua a registrare una O(N^2)
complessità temporale perché è necessario esaminare tutti gli elementi precedentemente consultati nell'elenco per ridurli. Consiglio invece di scorrere l'elenco indietro e di diminuire solo un numero per passaggio, se necessario. Questo ti darà vera O(N)
complessità! </sarcasm>
O(n^2)
in termini di accessi alla memoria, ma non è O(n)
per i confronti?
O(N^2)
.