Алгоритм сортировки выглядит так:
Пока список не отсортирован, закрепите половину всех элементов (удалите их из списка). Продолжайте, пока список не будет отсортирован или пока не останется только один элемент (который сортируется по умолчанию). Этот алгоритм сортировки может давать разные результаты в зависимости от реализации.
Процедура удаления элемента должна решаться реализацией, но список должен быть вдвое длиннее, чем раньше, после одного прохода процедуры удаления элемента. Ваш алгоритм может решить удалить либо первую половину, либо список, вторую половину списка, все нечетные элементы, все четные элементы, по одному, пока список не станет вдвое длиннее, или любой не упомянутый.
Входной список может содержать произвольное количество элементов (в пределах разумного, скажем, до 1000 элементов), а не только идеально делимые списки из 2 ^ n элементов. Вам придется либо удалить (n + 1) / 2, либо (n-1) / 2, если список нечетный, либо жестко задан, либо выбран случайным образом во время выполнения. Решите сами: что бы сделал Танос, если бы во вселенной было нечетное количество живых существ?
Список сортируется, если ни один элемент не меньше предыдущего. Дубликаты могут появляться на входе и на выходе.
Ваша программа должна получить массив целых чисел (через stdin или в качестве параметров, либо отдельные элементы, либо параметр массива) и вернуть отсортированный массив (или вывести его в stdout).
Примеры:
// 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]
может дать разные результаты:
// Removing every second item:
[1, 2, 4, 3, 5] -> [1, 4, 5]
или же:
// 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
или же:
// 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
или же:
// 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]
. Мой собственный алгоритм не удалось на этом входе