Der Sortieralgorithmus sieht folgendermaßen aus:
Wenn die Liste nicht sortiert ist, fangen Sie die Hälfte aller Elemente (entfernen Sie sie aus der Liste). Fahren Sie fort, bis die Liste sortiert ist oder nur noch ein Element vorhanden ist (standardmäßig sortiert). Dieser Sortieralgorithmus kann je nach Implementierung unterschiedliche Ergebnisse liefern.
Über das Verfahren zum Entfernen von Elementen entscheidet die Implementierung. Die Liste sollte jedoch nach einem Durchgang des Verfahrens zum Entfernen von Elementen halb so lang sein wie zuvor. Ihr Algorithmus kann entscheiden, entweder die erste Hälfte oder die Liste, die letzte Hälfte der Liste, alle ungeraden Elemente, alle geraden Elemente nacheinander zu entfernen, bis die Liste halb so lang ist, oder alle nicht erwähnten.
Die Eingabeliste kann eine beliebige Anzahl von Elementen enthalten (innerhalb des vorgegebenen Rahmens, sagen wir bis zu 1000 Elemente), nicht nur perfekt unterteilbare Listen mit 2 ^ n Elementen. Sie müssen entweder (n + 1) / 2 oder (n-1) / 2 Elemente entfernen, wenn die Liste ungerade ist, entweder fest codiert oder während der Laufzeit zufällig entschieden wird. Überlegen Sie selbst: Was würde Thanos tun, wenn das Universum eine ungerade Menge an Lebewesen enthalten würde?
Die Liste wird sortiert, wenn kein Element kleiner als ein vorheriges Element ist. Duplikate können in der Eingabe und in der Ausgabe auftreten.
Ihr Programm sollte ein Array von Ganzzahlen (über stdin oder als Parameter, entweder einzelne Elemente oder einen Array-Parameter) aufnehmen und das sortierte Array zurückgeben (oder auf stdout ausgeben).
Beispiele:
// 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]
könnte zu unterschiedlichen Ergebnissen führen:
// Removing every second item:
[1, 2, 4, 3, 5] -> [1, 4, 5]
oder:
// 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
oder:
// 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
oder:
// 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]
. Mein eigener Algorithmus ist bei diesem Eingang fehlgeschlagen