Eu deveria classificar uma lista de números, mas sou super preguiçosa. É realmente difícil descobrir como trocar todos os números até que todos estejam em ordem crescente, então criei meu próprio algoritmo que garantirá que a nova lista seja classificada¹. Veja como funciona:
Para uma lista do tamanho N , precisaremos de iterações N-1 . Em cada iteração,
Verifique se o número N é o menor que o número N + 1 . Se for, esses dois números já estão classificados e podemos pular essa iteração.
Se não estiverem, será necessário decrementar continuamente os primeiros N números até que esses dois números estejam em ordem.
Vamos dar um exemplo concreto. Digamos que a entrada foi
10 5 7 6 1
Na primeira iteração, compararemos 10 e 5. 10 é maior que 5, portanto, a diminuímos até que seja menor:
4 5 7 6 1
Agora, comparamos 5 e 7. 5 é menor que 7, portanto, não precisamos fazer nada nessa iteração. Então, vamos para a próxima e comparamos 7 e 6. 7 é maior que 6, então diminuímos os três primeiros números até que seja menor que 6 e obtemos o seguinte:
2 3 5 6 1
Agora, comparamos 6 e 1. Novamente, 6 é maior que 1, então diminuímos os quatro primeiros números até que seja menor que 1 e obtemos o seguinte:
-4 -3 -1 0 1
E nós terminamos! Agora nossa lista está em perfeita ordem de classificação. E, para tornar as coisas ainda melhores, tivemos apenas que percorrer a lista N-1 vezes, então esse algoritmo classifica as listas em tempo O (N-1) , o que tenho certeza de que é o algoritmo mais rápido que existe.²
Seu desafio hoje é implementar esse Lazy Sort. Seu programa ou função receberá uma matriz de números inteiros no formato padrão que você desejar, e você deverá executar essa classificação lenta e retornar a nova lista "classificada" . A matriz nunca estará vazia ou conterá números não inteiros.
aqui estão alguns exemplos:
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 sempre, isso é código-golfe , então escreva o programa mais curto possível!
¹ Isso não significa o que parece, mas é tecnicamente verdade
² Estou completamente brincando, por favor, não me odeie
<sarcasm>
Na verdade, esse algoritmo de classificação ainda se destaca na O(N^2)
complexidade do tempo, porque você precisa passar por todos os itens acessados anteriormente na lista para diminuí-los. Eu recomendo ir através da lista para trás em vez e diminuir apenas um número por etapa conforme necessário. Isso lhe dará verdadeira O(N)
complexidade! </sarcasm>
O(n^2)
em termos de acessos à memória, mas não é O(n)
para comparações?
O(N^2)
.