Общий и практический алгоритм сортировки быстрее, чем O (N log n)?

есть ли какой-либо практический алгоритм для общих элементов (в отличие от подсчета сортировки или сортировки ведра), который работает быстрее, чем O(N log n)?

4 ответов


многие люди упоминали теоретико-информационный Ω (N lg n), связанный с алгоритмами сортировки сравнения, которые не могут быть нарушены в сортировках сравнения. (этот предыдущий вопрос исследует, почему это так.)

тем не менее, есть некоторые типы сортов сравнения, которые, не нарушая O(N lg n) в среднем случае, можно показать, что они работают быстрее на входах, которые уже в некоторой степени предустановлены. Например, smoothsort Dijkstra работает в O (n) на уже отсортированном входы с O (n lg n) в худшем случае. Один из моих любимых сортов, декартово дерево рода, доказуемо использует оптимальное преимущество пресортеднесс в немного метрик. Например, он может сортировать любую последовательность с постоянным числом возрастающих или убывающих подпоследовательностей во времени O(n), в худшем случае деградируя до O (N lg n).

по вопросу о сортах без сравнения есть некоторые известные, но сложные алгоритмы сортировки для целых чисел, которые превосходят O (n lg n) bynp делать хитрые трюки с манипуляциями. Самый известный алгоритм целочисленной сортировки-рандомизированный алгоритм, который может сортировать в O(n √lg lg n), в то время как самый быстрый детерминированный алгоритм целочисленной сортировки выполняется в O (N lg lg n). Возможно, вы слышали, что сортировка radix работает в O(n), хотя технически это O(n lg U), где U-самое большое значение в массиве для сортировки.

короче говоря, нет, вы не можете сделать намного лучше, чем O (N lg n), но вы можете сделать немного лучше, если вы знаете что-то о ваш вклад.


для общих элементов, которые вы можете только сравнить и не получить доступ к внутренним, невозможно иметь алгоритм сортировки быстрее, чем тета(N log n). Это потому, что есть N! (N факториал) возможные порядки элементов, и вам нужно тета (N log n) сравнения, чтобы отличить их все.


на сколько элементов? Даже если это что-то вроде N1.2, сортировка оболочки-Метцнера часто быстрее, чем большинство других, до нескольких тысяч элементов (или около того).

Это также зависит от того, что вы подразумеваете под "родовой" и "практический". Сортировка radix может бить O (N log n), и она работает для довольно широкого спектра данных (но определенно не для всего).

Если ваша идея практического и общего ограничивает алгоритм тем, что непосредственно сравнивает элементы, то нет -- ничто не делает (или никогда не может) быть лучше, чем O (N log n). Это уже давно доказано.


нет. Это одна из немногих строгих минимальных оценок для алгоритмов, которые у нас есть. Для коллекции из n элементов, существует N! разные заказы, поэтому для указания данного заказа нам нужен log (n!) биты. По приближению Стирлинга это примерно N log n. Для каждого сравнения мы делаем между элементами, мы получаем по существу один бит информации (игнорируя возможность равных элементов).