Bogosort (от амер. комп. жарг. bogus — неработоспособный, нефункциональный, бесполезный) — неэффективный алгоритм сортировки, используемый только в образовательных целях и противопоставляемый другим, более реалистичным алгоритмам. Bogosort является частным случаем алгоритма Лас-Вегас.
Bogosort | |
---|---|
| |
Предназначение | Алгоритм сортировки |
Худшее время | Не определено в случае случайного алгоритма, в случае детерминированного алгоритма |
Лучшее время | [1] |
Среднее время | [1] |
Затраты памяти |
Существуют две версии этого алгоритма: детерминированная версия, которая перебирает все перестановки до тех пор, пока не будет получен отсортированный массив[2][3], и случайная версия, которая случайным образом переставляет свои входные данные.
Если этот алгоритм использовать для сортировки колоды карт, то сначала в нём нужно проверить, лежат ли все карты по порядку, и если не лежат, то случайным образом перемешать её, проверить лежат ли теперь все карты по порядку, и повторять процесс, пока не отсортируется колода.
Среднее время работы алгоритма:
Пример реализации
правитьДалее приведена реализация такого алгоритма на языке C++, причём такая реализация является примером недетерминированного (случайного) алгоритма:
#include <utility>
bool correct(int *arr, int size) {
while (--size > 0)
if (arr[size - 1] > arr[size])
return false;
return true;
}
void shuffle(int *arr, int size) {
for (int i = 0; i < size; ++i)
std::swap(arr[i], arr[(rand() % size)]);
}
void bogoSort(int *arr, int size) {
while (!correct(arr, size))
shuffle(arr, size);
}
Производительность
править
При прохождении цикла один раз в секунду сортировка в среднем может занять:
|
При работе 4-ядерного процессора на частоте 2,4 ГГц (9,6 млрд операций в секунду):
Таким образом, колода в 32 карты будет сортироваться этим компьютером в среднем 2,7⋅1019 лет. |
См. также
правитьПримечания
править- ↑ 1 2 Gruber, H.; Holzer, M.; Ruepp, O., "Sorting the slow way: an analysis of perversely awful randomized sorting algorithms", 4th International Conference on Fun with Algorithms, Castiglioncello, Italy, 2007 (PDF), Lecture Notes in Computer Science, vol. 4475, Springer-Verlag, pp. 183—197, doi:10.1007/978-3-540-72914-3_17.
- ↑ Kiselyov, Oleg; Shan, Chung-chieh; Friedman, Daniel P.; Sabry, Amr (2005), "Backtracking, interleaving, and terminating monad transformers: (functional pearl)", Proceedings of the Tenth ACM SIGPLAN International Conference on Functional Programming (ICFP '05) (PDF), SIGPLAN Notices, pp. 192—203, doi:10.1145/1086365.1086390, S2CID 1435535, Архивировано из оригинала (PDF) 26 марта 2012, Дата обращения: 22 июня 2011
- ↑ Naish, Lee (1986), "Negation and quantifiers in NU-Prolog", Proceedings of the Third International Conference on Logic Programming, Lecture Notes in Computer Science, vol. 225, Springer-Verlag, pp. 624—634, doi:10.1007/3-540-16492-8_111.
В статье не хватает ссылок на источники (см. рекомендации по поиску). |
Ссылки
править- Bogosort / Jargon File (англ.)
- Max Sherman Bogo-sort is Sort of Slow, June 2013 (англ.)
- Hermann Gruber, Markus Holzer, and Oliver Ruepp, Sorting the Slow Way: An Analysis of Perversely Awful Randomized Sorting Algorithms, 2007. (англ.)
- Rahul Agrawal, https://www.geeksforgeeks.org/bogosort-permutation-sort/ (англ.)
- Непрактичные сортировки — бессмысленные и беспощадные / valemak, 18 октября 2013