Главная страница
Навигация по странице:

  • Алгоритм остроумно рекурсивен .

  • Придурковатая сортировка (Stooge sort) Сортировка названа в честь комиктруппы Three Stooges


    Скачать 104.12 Kb.
    НазваниеПридурковатая сортировка (Stooge sort) Сортировка названа в честь комиктруппы Three Stooges
    АнкорSTOOGE SORT
    Дата20.11.2020
    Размер104.12 Kb.
    Формат файлаdocx
    Имя файлаStooge sort (1).docx
    ТипДокументы
    #152117

    Придурковатая сортировка (Stooge sort)

    Сортировка названа в честь комик-труппы «Three Stooges» («Три недоумка») веселившей американскую публику в прошлом веке: с начала 30-х по конец 60-х. К слову, всего «недоумков» было шестеро, за 4 десятилетия творческой деятельности состав трио иногда менялся.

    Развесёлая троица специализировалась на фарсе и эксцентрике. Также ведёт себя и сортировка: подобно карикатурному персонажу она безумно мечется по массиву; как и положено в буффонаде – после нелепых приключений с главным героем всё хорошо. Массив отсортирован, happy end.

    Алгоритм остроумно рекурсивен.



    Берём отрезок массива (вначале это весь массив) и сравниваем элементы на концах отрезка. Если слева больше чем справа, то, естественно, меняем местами. 
    Затем, если в отрезке не менее трёх элементов, то тогда:
    1) вызываем Stooge sort для первых 2/3 отрезка;
    2) вызываем Stooge sort для последних 2/3 отрезка;
    3) снова вызываем Stooge sort для первых 2/3 отрезка.

    Сложность алгоритма подсчитана подкупающе точно: O(nlog 3 / log 1.5). Это не какие-то там мутные O(n).


    #include

    using namespace std;

    void stoogesort(int arr[], int l, int h)

    {

    if (l >= h)

    return;
    if (arr[l] > arr[h])

    swap(arr[l], arr[h]);

    if (h - l + 1 > 2) {

    int t = (h - l + 1) / 3;
    stoogesort(arr, l, h - t);

    stoogesort(arr, l + t, h);

    stoogesort(arr, l, h - t);

    }

    }

    int main()

    {

    int arr[] = { 2, 4, 5, 3, 1 };

    int n = sizeof(arr) / sizeof(arr[0]);

    stoogesort(arr, 0, n - 1);

    for (int i = 0; i < n; i++)

    cout << arr[i] <
    return 0;


    написать администратору сайта