Algorytm sortowania wygląda następująco:
Gdy lista nie jest posortowana, przyciągnij połowę wszystkich elementów (usuń je z listy). Kontynuuj, aż lista zostanie posortowana lub pozostanie tylko jeden element (który jest domyślnie sortowany). Ten algorytm sortowania może dawać różne wyniki w zależności od implementacji.
Decyzja o usunięciu elementu zależy od wdrożenia, ale lista powinna być o połowę krótsza niż przed pierwszym przejściem procedury usuwania elementu. Twój algorytm może zdecydować o usunięciu pierwszej połowy lub listy, ostatniej połowy listy, wszystkich nieparzystych pozycji, wszystkich parzystych pozycji, pojedynczo, aż lista będzie o połowę krótsza, lub dowolnych niewymienionych.
Lista wejściowa może zawierać dowolną liczbę elementów (w granicach rozsądku, powiedzmy do 1000 pozycji), a nie tylko doskonale podzielne listy 2 ^ n elementów. Będziesz musiał usunąć elementy (n + 1) / 2 lub (n-1) / 2, jeśli lista jest nieparzysta, albo zakodowana, albo losowo wybierana podczas uruchamiania. Zdecyduj sam: co zrobiłby Thanos, gdyby wszechświat zawierał dziwną liczbę żywych istot?
Lista jest sortowana, jeśli żaden element nie jest mniejszy niż jakikolwiek poprzedni element. Duplikaty mogą wystąpić na wejściu i mogą wystąpić na wyjściu.
Twój program powinien pobrać tablicę liczb całkowitych (poprzez standardowe lub jako parametry, albo pojedyncze elementy, albo parametr tablicy) i zwrócić posortowaną tablicę (lub wydrukować ją na standardowe wyjście).
Przykłady:
// 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]
może dać różne wyniki:
// Removing every second item:
[1, 2, 4, 3, 5] -> [1, 4, 5]
lub:
// 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
lub:
// 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
lub:
// 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]
. Mój własny algorytm zawiódł na tym wejściu