Мои коллеги вернули меня во время моих университетских дней с обсуждением алгоритмов сортировки сегодня утром. Мы вспомнили о наших избранных, таких как StupidSort , и один из нас был уверен, что мы видели алгоритм сортировки, который был O(n!)
. Это заставило меня начать искать "худшие" алгоритмы сортировки, которые я мог найти.
Мы постулировали, что совершенно случайная сортировка была бы довольно плохой (то есть рандомизировать элементы - по порядку? Нет? Снова рандомизировать), и я оглянулся и обнаружил, что она, очевидно, называется BogoSort, или Monkey Sort, или иногда просто Random Sort ,
Сортировка обезьяны имеет худшую производительность O(∞)
, лучшую производительность O(n)
и среднюю производительность O(n·n!)
.
Каков в настоящее время официально принятый алгоритм сортировки с худшей средней производительностью сортировки (и, следовательно, хуже, чем O(n·n!)
)?
Ответы:
Со страницы Эзотерических Алгоритмов Дэвида Морган-Мара : Интеллектуальный Сортировка Проекта
источник
void quantum_sort (void *b, size_t n, size_t s, int (*c)(const void *, const void*)) { if (rand () % 2) qsort (b, n, s, c); }
."This is the best of all posibble worlds because it is the world that is, and so in the best possible world the array would already be sorted!"
Много лет назад я изобрел (но никогда не реализовывал) MiracleSort.
В конце концов, альфа-частицы, переворачивающие биты в микросхемах памяти, должны привести к успешной сортировке.
Для большей надежности скопируйте массив в экранированную папку и сравните потенциально отсортированные массивы с оригиналом.
Так как же проверить потенциально отсортированный массив по сравнению с оригиналом? Вы просто сортируете каждый массив и проверяете, совпадают ли они. MiracleSort - это очевидный алгоритм для использования на этом этапе.
РЕДАКТИРОВАТЬ: Строго говоря, это не алгоритм, так как это не гарантирует завершение. «Алгоритм» не квалифицируется как «худший алгоритм»?
источник
O(2^N)
?Квантовый Богосорт
Алгоритм сортировки, который предполагает правильность многомерной интерпретации квантовой механики:
По завершении алгоритма список будет отсортирован в единственной оставшейся вселенной. Этот алгоритм требует времени O (N) для наихудшего случая и времени O (1) для среднего случая. Фактически, среднее число выполненных сравнений равно 2: есть вероятность 50%, что вселенная будет уничтожена на втором элементе, вероятность 25%, что она будет уничтожена на третьем, и так далее.
источник
Я удивлен, что никто еще не упомянул о сне ... Или я этого не заметил? Тем не мение:
пример использования:
С точки зрения производительности это ужасно (особенно второй пример). Ждать почти 3,5 месяца, чтобы отсортировать 2 числа, это довольно плохо.
источник
O(N)
рода, но на самом деле ограничено тем, как ОС реализует таймеры.sleep "$1"
кsleep "0.$(printf "%010d" $1)"
производительности для улучшения заметно.time ./sleepsort.sh 8864569 7
затем запускается в 0,009 с на моем ноутбуке.Сортировка звона, как описано здесь .
Вы передаете каждое значение в своем списке другому ребенку на Рождество. Дети, будучи ужасными людьми, будут сравнивать ценность своих даров и соответственно сортировать себя.
источник
У меня был лектор, который однажды предложил создать случайный массив, проверить, был ли он отсортирован, а затем проверить, совпадают ли данные с массивом, который нужно отсортировать.
Лучший случай O (N) (первый раз, детка!) Худший случай O (Никогда)
источник
Если вы сохраняете алгоритм осмысленным в любом случае,
O(n!)
это худшая верхняя граница, которую вы можете достичь.Поскольку проверка каждой возможности для перестановок набора, который будет отсортирован, будет предпринимать
n!
шаги, хуже не будет.Если вы делаете больше шагов, чем этот, тогда алгоритм не имеет реальной полезной цели. Не говоря уже о следующем простом алгоритме сортировки
O(infinity)
:источник
Bogobogosort. Да, это вещь. Богобогосорт, вы Богосорт первый элемент. Проверьте, отсортирован ли этот элемент. Будучи одним элементом, это будет. Затем вы добавляете второй элемент, и Bogosort эти два, пока он не отсортирован. Затем вы добавляете еще один элемент, затем Bogosort. Продолжайте добавлять элементы и Bogosorting, пока вы, наконец, не сделаете каждый элемент. Это было разработано, чтобы никогда не преуспеть с каким-либо значительным списком до тепловой смерти вселенной.
источник
Вы должны сделать некоторые исследования в захватывающей области пессимальных алгоритмов и анализа симплексности . Эти авторы работают над проблемой разработки сортировки с пессимальным лучшим случаем (лучший случай вашей богосорты - Омега (n), в то время как медленная сортировка (см. Статью) имеет неполиномиальную сложность времени лучшего случая).
источник
Существует разновидность, которая называется богобогосорт. Сначала он проверяет первые 2 элемента и сортирует их. Затем он проверяет первые 3, bogosorts их, и так далее.
Если список в любой момент выходит из строя, он перезапускается путем повторной сортировки первых 2. Обычный богосорт имеет среднюю сложность
O(N!)
, этот алгоритм имеет среднюю сложностьO(N!1!2!3!...N!)
Редактировать : чтобы дать вам представление о том, насколько велико это число, для
20
элементов этот алгоритм занимает в среднем3.930093*10^158
годы , значительно превышая предполагаемую тепловую смерть вселенной (если это произойдет)10^100
лет ,тогда как сортировка слиянием занимает около
.0000004
секунд , пузырьковая сортировка.0000016
секунд , а bogosort -308
годы ,139
дни ,19
часы ,35
минуты ,22.306
секунды , при условии, что год равен 365,242 дням, а компьютер выполняет 250 000 000 32-битных целочисленных операций в секунду.Edit2 : этот алгоритм не такой медленный, как «алгоритм» чудо-сортировки, которая, вероятно, подобно этому виду, засунет компьютер в черную дыру, прежде чем он успешно отсортирует 20 элементов, но если это произойдет, я бы оценил среднюю сложность от
2^(32(the number of bits in a 32 bit integer)*N)(the number of elements)*(a number <=10^40)
лет ,поскольку гравитация ускоряет движение альфа-фишек, и существует 2 ^ N состояний, что составляет
2^640*10^40
или около5.783*10^216.762162762
года , хотя, если бы список начинался отсортированным, его сложность была бы толькоO(N)
быстрее, чем сортировка слиянием, которая составляет только N log N даже в худшем случае.Edit3 : этот алгоритм на самом деле медленнее, чем чудо-сортировка, так как размер становится очень большим, скажем 1000, так как мой алгоритм будет иметь время выполнения
2.83*10^1175546
лет , а алгоритм чудо-сортировки будет иметь1.156*10^9657
годы работы .источник
Вот 2 вида, которые я придумал со своим соседом по комнате в колледже
1) Проверить порядок 2) Может быть, случилось чудо, перейти к 1
и
1) проверить, в порядке ли он, если нет 2) поместить каждый элемент в пакет и вернуть его себе на удаленный сервер. Некоторые из этих пакетов будут возвращаться в другом порядке, поэтому перейдите к 1
источник
Всегда есть Богобогосорт (Bogoception!). Он выполняет Bogosort для все более больших подмножеств списка, а затем запускается заново, если список никогда не сортируется.
источник
1 Поместите свои предметы для сортировки на учетные карточки.
2 Бросьте их в воздух в ветреный день, в миле от вашего дома.2 Бросьте их в костер и убедитесь, что они полностью уничтожены.
3 Проверьте ваш кухонный пол на правильность заказа.
4 Повторите, если это не правильный порядок.
Лучший вариант сценария - O (∞)
Отредактируйте выше, основываясь на проницательных наблюдениях KennyTM.
источник
"Что бы вы хотели, чтобы это было?" Сортировать
Мало того, что он может реализовать любое мыслимое значение O (x), кроме бесконечности, время, которое доказуемо корректно (если вы можете ждать так долго).
источник
Ничто не может быть хуже бесконечности.
источник
Бозо-сортировка - это связанный алгоритм, который проверяет, отсортирован ли список, и, если нет, меняет два элемента наугад. У него такие же лучшие и худшие показатели, но я бы интуитивно ожидал, что средний случай будет длиннее, чем у Bogosort. Трудно найти (или получить) какие-либо данные о производительности этого алгоритма.
источник
Сегменты π
Предположим, что π содержит все возможные комбинации конечных чисел. Смотрите вопрос math.stackexchange
источник
Производительность O (∞) в худшем случае может даже не сделать его алгоритмом, согласно некоторым .
Алгоритм - это просто последовательность шагов, и вы всегда можете сделать хуже, если немного его настроить, чтобы получить желаемый результат в большем количестве шагов, чем раньше. Можно целенаправленно определить количество шагов, предпринятых в алгоритме, заставить его завершиться и получить правильный результат только после того, как
X
количество шагов было выполнено. ЭтоX
вполне может быть порядка O (n 2 ) или O (n n! ) Или любого другого алгоритма. Это эффективно увеличит как его лучшие, так и средние оценки.Но ваш худший сценарий не может быть превзойден :)
источник
Мой любимый алгоритм медленной сортировки - сортировка марионеток:
В худшем случае сложность такова
O(n^(log(3) / log(1.5))) = O(n^2.7095...)
.Другой алгоритм медленной сортировки фактически называется медленной сортировкой!
Это
O(n ^ (log n))
в лучшем случае ... даже медленнее, чем стогесорт.источник
источник
Эта страница интересна для чтения по этой теме: http://home.tiac.net/~cri_d/cri/2001/badsort.html.
Мой личный фаворит - глупая сортировка Тома Даффа:
источник
Двойной богосорт
Bogosort дважды и сравните результаты (просто чтобы убедиться, что они отсортированы), если не сделать это снова
источник
Вы можете замедлить любой алгоритм сортировки, выполнив шаг «отсортировано» случайным образом. Что-то вроде:
источник
Да, SimpleSort, в теории он работает,
O(-1)
однако это эквивалентно тому,O(...9999)
что, в свою очередь, эквивалентно O (∞ - 1), что, как это происходит, также эквивалентно O (∞). Вот мой пример реализации:источник
Одна из них, над которой я только что работал, включает в себя выбор двух случайных точек, и, если они находятся в неправильном порядке, полностью изменяет поддиапазон между ними. Я нашел алгоритм на http://richardhartersworld.com/cri_d/cri/2001/badsort.html , который говорит, что средний случай, вероятно, где-то около O (n ^ 3) или O (n ^ 2 log n) ( он не совсем уверен)
Я думаю, что было бы возможно сделать это более эффективно, потому что я думаю, что было бы возможно сделать операцию обращения за время O (1).
На самом деле, я только что понял, что это сделало бы все, что я скажу, может быть, потому что я только что понял, что структура данных, которую я имел в виду, поставит доступ к случайным элементам в O (log n) и определит, нужно ли обращать в O (n) ).
источник
Randomsubsetsort.
Учитывая массив из n элементов, выберите каждый элемент с вероятностью 1 / n, рандомизируйте эти элементы и проверьте, отсортирован ли массив. Повторите, пока не отсортировано.
Ожидаемое время оставлено в качестве упражнения для читателя.
источник