Je suis censé trier une liste de chiffres, mais je suis super paresseux. Il est très difficile de trouver comment échanger tous les nombres jusqu'à ce qu'ils soient tous dans un ordre croissant. J'ai donc créé mon propre algorithme qui garantira que la nouvelle liste sera triée¹. Voici comment cela fonctionne:
Pour une liste de taille N , nous aurons besoin de N-1 itérations. A chaque itération,
Vérifiez si le nième nombre est plus petit que le n + lième nombre. Si tel est le cas, ces deux nombres sont déjà triés et nous pouvons ignorer cette itération.
S'ils ne le sont pas, vous devez continuellement décrémenter les N premiers nombres jusqu'à ce que ces deux nombres soient en ordre.
Prenons un exemple concret. Disons que l'entrée était
10 5 7 6 1
Lors de la première itération, nous comparerons 10 et 5. 10 étant supérieur à 5, nous le décrémentons jusqu'à ce qu'il soit plus petit:
4 5 7 6 1
Nous comparons maintenant 5 et 7. 5 est inférieur à 7, nous n'avons donc rien à faire avec cette itération. Nous allons donc au suivant et comparons 7 et 6. 7 est supérieur à 6, nous décrémentons donc les trois premiers nombres jusqu'à ce qu'il soit inférieur à 6, et nous obtenons ceci:
2 3 5 6 1
Maintenant nous comparons 6 et 1. Encore une fois, 6 est supérieur à 1, nous décrémentons donc les quatre premiers nombres jusqu'à ce qu'il soit inférieur à 1, et nous obtenons ceci:
-4 -3 -1 0 1
Et nous avons fini! Maintenant, notre liste est en parfait ordre de tri. Et, pour améliorer encore les choses, il nous suffisait de parcourir la liste N-1 fois. Cet algorithme trie donc les listes en un temps O (N-1) , ce qui, j'en suis presque sûr, est l'algorithme le plus rapide qui soit.²
Votre défi pour aujourd'hui est de mettre en œuvre ce tri paresseux. Votre programme ou fonction recevra un tableau d’entiers dans le format standard de votre choix. Vous devez effectuer ce tri paresseux et renvoyer la nouvelle liste "triés" . Le tableau ne sera jamais vide ou ne contiendra pas des entiers.
Voici quelques exemples:
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
Comme toujours, c'est du code-golf , alors écrivez le programme le plus court possible!
¹ Cela ne veut pas dire à quoi ça ressemble, mais c'est techniquement vrai
² Je plaisante complètement, s'il vous plaît ne me déteste pas
<sarcasm>
En réalité, cet algorithme de tri est toujours O(N^2)
complexe, car vous devez parcourir tous les éléments de la liste auxquels vous avez déjà accédé pour les décrémenter. Je recommande de parcourir la liste à l' envers et de ne décrémenter qu'un nombre par étape si nécessaire. Cela vous donnera une vraie O(N)
complexité! </sarcasm>
O(n^2)
en termes d'accès mémoire, mais n'est-ce pas O(n)
pour les comparaisons?
O(N^2)
.