L'algorithme de tri va comme ceci:
Tant que la liste n'est pas triée, alignez la moitié des éléments (supprimez-les de la liste). Continuez jusqu'à ce que la liste soit triée ou qu'il ne reste qu'un élément (trié par défaut). Cet algorithme de tri peut donner des résultats différents en fonction de la mise en œuvre.
La procédure de suppression d’élément est laissée à l’implémentation, mais la liste doit être deux fois moins longue qu’avant la fin de la procédure de suppression d’élément. Votre algorithme peut décider de supprimer la première moitié ou la liste, la dernière moitié de la liste, tous les éléments impairs, tous les éléments pairs, un à la fois jusqu'à ce que la liste soit deux fois moins longue, ou tout élément non mentionné.
La liste d'entrées peut contenir un nombre d'éléments arbitraire (dans des limites raisonnables, disons jusqu'à 1000 éléments), pas seulement des listes parfaitement divisibles de 2 ^ n éléments. Vous devrez supprimer (n + 1) / 2 ou (n-1) / 2 éléments si la liste est impaire, codée en dur ou décidée de manière aléatoire au cours de l'exécution. Décidez vous-même: que ferait Thanos si l'univers contenait une quantité étrange de créatures vivantes?
La liste est triée si aucun élément n'est plus petit qu'un élément précédent. Des doublons peuvent apparaître dans l’entrée et dans la sortie.
Votre programme doit prendre un tableau d’entiers (via stdin ou en tant que paramètres, soit des éléments individuels, soit un paramètre de tableau), et renvoyer le tableau trié (ou l’imprimer sur stdout).
Exemples:
// 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]
pourrait donner des résultats différents:
// Removing every second item:
[1, 2, 4, 3, 5] -> [1, 4, 5]
ou:
// 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
ou:
// 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
ou:
// 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]
. Mon propre algorithme a échoué sur cette entrée