какие алгоритмы сортировки дают почти / приблизительную сортировку раньше? - PullRequest
12 голосов
/ 27 мая 2009

Какие алгоритмы сортировки производят промежуточные порядки, которые являются хорошими приближениями?

Под «хорошим приближением» я подразумеваю в соответствии с такими показателями, как тау Кендалла и методику Спирмена, для определения того, насколько «далек» упорядоченный список от другого (в данном случае точной сортировки)

Конкретное приложение, которое я имею в виду, - это когда люди проводят субъективное попарное сравнение и, возможно, не смогут выполнить все n log n сравнений, требуемых, скажем, heapsort или quicksort наилучшего случая.

Какие алгоритмы лучше, чем другие, быстрее приводят список к приблизительной / приблизительной сортировке?

Ответы [ 6 ]

8 голосов
/ 27 мая 2009

Возможно, вы захотите проверить алгоритм сортировки оболочки.

AFAIK - это единственный алгоритм, который вы можете использовать с субъективным сравнением (то есть у вас не будет никаких подсказок о медианных значениях или около того), которое будет приближаться к правильной сортировке при каждом проходе.

Вот еще немного информации http://en.wikipedia.org/wiki/Shell_sort

3 голосов
/ 27 мая 2009

Я бы предложил некоторую версию быстрой сортировки. Если вы знаете, в каком диапазоне находятся данные, которые вы хотите отсортировать, вы можете грамотно выбрать сводные элементы и, возможно, разделить проблему на более чем две части одновременно.

2 голосов
/ 27 мая 2009

Как насчет радикальной сортировки слева направо и остановки бита преждевременно (без каламбура)?

это будет время выполнения Nb, где b - это количество битов, которые вы решили проверить. чем больше битов вы изучите, тем больше будет отсортировано

несортированный:
5 0101
8 1000
4 0100
13 1101
1 0001

через 1 бит (N):
5 0101
1 0001
4 0100
13 1101
8 1000

через 2 бита (2N)
1 0001
5 0101
4 0100
8 1000
13 1101

и так далее ...

1 голос
/ 27 мая 2009

Мой совершенно ненаучный и визуальный обзор сортов на этой странице показывает, что "Comb Sort" выглядит хорошо. Кажется, с каждым проходом все лучше приближается.

0 голосов
/ 07 февраля 2011

Я разработал алгоритм сортировки NlgN, который я назвал «турнирной сортировкой» некоторое время назад, который находит выходные элементы по порядку (то есть начинается с поиска первого элемента, затем он находит второй элемент и т. Д.). Я не уверен, что это вполне практично, поскольку накладные расходы на ведение бухгалтерского учета превышают затраты на быструю сортировку, сортировку слиянием и т. Д., Но при сравнении с 1 000 000 случайных элементов счетчик сравнения фактически оказался ниже стандартной реализации быстрой сортировки библиотеки (хотя я уверен, как это будет с новыми).

Для целей моего алгоритма "оценка" каждого элемента - это количество элементов, которое, как известно, лучше. Первоначально каждый элемент имеет оценку 0. Когда сравниваются два элемента, лучший элемент добавляет к его оценке оценку другого элемента плюс один. Чтобы запустить алгоритм, объявите все элементы как «подходящие», и, пока остается более одного приемлемого элемента, сравните два приемлемых элемента с наименьшим количеством баллов и сделайте проигравшего «неприемлемым». После того, как все предметы, кроме одного, были объявлены непригодными, выведите один оставшийся предмет, а затем объявите приемлемым все предметы, которые этот предмет «побил».

Очередь приоритетов, необходимая для сравнения двух элементов с наименьшей оценкой, представляет собой несколько раздражающий уровень накладных расходов на бухгалтерию, но если бы кто-то сортировал вещи, которые стоило сравнить, алгоритм мог бы быть интересным.

0 голосов
/ 27 мая 2009

Пузырь, я считаю. Преимущество заключается в том, что вы можете постепенно улучшать порядок с помощью дополнительной обработки данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...