Алгоритмы сортировки, поиска кратчайшего пути в графе и поиска покрытия, близкого к кратчайшему

Модификация пузырьковой сортировки.

Алгоритм

Производится многократный прогон по массиву, соседние элементы сравниваются и, в случае необходимости, меняются местами. При достижении конца массива направление меняется на противоположное. Таким образом по очереди выталкиваются крупные и мелкие элементы массива в конец и начало структуры соответственно.Коктейльная сортировка ещё называется двухсторонней сортировкой простыми обменами. Есть аналогичная модификация и для сортировки выбором.

Характеристики алгоритма

Название Коктейльная сортировка (Cocktail sort)
Другие названия
Класс Сортировки обменами
Устойчивость Устойчивая
Сравнения Да
Сложность по времени Худшая O(n2)
Средняя O(n2)
Лучшая O(n)
Сложность по памяти Общая O(n)
Дополнительная O(1)

Коктейльная сортировка на Python

Коктейльная сортировка на PHP

Ссылки

imageСортировки обменами

imageПузырьковая сортировка и все-все-все

Коктейльная сортировка

Cocktail sort

Реализация на различных ЯП

Alivander Jun 6, 2018·3 min read

Шейкерная сортировка (Cocktail sort), она же сортировка перемешиванием, она же двунаправленная сортировка — по сути всего лишь оптимизированный алгоритм пузырьковой сортировки. Напомним — ее суть была в том, что за каждый проход по массиву в его конец “всплывал” максимальный элемент.

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

Нагляднее это демонстрирует следующее видео:

Шейкерная сортировка работает быстрее, чем сортировка пузырьком, но все еще имеет сложность O(n²). Код алгоритма будет выглядеть следующим образом:

            right--;   

Приведенный пример является традиционным. Далее начинаются рассуждения автора.

Дело в том что этот алгоритм не учитывает случайные промежутки уже упорядоченных элементов. Даже если на какой-то итерации в конце или в начале диапазона будет некое число уже отсортированных чисел, указатель будет вновь смещен только на единицу. Это можно оптимизировать, если запомнить место, где последний раз произошла перестановка элементов, и сместить указатель на эту позицию. Код при этом измениться не значительно:

       while (left < right) {         right = lastSwap;   

Но оптимизация скорости будет на лицо. К примеру, для сортировки массива arr = [5, 8, 52, 15, 1, 3, 4, 9, 60, 63, 72, 12] традиционный вариант кода пройдет диапазон 66 раз, а оптимизированный 40.

Ну и в конце давайте перепишем наш алгоритм на синтаксис ES6 и избавимся от дополнительной функции:

     while (left < right) {         right = lastSwap;   

 Главная » Разделы » Лента » Видео

[ Версия для печати ]

//—> Страницы: (3) [1] 2 3   [ ОТВЕТИТЬ ] [ НОВАЯ ТЕМА ] Понравился пост? Еще больше интересного в Телеграм-канале ЯПлакалъ!

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии. Авторизуйтесь, пожалуйста, или зарегистрируйтесь, если не зарегистрированы.
Страницы: (3) [1] 2 3  [ ОТВЕТИТЬ ] [ НОВАЯ ТЕМА ]
 

Активные темы

  • В четверти всех консервов из сайры в российских магазинах не ока… (27)

    Инкубатор 07:15

  • Всё стабильно! Пидорги!!! (55)

    Инкубатор 07:15

  • Кулинарная общалка (3328)

    Кулинария 07:15

  • Расходы на здравоохранение и соцподдержку в РФ сокращаются. (19)

    Инкубатор 07:15

  • Юрий Лоза про загородную собственность (37)

    Инкубатор 07:15

  • В центре Днепра девушка провалилась в лужу (159)

    Видео 07:15

  • Посетил Трехо Такос (133)

    Картинки 07:15

  • Как мы в детстве пропадали (31)

    Инкубатор 07:14

  • Тихая семейная поездка в США, прервалась эпичным полетом лихого … (93)

    Видео 07:14

  • Иногда хочется медальку или Самая жуть… (65)

    Тексты 07:14

  • Они самые. (16)

    Инкубатор 07:14

  • Россиянка ради забавы заживо подожгла спящего бездомного (297)

    События 07:14

  • МВД работает над внедрением экспресс-тестов для выявления пьяных… (17)

    Инкубатор 07:14

  • Когда забрало запотело в оплоте демократии (62)

    Инкубатор 07:13

  • Приветствую! (27)

    Инкубатор 07:13

Обзор активных тем »

Yaplakal

Наверх

До текущего момента единственной публикацией о сортировке в моем блоге была статья про реализацию топологической сортировки вершин графа. Пора это исправлять! Строить грандиозных планов о покорении всех видов сортировки я не стану, а начну с одной из самых популярных — быстрая сортировка.

Я буду далеко не первым и не последним, кто скажет, что «быстрая» она только в названии и сейчас существует куча аналогов, и вообще для каждого типа данных нужна своя сортировка. Да, это все правда, но эта правда не отменяет простого факта, что собственноручная реализация быстрой сортировки оттачивает навыки программирования в общем, и она всегда будет в университетских курсах, я в этом уверен. Из этих же соображений был выбран язык программирования для реализации, ибо тут же можно попрактиковаться в использовании указателей в C/C++.

Предлагаю перейти к делу и для начала кратко рассмотреть суть алгоритма.

Как работает быстрая сортировка

Схему алгоритма можно описать таким образом:

  1. Выбрать опорный элемент в массиве — часто встречается вариант с центральным элементом.
  2. Разделить массив на две части следующим образом: все элементы из левой части, которые больше или равны опорному, перекидываем в правую, аналогично, все элементы из правой, которые меньше или равны опорному кидаем в левую часть.
  3. Рекурсивно повторяем действие для левой и правой части массива.

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

Иллюстрацию одного шага алгоритма я позаимствовал отсюда, больно уж она наглядная.

Рекурсивная реализация быстрой сортировки

На вход функция принимает сам массив(указатель на начало) и его размер.

 void qsortRecursive(int *mas, int size) {     //Указатели в начало и в конец массива     int i = 0;     int j = size - 1;      //Центральный элемент массива     int mid = mas[size / 2];      //Делим массив     do {         //Пробегаем элементы, ищем те, которые нужно перекинуть в другую часть         //В левой части массива пропускаем(оставляем на месте) элементы, которые меньше центрального         while(mas[i] < mid) {             i++;         }         //В правой части пропускаем элементы, которые больше центрального         while(mas[j] > mid) {             j--;         }          //Меняем элементы местами         if (i <= j) {             int tmp = mas[i];             mas[i] = mas[j];             mas[j] = tmp;              i++;             j--;         }     } while (i <= j);       //Рекурсивные вызовы, если осталось, что сортировать     if(j > 0) {         //"Левый кусок"         qsortRecursive(mas, j + 1);     }     if (i < size) {         //"Првый кусок"         qsortRecursive(&mas[i], size - i);     } } 

Заключение

Это задание одновременно помогает понять, как работает рекурсия и учит прослеживать изменение данных во время исполнения алгоритма. Рекомендуется «дойти» и написать это самостоятельно, но все же вот моя реализация, мне и самому она может пригодиться. На этом у меня все, спасибо за внимание!

Фундаментальные алгоритмы и структуры данных в Delphi—> image Оглавление—> image image image—> image

Джулиан Бакнеллi

Книги автора: Фундаментальные алгоритмы и структуры данных в Delphi /

W Cati

Книги автора: Введение в Python Описание языка PascalABC.NET S. D. F. Справочкик по JavaScript Справочник по CSS Справочник по PHP Справочник по Flash Язык программирования Euphoria. Справочное руководство Программирование на Java Основы программирования на Java Графика DirectX в Delphi VBA для чайников Мир InterBase. Архитектура, администрирование и разработка приложений баз данных в InterBase/FireBird/Yaffil Фундаментальные алгоритмы и структуры данных в Delphi Курс «Язык программирования PHP»

Оцените статью
Рейтинг автора
4,8
Материал подготовил
Максим Коновалов
Наш эксперт
Написано статей
127
А как считаете Вы?
Напишите в комментариях, что вы думаете – согласны
ли со статьей или есть что добавить?
Добавить комментарий