Статическая визуализация пузырьковой сортировки | |
Класс | Алгоритм сортировки |
---|---|
Структура данных | Массив |
наихудший случай производительность | сравнения, swaps |
Лучший случай производительность | сравнения, swaps |
Средняя производительность | сравнения, свопы |
наихудший случай сложность пространства | всего, вспомогательный |
пузырьковая сортировка, иногда называемая сортировкой по убыванию, представляет собой простой алгоритм сортировки, который многократно проходит по списку, сравнивает соседние элементы и меняет местами их, если они находятся в неправильный порядок. Прохождение по списку повторяется до тех пор, пока список не будет отсортирован. Алгоритм, который представляет собой сравнительную сортировку, назван в честь того, как меньшие или большие элементы «всплывают» вверх в списке.
Этот простой алгоритм плохо работает в реальном мире и используется в основном как обучающий инструмент. Более эффективные алгоритмы, такие как quicksort, timsort или merge sort, используются библиотеками сортировки, встроенными в популярные языки программирования, такие как Python и Java.
Сортировка пузырьков имеет наихудший- регистр и средняя сложность О (n), где n - количество сортируемых элементов. Большинство практических алгоритмов сортировки имеют существенно лучшую сложность в худшем случае или в среднем, часто O (n log n). Даже другие алгоритмы сортировки О (n), такие как сортировка вставкой, обычно работают быстрее, чем пузырьковая сортировка, и не являются более сложными. Следовательно, пузырьковая сортировка не является практическим алгоритмом сортировки.
Единственное существенное преимущество пузырьковой сортировки перед большинством других алгоритмов, даже быстрой сортировкой, но не сортировкой вставкой, заключается в том, что она позволяет определять, что список отсортирован эффективно встроена в алгоритм. Когда список уже отсортирован (в лучшем случае), сложность пузырьковой сортировки составляет всего O (n). Напротив, большинство других алгоритмов, даже с лучшей средней сложностью, выполняют весь свой процесс сортировки на множестве и, следовательно, являются более сложными. Однако сортировка вставкой не только разделяет это преимущество, но также лучше работает в существенно отсортированном списке (имеющем небольшое количество инверсий ).
Следует избегать пузырьковой сортировки в случае больших коллекций. Это не будет эффективно в случае коллекции с обратным порядком.
Расстояние и направление, в котором элементы должны перемещаться во время сортировки, определяют производительность пузырьковой сортировки, поскольку элементы перемещаются в разных направлениях с разной скоростью. Элемент, который должен переместиться в конец списка, может перемещаться быстро, потому что он может принимать участие в последовательных заменах. Например, самый большой элемент в списке будет выигрывать при каждом обмене, поэтому он перемещается в свою отсортированную позицию на первом проходе, даже если он начинается с начала. С другой стороны, элемент, который должен двигаться к началу списка, не может двигаться быстрее, чем один шаг за проход, поэтому элементы перемещаются к началу очень медленно. Если наименьший элемент находится в конце списка, потребуется n − 1 проход, чтобы переместить его в начало. Это привело к тому, что эти типы элементов были названы кроликами и черепахами, соответственно, в честь персонажей в басне Эзопа Черепаха и Заяц.
Были предприняты различные усилия, чтобы уничтожить черепах, чтобы повысить скорость сортировки пузырей.. Коктейльная сортировка - это двунаправленная пузырьковая сортировка, которая идет от начала до конца, а затем меняет свое направление, идя от конца к началу. Он может довольно хорошо перемещать черепах, но сохраняет O (n) сложность наихудшего случая. Сортировка гребенок сравнивает элементы, разделенные большими промежутками, и может очень быстро перемещать черепах, прежде чем переходить к все меньшим и меньшим промежуткам, чтобы сгладить список. Его средняя скорость сопоставима с более быстрыми алгоритмами, такими как quicksort.
Возьмите массив чисел «5 1 4 2 8» и отсортируйте его от наименьшего числа к наибольшему. число с использованием пузырьковой сортировки. На каждом этапе сравниваются элементы, выделенные жирным шрифтом . Потребуется три прохода;
Теперь массив уже отсортирован, но алгоритм не знает, завершен ли он. Алгоритму требуется один весь проход без какой-либо подкачки, чтобы знать, что он отсортирован.
В псевдокоде алгоритм может быть выраженным as (массив на основе 0):
процедура bubbleSort (A: список сортируемых элементов) n: = length (A) repeat swapped: = false для i: = от 1 до n-1 включительно do / * если эта пара не в порядке * / если A [i-1]>A [i], то / * поменять местами их и запомнить что-то измененное * / swap (A [i-1], A [i]) swapped: = true end if end for пока не будет заменен конец процедуры
Алгоритм пузырьковой сортировки можно оптимизировать, заметив, что n-й проход находит n-й самый большой элемент и помещает его на свое последнее место. Таким образом, внутренний цикл может избежать просмотра последних n - 1 элементов при выполнении в n-й раз:
процедура bubbleSort (A: список сортируемых элементов) n: = length (A) repeat swapped: = false for i: = от 1 до n - 1 включительно do, если A [i - 1]>A [i], затем поменять местами (A [i - 1], A [i]) swapped = true end if end for n: = n - 1 пока не поменяется местами конец процедуры
В более общем случае может случиться так, что более одного элемента помещается в свою конечную позицию за один проход. В частности, после каждого прохода все элементы после последнего свопа сортируются и не нуждаются в повторной проверке. Это позволяет пропускать многие элементы, что в худшем случае приводит к увеличению количества сравнений примерно на 50% (хотя и без улучшения подсчетов подкачки) и добавляет очень небольшую сложность, потому что новый код включает переменную «подкачки»:
Для выполнения этого в псевдокоде можно записать следующее:
процедура bubbleSort (A: список сортируемых элементов) n: = length (A) repeat newn: = 0 for i: = от 1 до n - 1 включительно do if A [i - 1]>A [i], затем поменять местами (A [i - 1], A [i]) newn: = i end if end для n: = newn до n ≤ 1 процедура завершения
Альтернативные модификации, например, сортировка с помощью шейкер для коктейлей пытается улучшить производительность пузырьковой сортировки, сохраняя при этом ту же идею многократного сравнения и замены соседних элементов.
Хотя пузырьковая сортировка является одним из самых простых алгоритмов сортировки для понимания и реализации, ее O (n) сложность означает, что его эффективность резко снижается для списков, состоящих из более чем небольшого числа элементов. Даже среди простых алгоритмов сортировки O (n) алгоритмы типа сортировка вставкой обычно значительно более эффективны.
Из-за своей простоты пузырьковая сортировка часто используется для ознакомления с концепцией алгоритма или алгоритма сортировки для студентов, начинающих информатику. Тем не менее, некоторые исследователи, такие как Оуэн Астрахан, приложили все усилия, чтобы принизить пузырьковую сортировку и ее неизменную популярность в образовании по информатике, и рекомендовали даже не преподавать ее.
Файл жаргона, который, как известно, называет bogosort «архетипичным [sic] извращенно ужасным алгоритмом», также называет пузырьковую сортировку «общим плохим алгоритмом». Дональд Кнут в Искусство компьютерного программирования, пришел к выводу, что «пузырьковой сортировке, похоже, нечего рекомендовать, кроме броского названия и того факта, что она приводит к некоторым интересным теоретическим проблемам», некоторые из которых он затем обсуждает.
Пузырьковая сортировка асимптотически по времени выполнения эквивалентна сортировке вставкой в худшем случае, но эти два алгоритма сильно различаются по количеству необходимых замен. Экспериментальные результаты, такие как результаты Astrachan, также показали, что сортировка вставкой работает значительно лучше даже в случайных списках. По этим причинам многие современные учебники алгоритмов избегают использования алгоритма пузырьковой сортировки в пользу сортировки вставкой.
Пузырьковая сортировка также плохо взаимодействует с современным аппаратным обеспечением ЦП. Он производит как минимум вдвое больше записей, чем сортировка вставкой, вдвое больше промахов в кэш и асимптотически больше неверных предсказаний переходов. Эксперименты с сортировкой строк Astrachan в Java показывают, что пузырьковая сортировка примерно в пятую часть быстрее, чем сортировка вставкой, и на 70% быстрее, чем сортировка по выбору .
В компьютерной графике пузырьковая сортировка популярна за его способность обнаруживать очень маленькую ошибку (например, замену всего двух элементов) в почти отсортированных массивах и исправлять ее с линейной сложностью (2n). Например, он используется в алгоритме заполнения многоугольника, где ограничивающие линии сортируются по их координате x в определенной строке сканирования (линия, параллельная оси x), а с увеличением y их порядок изменяется (два элемента меняются местами) только при пересечения двух линий. Пузырьковая сортировка - это стабильный алгоритм сортировки, как и сортировка вставкой.
Сортировка пузырьков иногда упоминается как «тонущая сортировка».
Например, в книге Дональда Кнута «Искусство программирования», том 3: Сортировка и поиск, он заявляет в разделе 5.2.1 «Сортировка вставкой», что [значение] «устанавливается равным его надлежащий уровень »и что этот метод сортировки иногда называют техникой просеивания или погружения.
Эти дебаты увековечиваются из-за легкости, с которой можно рассматривать этот алгоритм с двух разных, но одинаково обоснованных точек зрения:
Бывший генеральный директор Google Эрик Шмидт спросите тогдашний кандидат в президенты Барак Обама однажды во время интервью о том, как лучше всего отсортировать один миллион целых чисел - и Обама, сделав паузу на мгновение, ответил: «Я думаю, что это пузырь. было бы неправильным путем ".
Викибук Реализация алгоритма имеет страницу по теме: Пузырьковая сортировка |
Викискладе есть материалы, связанные с пузырьковой сортировкой. |
В Викиверситете есть учебные ресурсы по пузырьковой сортировке |