Основи програмування на С ++ для початківців

“Шейкерная” сортировка

розглянувши “пузырьковую” сортировку массива можно перейти к разбору её разновидности – “шейкер”-сортировке. Вы можете встретить несколько её названий : сортировка перемешиванием, пульсирующая сортировка, двунаправленная сортировка “пузырьком”.

Внимательно присмотревшись к тому, как проходит сортировка “пузырьком” – можна сказати наступне: часть массива, в котором перестановки элементов уже не происходят (отсортированная часть массива), то эту часть можно исключить из рассмотрения и не обрабатывать на следующих итерациях. Друге, что вы могли заметить – это то, что минимальный (самый “легкий” элемент) при сортировке сразу перемещается в самое начало массива, а “тяжелые” элементы сдвигаются только на одну позицию “вниз”. так масив

shyeikyernaya sortirovka C ++, Шейкер sortirovka C ++, сортування перемішуванням з ++, коктейль сортувати по C ++

будет отсортирован за один проход вложенным циклом, а для массива

shyeikyernaya sortirovka C ++, Шейкер sortirovka C ++, сортування перемішуванням з ++, коктейль сортувати по C ++

понадобится три итерации.

shyeikyernaya sortirovka C ++, Шейкер sortirovka C ++, сортування перемішуванням з ++, коктейль сортувати по C ++
джерело: kvodo.ru

Тому була придумана більш ефективна форма сортування “пузырьком” -“шейкер”-сортировка. У ній межі тієї частини масиву в якій є перестановки, сужаются. Плюс – внутренние циклы проходят по массиву то в одну, то в другую сторону, піднімаючи найлегший елемент вгору і опускаючи найважчий елемент в самий низ за одну ітерацію зовнішнього циклу. Набирайте код:

Рассмотрим саму функцию в которой происходит “шейкер”-сортировка (двунаправленная сортировка “пузырьком”) – строки 14-31. завдяки змінним leftMark і RightMark участок массива, который подлежит сортировке будет сужаться с каждым шагом цикла. Це позитивно позначиться на часі роботи програми. А благодаря двум вложенным циклам for – за одну ітерацію зовнішнього циклу мінімальне і максимальне значення займуть свої правильні позиції в масиві.

Результат:

shyeikyernaya sortirovka C ++, Шейкер sortirovka C ++, сортування перемішуванням з ++, коктейль сортувати по C ++

Как и говорилось, на виконання сортування массива по зростанню знадобилося в два рази менше ітерацій зовнішнього циклу в порівнянні з класичною “пузырьковой” сортировкой.

Почитайте також про інших алгоритмах угруповань даних.

3 думки про "“Шейкерная” сортировка

  1. Навіщо в умови while (leftMark <= rightMark) (рядок 18) перевірити рівність? Адже в разі рівності лівої і правої меж залишився 1 элемент, і для нього проходження зайвої ітерації не потрібно.

  2. Чим шейкерні сортування ефективніше? – тим що за одну ітерацію зовнішнього циклу не тільки найменший елемент переміщається вниз, але і найбільший – вгору? – дак зате сама ітерація стала складніше.

    Тобто,. в гіршому випадку бульбашкового сортування було N ітерацій зовнішнього циклу, кожна з яких виконувала N-i ітерацій внутрішнього (де i – номер ітерації зовнішнього циклу). Тобто,. складність обчислюється як сума (N-я) для всіх i від 1 до N, т.е. N * (N + 1)/2 = 0,5 * N ^ 2 + 0.5*N. асимптотично – це N ^ 2, але формулу пишу таку, т.к. точніша (може бути так у шейкера хоч якусь перевагу з'явиться?)

    У гіршому випадку шейкерні сортування буде виконано N / 2 ітерацій зовнішнього циклу (адже за одну ітерацію 2 елемент займають свої місця в відсортованому масиві), а от внутрішній цикл має складність (N-я) * 2. складність сортування – це сума (N-я)*2 для всіх i від 1 до N / 2. Знову бачимо арифметичну прогресію і вважаємо суму як
    N * ((N-1) + (N, N / 2))/2 = N * (N-1 + N – N / 2)/2 = (1.5*N * N, N)/2 = 0,75 * N ^ 2 – N / 2.

    Дак от навіть якщо відкинути аналіз при N прагне до нескінченності (де сортування еквіваленти по ефективності), очевидно ж, що для невеликих значень N “оптимізований” алгоритм буде працювати гірше (по крайней мере в гіршому випадку).

    Де я зараз неправильно порахував? – ніколи не розумів всіх цих свістоплясок з шейкером.

залишити коментар

Ваша електронна адреса не буде опублікований. Обов'язкові поля позначені * *