Что такое сортировка пузырьком

Что такое сортировка пузырьком

Сортировка пузырьком (обменная сортировка) – простой в реализации и малоэффективный алгоритм сортировки. Метод изучается одним из первых на курсе теории алгоритмов, в то время как на практике используется очень редко.

Алгоритм состоит из повторяющихся проходов по сортируемому массиву. За каждый проход элементы последовательно сравниваются попарно и, если порядок в паре неверный, выполняется обмен элементов. Проходы по массиву повторяются Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырькомраз или до тех пор, пока на очередном проходе не окажется, что обмены больше не нужны, что означает — массив отсортирован. При каждом проходе алгоритма по внутреннему циклу, очередной наибольший элемент массива ставится на своё место в конце массива рядом с предыдущим «наибольшим элементом», а наименьший элемент перемещается на одну позицию к началу массива («всплывает» до нужной позиции как пузырёк в воде, отсюда и название алгоритма).

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Пример работы алгоритма

Возьмём массив с числами «5 1 4 2 8» и отсортируем значения по возрастанию, используя сортировку пузырьком. Выделены те элементы, которые сравниваются на данном этапе.

(5 1 4 2 8) (1 5 4 2 8), Здесь алгоритм сравнивает два первых элемента и меняет их местами. (1 5 4 2 8) (1 4 5 2 8), Меняет местами, так как Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком4″ /> (1 4 5 2 8) (1 4 2 5 8), Меняет местами, так как Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком2″ /> (1 4 2 5 8) (1 4 2 5 8), Теперь, ввиду того, что элементы стоят на своих местах (Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком5″ />), алгоритм не меняет их местами.

(1 4 2 5 8) (1 4 2 5 8) (1 4 2 5 8) (1 2 4 5 8), Меняет местами, так как Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком2″ /> (1 2 4 5 8) (1 2 4 5 8) (1 2 4 5 8) (1 2 4 5 8)

Теперь массив полностью отсортирован, но алгоритм не знает так ли это. Поэтому ему необходимо сделать полный проход и определить, что перестановок элементов не было.

(1 2 4 5 8) (1 2 4 5 8) (1 2 4 5 8) (1 2 4 5 8) (1 2 4 5 8) (1 2 4 5 8) (1 2 4 5 8) (1 2 4 5 8)

Теперь массив отсортирован и алгоритм может быть завершён.

Реализация алгоритма на различных языках программирования:

Источник

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

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком
Все отлично знают, что из класса обменных сортировок самый быстрый метод – это так называемая быстрая сортировка. О ней пишут диссертации, её посвящено немало статей на Хабре, на её основе придумывают сложные гибридные алгоритмы. Но сегодня речь пойдёт не про quick sort, а про другой обменный способ – старую добрую пузырьковую сортировку и её улучшения, модификации, мутации и разновидности.

Практический выхлоп от данных методов не ахти какой и многие хабрапользователи всё это проходили ещё в первом классе. Поэтому статья адресована тем, кто только-только заинтересовался теорией алгоритмов и делает в этом направлении первые шаги.

Сегодня поговорим о простейших сортировках обменами.

Если кому интересно, скажу, что есть и другие классы – сортировки выбором, сортировки вставками, сортировки слиянием, сортировки распределением, гибридные сортировки и параллельные сортировки. Есть, кстати, ещё эзотерические сортировки. Это различные фейковые, принципиально нереализуемые, шуточные и прочие псевдо-алгоритмы, про которые я в хабе «IT-юмор» как-нибудь напишу пару статей.

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

Заранее предупрежу, что почти все приведённые способы весьма медленные и глубокого анализа их временной сложности не будет. Какие-то побыстрее, какие-то помедленнее, но, грубо говоря, можно сказать, что в среднем O(n 2 ). Также я не вижу резона загромождать статью реализациями на каких-либо языках программирования. Заинтересовавшиеся без малейшего труда смогут найти примеры кода на Розетте, в Википедии или где-нибудь ещё.

Но вернёмся к сортировкам обменами. Упорядочивание происходит в результате многократного последовательного перебора массива и сравнения пар элементов между собой. Если сравниваемые элементы не отсортированы друг относительно друга – то меняем их местами. Вопрос только в том, каким именно макаром массив обходить и по какому принципу выбирать пары для сравнения.

Начнём не с эталонной пузырьковой сортировки, а с алгоритма, который называется…

Глупая сортировка

Сортировка и впрямь глупейшая. Просматриваем массив слева-направо и по пути сравниваем соседей. Если мы встретим пару взаимно неотсортированных элементов, то меняем их местами и возвращаемся на круги своя, то бишь в самое начало. Снова проходим-проверяем массив, если встретили снова «неправильную» пару соседних элементов, то меняем местами и опять начинаем всё сызнова. Продолжаем до тех пор пока массив потихоньку-полегоньку не отсортируется.

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

«Так любой дурак сортировать умеет» — скажете Вы и будете абсолютно правы. Именно поэтому сортировку и прозвали «глупой». На этой лекции мы будем последовательно совершенствовать и видоизменять данный способ. Сейчас у него временная сложность O(n 3 ), произведя одну коррекцию, мы уже доведём до O(n 2 ), потом ускорим ещё немного, потом ещё, а в конце концов мы получим O(n log n) – и это будет вовсе не «Быстрая сортировка»!

Внесём в глупую сортировку одно-единственное улучшение. Обнаружив при проходе два соседних неотсортированных элемента и поменяв их местами, не станем откатываться в начало массива, а невозмутимо продолжим его обход до самого конца.

В этом случае перед нами не что иное как всем известная…

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

Или сортировка простыми обменами. Бессмертная классика жанра. Принцип действий прост: обходим массив от начала до конца, попутно меняя местами неотсортированные соседние элементы. В результате первого прохода на последнее место «всплывёт» максимальный элемент. Теперь снова обходим неотсортированную часть массива (от первого элемента до предпоследнего) и меняем по пути неотсортированных соседей. Второй по величине элемент окажется на предпоследнем месте. Продолжая в том же духе, будем обходить всё уменьшающуюся неотсортированную часть массива, запихивая найденные максимумы в конец.

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Если не только в конец задвигать максимумы, а ещё и в начало перебрасывать минимумы то у нас получается…

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

Она же сортировка перемешиванием, она же коктейльная сортировка. Начинается процесс как в «пузырьке»: выдавливаем максимум на самые задворки. После этого разворачиваемся на 180 0 и идём в обратную сторону, при этом уже перекатывая в начало не максимум, а минимум. Отсортировав в массиве первый и последний элементы, снова делаем кульбит. Обойдя туда-обратно несколько раз, в итоге заканчиваем процесс, оказавшись в середине списка.

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

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

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

Чётно-нечётная сортировка

На сей раз мы не будем сновать по массиву взад-вперёд, а снова вернёмся к идее планомерного обхода слева-направо, но только сделаем шире шаг. На первом проходе элементы с нечётным ключом сравниваем с соседями, зиждущимися на чётных местах (1-й сравниваем со 2-м, затем 3-й с 4-м, 5-й с 6-м и так далее). Затем наоборот – «чётные по счёту» элементы сравниваем/меняем с «нечётными». Затем снова «нечёт-чёт», потом опять «чёт-нечет». Процесс останавливается тогда, когда после подряд двух проходов по массиву («нечётно-чётному» и «чётно-нечётному») не произошло ни одного обмена. Стало быть, отсортировали.

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

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

Разберём последнее покращення* для Сортування бульбашкою** — Сортування гребінцем***. Этот способ упорядочивает весьма шустро, O(n 2 ) – его наихудшая сложность. В среднем по времени имеем O(n log n), а лучшая даже, не поверите, O(n). То есть, весьма достойный конкурент всяким «быстрым сортировкам» и это, заметьте, без использования рекурсии. Впрочем, я обещал, что в крейсерские скорости мы сегодня углубляться не станем, засим умолкаю и перехожу непосредственно к алгоритму.

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Во всём виноваты черепашки

Небольшая предыстория. В 1980 году Влодзимеж Добосиевич пояснил почему пузырьковая и производные от неё сортировки работают так медленно. Это всё из-за черепашек. «Черепахи» — небольшие по значению элементы, которые находятся в конце списка. Как Вы, возможно, заметили пузырьковые сортировки ориентированы на «кроликов» (не путать с «кроликами» Бабушкина) – больших по значению элементов в начале списка. Они весьма резво перемещаются к финишу. А вот медлительные пресмыкающиеся на старт ползут неохотно. Подгонять «тортилл» можно с помощью расчёски.

image: виноватая черепашка

Сортировка расчёской

В «пузырьке», «шейкере» и «чёт-нечете» при переборе массива сравниваются соседние элементы. Основная идея «расчёски» в том, чтобы первоначально брать достаточно большое расстояние между сравниваемыми элементами и по мере упорядочивания массива сужать это расстояние вплоть до минимального. Таким образом мы как бы причёсываем массив, постепенно разглаживая на всё более аккуратные пряди.

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Первоначальный разрыв между сравниваемыми элементами лучше брать не абы какой, а с учётом специальной величины называемой фактором уменьшения, оптимальное значение которой равно примерно 1,247. Сначала расстояние между элементами равно размеру массива разделённого на фактор уменьшения (результат, естественно, округляется до ближайшего целого). Затем, пройдя массив с этим шагом, мы снова делим шаг на фактор уменьшения и проходим по списку вновь. Так продолжается до тех пор, пока разность индексов не достигнет единицы. В этом случае массив досортировывается обычным пузырьком.

Опытным и теоретическим путём установлено оптимальное значение фактора уменьшения:

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Когда был изобретён этот метод, на него на стыке 70-х и 80-х мало кто обратил внимание. Десятилетие спустя, когда программирование перестало быть уделом учёных и инженеров IBM, а уже лавинообразно набирало массовый характер, способ переоткрыли, исследовали и популяризировали в 1991 году Стивен Лейси и Ричард Бокс.

Вот собственно и всё что я хотел Вам рассказать про пузырьковую сортировку и иже с ней.

* покращення (укр.) – улучшение
** Сортування бульбашкою (укр.) – Сортировка пузырьком
*** Сортування гребінцем (укр.) – Сортировка расчёской

Источник

Сортировка пузырьком — это самый простой алгоритм сортировки, который работает путем многократной замены соседних элементов, если они находятся в неправильном порядке.

( 5 1 4 2 8) ( 1 5 4 2 8), здесь алгоритм сравнивает два первых элемента и меняет их местами, так как (5>1).

(1 5 4 2 8) (1 4 5 2 8), меняет элементы местами, так как 4>4>(5>4)

(1 4 5 2 8) (1 4 2 5 8), меняет элементы местами, так как 2>(5>2)

(1 4 2 5 8 ) (1 4 2 5 8 ), ввиду того, что элементы стоят на своих местах (5>8>5), алгоритм не меняет их местами.

( 1 4 2 5 8) ( 1 4 2 5 8)

(1 4 2 5 8) (1 2 4 5 8), меняет элементы местами, так как (4>2)2>

(1 2 4 5 8) (1 2 4 5 8)

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

Теперь массив отсортирован, и алгоритм может быть завершён.

Ниже в качестве примера приведена сортировка пузырьком С :

Сортировка пузырьком Java

Сортировка пузырьком Python

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Приведенная выше сортировка методом пузырька всегда выполняется, даже если массив отсортирован. Ее можно оптимизировать путем остановки алгоритма, применяемой в том случае, если внутренний цикл не произвел никакой замены.

Пузырьковая сортировка Python 3

Метод пузырька C — результат сортировки:

Худшая и средняя сложность времени: O (n * n). Наихудший случай возникает, когда массив отсортирован по обратному адресу.

Сложность наилучшего случая: O (n). Наилучший случай возникает, когда массив уже отсортирован.

Пограничные случаи: сортировка занимает минимальное время (порядок n), когда элементы уже отсортированы.

Сортировка на месте: Да.

В компьютерной графике пузырьковая сортировка популярна благодаря возможности обнаруживать мелкие ошибки ( например, обмен всего двух элементов ) в почти отсортированных массивах и исправлять ее только с линейной сложностью ( 2n ). Например, она используется в алгоритме заполнения полигонов, где ограничивающие линии сортируются по их координате x на определенной линии сканирования ( линия, параллельная оси X ), и с увеличением Y их порядок меняется ( два элемента меняются местами ) только на пересечениях двух линий.

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Пожалуйста, оставьте свои комментарии по текущей теме статьи. За комментарии, лайки, дизлайки, отклики, подписки огромное вам спасибо!

Пожалуйста, опубликуйте ваши мнения по текущей теме статьи. За комментарии, лайки, подписки, дизлайки, отклики низкий вам поклон!

Источник

Алгоритмы и структуры данных для начинающих: сортировка

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

В этой части мы посмотрим на пять основных алгоритмов сортировки данных в массиве. Начнем с самого простого — сортировки пузырьком — и закончим «быстрой сортировкой» (quicksort).

Для каждого алгоритма, кроме объяснения его работы, мы также укажем его сложность по памяти и времени в наихудшем, наилучшем и среднем случае.

Метод Swap

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

СложностьНаилучший случайВ среднемНаихудший случай
ВремяO(n)O(n 2 )O(n 2 )
ПамятьO(1)O(1)O(1)

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

27–29 декабря, Онлайн, Беcплатно

Например, у нас есть массив целых чисел:

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

При первом проходе по массиву мы сравниваем значения 3 и 7. Поскольку 7 больше 3, мы оставляем их как есть. После чего сравниваем 7 и 4. 4 меньше 7, поэтому мы меняем их местами, перемещая семерку на одну позицию ближе к концу массива. Теперь он выглядит так:

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Этот процесс повторяется до тех пор, пока семерка не дойдет почти до конца массива. В конце она сравнивается с элементом 8, которое больше, а значит, обмена не происходит. После того, как мы обошли массив один раз, он выглядит так:

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Поскольку был совершен по крайней мере один обмен значений, нам нужно пройти по массиву еще раз. В результате этого прохода мы перемещаем на место число 6.

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

И снова был произведен как минимум один обмен, а значит, проходим по массиву еще раз.

При следующем проходе обмена не производится, что означает, что наш массив отсортирован, и алгоритм закончил свою работу.

Сортировка вставками

СложностьНаилучший случайВ среднемНаихудший случай
ВремяO(n)O(n 2 )O(n 2 )
ПамятьO(1)O(1)O(1)

Сортировка вставками работает, проходя по массиву и перемещая нужное значение в начало массива. После того, как обработана очередная позиция, мы знаем, что все позиции до нее отсортированы, а после нее — нет.

Важный момент: сортировка вставками обрабатывает элементы массива по порядку. Поскольку алгоритм проходит по элементам слева направо, мы знаем, что все, что слева от текущего индекса — уже отсортировано. На этом рисунке показано, как увеличивается отсортированная часть массива с каждым проходом:

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Постепенно отсортированная часть массива растет, и, в конце концов, массив окажется упорядоченным.

Давайте взглянем на конкретный пример. Вот наш неотсортированный массив, который мы будем использовать:

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Алгоритм начинает работу с индекса 0 и значения 3. Поскольку это первый индекс, массив до него включительно считается отсортированным.

Далее мы переходим к числу 7. Поскольку 7 больше, чем любое значение в отсортированной части, мы переходим к следующему элементу.

На этом этапе элементы с индексами 0..1 отсортированы, а про элементы с индексами 2..n ничего не известно.

Итак, мы нашли индекс 1 (между значениями 3 и 7). Метод Insert осуществляет вставку, удаляя вставляемое значение из массива и сдвигая все значения, начиная с индекса для вставки, вправо. Теперь массив выглядит так:

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Теперь часть массива, начиная от нулевого элемента и заканчивая элементом с индексом 2, отсортирована. Следующий проход начинается с индекса 3 и значения 4. По мере работы алгоритма мы продолжаем делать такие вставки.

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

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

Сортировка выбором

СложностьНаилучший случайВ среднемНаихудший случай
ВремяO(n)O(n 2 )O(n 2 )
ПамятьO(1)O(1)O(1)

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

Давайте посмотрим на работу сортировки выбором на нашем неотсортированном массиве.

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

При первом проходе алгоритм с помощью метода FindIndexOfSmallestFromIndex пытается найти наименьшее значение в массиве и переместить его в начало.

Имея такой маленький массив, мы сразу можем сказать, что наименьшее значение — 3, и оно уже находится на правильной позиции. На этом этапе мы знаем, что на первой позиции в массиве (индекс 0) находится самое маленькое значение, следовательно, начало массива уже отсортировано. Поэтому мы начинаем второй проход — на этот раз по индексам от 1 до n — 1.

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

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Теперь неотсортированная часть массива начинается с индекса 2. Она растет на один элемент при каждом проходе алгоритма. Если на каком-либо проходе мы не сделали ни одного обмена, это означает, что массив отсортирован.

После еще двух проходов алгоритм завершает свою работу:

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Сортировка слиянием

СложностьНаилучший случайВ среднемНаихудший случай
ВремяO(n·log n)O(n·log n)O(n·log n)
ПамятьO(n)O(n)O(n)

Разделяй и властвуй

До сих пор мы рассматривали линейные алгоритмы. Они используют мало дополнительной памяти, но имеют квадратичную сложность. На примере сортировки слиянием мы посмотрим на алгоритм типа «разделяй и властвуй» (divide and conquer).

Алгоритмы этого типа работают, разделяя крупную задачу на более мелкие, решаемые проще. Мы пользуемся ими каждый день. К примеру, поиск в телефонной книге — один из примеров такого алгоритма.

Если вы хотите найти человека по фамилии Петров, вы не станете искать, начиная с буквы А и переворачивая по одной странице. Вы, скорее всего, откроете книгу где-то посередине. Если попадете на букву Т, перелистнете несколько страниц назад, возможно, слишком много — до буквы О. Тогда вы пойдете вперед. Таким образом, перелистывая туда и обратно все меньшее количество страниц, вы, в конце концов, найдете нужную.

Насколько эффективны эти алгоритмы?

Предположим, что в телефонной книге 1000 страниц. Если вы открываете ее на середине, вы отбрасываете 500 страниц, в которых нет искомого человека. Если вы не попали на нужную страницу, вы выбираете правую или левую сторону и снова оставляете половину доступных вариантов. Теперь вам надо просмотреть 250 страниц. Таким образом мы делим нашу задачу пополам снова и снова и можем найти человека в телефонной книге всего за 10 просмотров. Это составляет 1% от всего количества страниц, которые нам пришлось бы просмотреть при линейном поиске.

Сортировка слиянием

При сортировке слиянием мы разделяем массив пополам до тех пор, пока каждый участок не станет длиной в один элемент. Затем эти участки возвращаются на место (сливаются) в правильном порядке.

Давайте посмотрим на такой массив:

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Разделим его пополам:

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

И будем делить каждую часть пополам, пока не останутся части с одним элементом:

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Теперь, когда мы разделили массив на максимально короткие участки, мы сливаем их в правильном порядке.

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Сначала мы получаем группы по два отсортированных элемента, потом «собираем» их в группы по четыре элемента и в конце собираем все вместе в отсортированный массив.

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Для работы алгоритма мы должны реализовать следующие операции:

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

Быстрая сортировка

СложностьНаилучший случайВ среднемНаихудший случай
ВремяO(n·log n)O(n·log n)O(n 2 )
ПамятьO(1)O(1)O(1)

Быстрая сортировка — это еще один алгоритм типа «разделяй и властвуй». Он работает, рекурсивно повторяя следующие шаги:

Давайте посмотрим на работу алгоритма на следующем массиве:

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Сначала мы случайным образом выбираем ключевой элемент:

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Теперь, когда мы знаем ключевой индекс (4), мы берем значение, находящееся по этому индексу (6), и переносим значения в массиве так, чтобы все числа больше или равные ключевому были в правой части, а все числа меньше ключевого — в левой. Обратите внимание, что в процессе переноса значений индекс ключевого элемента может измениться (мы увидим это вскоре).

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

На этом этапе мы знаем, что значение 6 находится на правильной позиции. Теперь мы повторяем этот процесс для правой и левой частей массива.

Мы рекурсивно вызываем метод quicksort на каждой из частей. Ключевым элементом в левой части становится пятерка. При перемещении значений она изменит свой индекс. Главное — помнить, что нам важно именно ключевое значение, а не его индекс.

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Снова применяем быструю сортировку:

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

Что такое сортировка пузырьком. Смотреть фото Что такое сортировка пузырьком. Смотреть картинку Что такое сортировка пузырьком. Картинка про Что такое сортировка пузырьком. Фото Что такое сортировка пузырьком

У нас осталось одно неотсортированное значение, а, поскольку мы знаем, что все остальное уже отсортировано, алгоритм завершает работу.

Заключение

На этом мы заканчиваем наш цикл статей по алгоритмам и структурам данных для начинающих. За это время мы рассмотрели связные списки, динамические массивы, двоичное дерево поиска и множества с примерами кода на C#.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *