Se supone que debo ordenar una lista de números, pero soy muy vago. Es realmente difícil imaginar cómo intercambiar todos los números hasta que todos estén en orden creciente, por lo que se me ocurrió mi propio algoritmo que garantizará que la nueva lista esté ordenada¹. Así es como funciona:
Para una lista de tamaño N , necesitaremos iteraciones N-1 . En cada iteración,
Compruebe si el número N es el más pequeño que el número N + 1 . Si es así, estos dos números ya están ordenados y podemos omitir esta iteración.
Si no lo están, debe disminuir continuamente los primeros N números hasta que estos dos números estén en orden.
Tomemos un ejemplo concreto. Digamos que la entrada fue
10 5 7 6 1
En la primera iteración, compararemos 10 y 5. 10 es mayor que 5, por lo que lo disminuimos hasta que sea más pequeño:
4 5 7 6 1
Ahora comparamos 5 y 7. 5 es más pequeño que 7, por lo que no necesitamos hacer nada en esta iteración. Así que vamos al siguiente y comparamos 7 y 6. 7 es mayor que 6, por lo que disminuimos los primeros tres números hasta que sea menor que 6, y obtenemos esto:
2 3 5 6 1
Ahora comparamos 6 y 1. Nuevamente, 6 es mayor que 1, por lo que disminuimos los primeros cuatro números hasta que sea menor que 1, y obtenemos esto:
-4 -3 -1 0 1
¡Y hemos terminado! Ahora nuestra lista está en perfecto orden. Y, para mejorar aún más las cosas, solo tuvimos que recorrer la lista N-1 veces, por lo que este algoritmo ordena las listas en el tiempo O (N-1) , lo cual estoy bastante seguro de que es el algoritmo más rápido que existe.²
Su desafío para hoy es implementar este Lazy Sort. Su programa o función recibirá una serie de enteros en el formato estándar que desee, y debe realizar esta clasificación diferida y devolver la nueva lista "ordenada" . La matriz nunca estará vacía o contendrá no enteros.
Aquí hay unos ejemplos:
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
Como siempre, este es el código de golf , ¡así que escribe el programa más corto que puedas!
¹ Esto no significa lo que parece, pero es técnicamente cierto
² Estoy completamente bromeando, por favor no me odies
<sarcasm>
En realidad, este algoritmo de clasificación sigue O(N^2)
registrando complejidad en el tiempo porque tiene que pasar por todos los elementos a los que se accedió anteriormente en la lista para disminuirlos. Recomiendo revisar la lista al revés y disminuir solo un número por paso según sea necesario. ¡Esto te dará verdadera O(N)
complejidad! </sarcasm>
O(n^2)
en términos de accesos a la memoria, pero ¿no es O(n)
para hacer comparaciones?
O(N^2)
.