Menu
Coddy logo textTech

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

Последнее обновление

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

Это один из самых простых для понимания алгоритмов сортировки, что делает его отличным первым алгоритмом, но время выполнения O(n²) делает его непрактичным для больших входных данных.

Временная и пространственная сложность

СлучайСложностьПримечания
Лучший случайO(n)Уже отсортирован, с проверкой досрочного выхода
Средний случайO(n²)Случайный порядок
Худший случайO(n²)Отсортирован в обратном порядке
ПамятьO(1)На месте, только временная переменная
УстойчиваяДаРавные элементы сохраняют свой относительный порядок

Шаг за шагом

ШагЧто происходит
1Начните с начала массива.
2Сравните текущий элемент со следующим.
3Если они в неправильном порядке, поменяйте их местами.
4Сдвиньтесь на одну позицию вправо и повторяйте до конца (один проход).
5Повторяйте проходы; каждый проход фиксирует ещё один элемент в конце.
6Остановитесь, когда полный проход не сделает ни одного обмена.

Разобранный пример

Сортировка [5, 2, 4, 1]:

ПроходМассивДействие
1[2, 4, 1, 5]Обмен 5,2, затем 5,4, затем 5,1; 5 всплывает в конец.
2[2, 1, 4, 5]2,4 в порядке; обмен 4,1; 4,5 в порядке; 4 теперь на месте.
3[1, 2, 4, 5]Обмен 2,1; остальное уже в порядке; 2 на месте.
4[1, 2, 4, 5]Полный проход не делает обменов, поэтому массив отсортирован и алгоритм останавливается.

Когда использовать сортировку пузырьком

Используйте, когдаИзбегайте, когда
Вы обучаете или изучаете, как работают сортировки на основе сравненийВы сортируете большие входные данные, где O(n²) слишком медленно
Вход крошечный или почти отсортирован (с досрочным выходом приближается к O(n))Вам нужна самая быстрая универсальная сортировка — используйте quicksort или merge sort
Вам нужна устойчивая сортировка на месте почти без кодаДанные в случайном порядке и важна производительность
Вы определяете за один проход, отсортирован ли уже короткий списокМногочисленные записи дороги (напр. флеш-память); сортировка выбором делает меньше обменов

Код Bubble Sort

Чистая, готовая к запуску реализация Bubble Sort на Python, JavaScript, Java, C++, C. Выберите язык, скопируйте код или откройте его уже загруженным в плейграунде Coddy.

Код Bubble Sort на Python

Python
1def bubble_sort(a):2    n = len(a)3    for i in range(n - 1):4        swapped = False5        for j in range(n - 1 - i):6            if a[j] > a[j + 1]:7                a[j], a[j + 1] = a[j + 1], a[j]8                swapped = True9        if not swapped:10            break  # no swaps means the list is already sorted11    return a12
13
14nums = [5, 1, 4, 2, 8]15print("Before:", nums)16bubble_sort(nums)17print("After: ", nums)
Запустите этот код в плейграунде Python

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

Какова временная сложность сортировки пузырьком?
Сортировка пузырьком выполняется за время O(n²) в среднем и худшем случаях из-за вложенных циклов. С оптимизацией досрочного выхода она может достигать O(n) на уже отсортированном массиве. Она использует O(1) дополнительной памяти.
Является ли сортировка пузырьком устойчивой?
Да. Сортировка пузырьком меняет местами соседние элементы, только если они строго в неправильном порядке, поэтому равные элементы никогда не обгоняют друг друга и сохраняют свой исходный относительный порядок.
Почему её называют сортировкой пузырьком?
На каждом проходе наибольшее неотсортированное значение шаг за шагом перемещается к концу массива, как пузырёк, всплывающий на поверхность, отсюда и название «пузырьком».
В чём разница между сортировкой пузырьком и сортировкой вставками?
Обе выполняются за O(n²), устойчивы и работают на месте, но перемещают данные по-разному: сортировка пузырьком многократно меняет местами соседние неупорядоченные пары, тогда как сортировка вставками берёт каждый элемент и вставляет его на правильное место в отсортированном префиксе. Сортировка вставками обычно делает меньше записей и на практике быстрее, особенно на почти отсортированных данных.
Когда стоит использовать сортировку пузырьком вместо quicksort?
Почти никогда для реальных задач — среднее время O(n log n) у quicksort разгромно превосходит O(n²) сортировки пузырьком на всём, кроме крошечных входных данных. Сортировка пузырьком оправдана, только когда список очень мал или почти отсортирован, либо когда нужна максимально простая устойчивая сортировка для обучения.
Меняет ли оптимизация досрочного выхода худший случай сортировки пузырьком?
Нет. Отслеживание того, был ли на проходе хоть один обмен, позволяет сортировке пузырьком остановиться раньше и достичь O(n) на уже отсортированном входе, но массиву, отсортированному в обратном порядке, по-прежнему нужны все сравнения, поэтому худший случай остаётся O(n²). Оптимизация помогает только в лучшем и почти отсортированных случаях.
Coddy programming languages illustration

Освойте алгоритмы с Coddy

НАЧАТЬ