Я пока не совсем доволен принятым ответом. Поэтому я повторяю ответ:
Возможно ли теоретически отсортировать массив из n целых чисел по амортизированной сложности O (n)?
Ответ на этот вопрос зависит от машины, которая будет выполнять алгоритм сортировки. Если у вас есть машина произвольного доступа, которая может работать ровно с 1 битом, вы можете выполнить radix sort для целых чисел с максимум k
битами, что уже было предложено. Таким образом, вы в конечном итоге со сложностью O(kn)
.
Но если вы работаете на словесном аппарате фиксированного размера с размером слова не менее k
бит (что и для всех потребительских компьютеров), лучшее, что вы можете достичь - это O(n log n)
. Это потому, что либо log n < k
, либо вы можете сначала выполнить count sort , а затем выполнить сортировку с помощью алгоритма O (n log n)
, который также даст первый случай.
А как насчет попытки создать наихудший вариант сложности O (n)?
Это невозможно. Ссылка уже была дана. Идея доказательства состоит в том, что для того, чтобы иметь возможность сортировки, вы должны решить для каждого элемента быть отсортированным, будет ли он больше или меньше любого другого элемента для сортировки. Используя транзитивность, это можно представить в виде дерева решений, которое в лучшем случае имеет n
узлов и log n
глубину. Поэтому, если вы хотите иметь производительность лучше, чем Ω(n log n)
, это означает удаление ребер из этого дерева решений. Но если дерево решений не является полным, как вы можете убедиться, что приняли правильное решение по некоторым элементам a
и b
?
Можете ли вы без ограничений использовать память создать такой алгоритм?
Так как сверху, это невозможно. И поэтому оставшиеся вопросы не имеют отношения к делу.