Bogosort

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Bogosort
Демонстрация принципа работы (детерминированного) алгоритма Bogosort: он перебирает все возможные комбинации, пока массив не будет отсортирован.
Демонстрация принципа работы (детерминированного) алгоритма Bogosort: он перебирает все возможные комбинации, пока массив не будет отсортирован.
Предназначение Алгоритм сортировки
Худшее время Не определено в случае случайного алгоритма, в случае детерминированного алгоритма
Лучшее время [1]
Среднее время [1]
Затраты памяти

Bogosort (от амер. комп. жарг. bogus — неработоспособный, нефункциональный, бесполезный) — неэффективный алгоритм сортировки, используемый только в образовательных целях и противопоставляемый другим, более реалистичным алгоритмам. Bogosort является частным случаем алгоритма Лас-Вегас.

Существуют две версии этого алгоритма: детерминированная версия, которая перебирает все перестановки до тех пор, пока не будет получен отсортированный массив[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);
}

Производительность

[править | править код]

Примечания

[править | править код]
  1. 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, Архивировано (PDF) 29 сентября 2020, Дата обращения: 25 февраля 2024.
  2. 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
  3. 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.