Общий и практичный алгоритм сортировки быстрее, чем O (n log n)? - PullRequest
8 голосов
/ 11 февраля 2011

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

Ответы [ 4 ]

23 голосов
/ 11 февраля 2011

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

Однако, есть некоторые типы сортировок сравнения, которые, не нарушая O (n lg n) в среднем случае, могут бытьпоказано, что работает быстрее на входах, которые уже предварительно отсортированы в некоторой степени.Например, сглаживающая сортировка Дейкстры выполняется в 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).Возможно, вы слышали, что радикальная сортировка работает в O (n), хотя технически это O (n lg U), где U - наибольшее значение в массиве для сортировки.

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

3 голосов
/ 11 февраля 2011

За сколько элементов? Даже если это что-то вроде N 1.2 , сортировка Shell-Metzner часто выполняется быстрее, чем большинство других, до нескольких тысяч элементов (или около того).

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

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

3 голосов
/ 11 февраля 2011

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

2 голосов
/ 11 февраля 2011

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

...