Сортировка пузырьком
Описание
Сортировка пузырьком — это простой алгоритм сортировки, который многократно проходит по массиву, сравнивает соседние элементы и меняет их местами, если они стоят в неправильном порядке. Процесс повторяется, пока массив не будет полностью отсортирован.
Зачем это нужно
Хотя сортировка пузырьком редко используется в продакшене из-за низкой эффективности, она является отличным учебным алгоритмом для понимания принципов сортировки, сравнения элементов и обмена значений. Это база для понимания более сложных алгоритмов сортировки.
Визуализация
Как работает алгоритм
Сортировка пузырьком получила своё название из-за того, как большие элементы постепенно «всплывают» в конец массива, подобно пузырькам воздуха в воде. Алгоритм совершает несколько проходов по массиву, меняя местами соседние элементы, стоящие в неправильном порядке.
1. Начало с первого элемента
Начинаем с первого элемента массива. Будем сравнивать каждую пару соседних элементов при проходе слева направо.
2. Сравнение соседних элементов
Сравниваем текущий элемент со следующим. Если текущий элемент больше следующего, значит они стоят в неправильном порядке.
3. Обмен при необходимости
Если элементы стоят в неправильном порядке, меняем их местами. Возможны два варианта:
- arr[j] > arr[j+1] — меняем элементы местами, больший элемент сдвигается вправо.
- arr[j] ≤ arr[j+1] — обмен не нужен, переходим к следующей паре.
4. Повторение проходов
После одного полного прохода наибольший из неотсортированных элементов гарантированно оказывается в конце. Повторяем проходы для оставшейся неотсортированной части, пока обмены не прекратятся — массив отсортирован.
Проход 1: [5,3,8,1,2] → [3,5,8,1,2] → [3,5,8,1,2] → [3,5,1,8,2] → [3,5,1,2,8]. Наибольший элемент 8 теперь в конце.
Проход 2: [3,5,1,2,8] → [3,5,1,2,8] → [3,1,5,2,8] → [3,1,2,5,8]. Элемент 5 на месте. Продолжаем до отсортированного: [1,2,3,5,8].
Сложность
Анализ сложности
Временная сложность
O(n) — лучший случай, когда массив уже отсортирован. С оптимизацией (проверка, были ли обмены) алгоритм делает один проход и завершает работу.
O(n²) — средний случай. Для случайно упорядоченного массива алгоритм совершает примерно n²/2 сравнений и n²/4 обменов в среднем.
O(n²) — худший случай, когда массив отсортирован в обратном порядке. Каждую пару соседних элементов нужно обменять на каждом проходе, что даёт n·(n-1)/2 сравнений.
Пространственная сложность
O(1) — сортировка пузырьком выполняется «на месте». Она использует лишь константный объём дополнительной памяти для временных переменных при обмене (и флаг swapped для оптимизации).
Стабильная сортировка — равные элементы не меняют относительный порядок, потому что обмен происходит только когда arr[j] > arr[j+1] (строго больше), а не при равенстве.
Ключевая оптимизация — отслеживание, были ли обмены во время прохода. Если полный проход завершён без единого обмена, массив уже отсортирован и алгоритм может немедленно остановиться. Это улучшает производительность в лучшем случае с O(n²) до O(n).
Пример кода
function bubbleSort(arr: number[]): void {const n = arr.length;for (let i = 0; i < n - 1; i++) {let swapped = false;// Last i elements are already in placefor (let j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j + 1]) {// Swap adjacent elements[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];swapped = true;}}// If no swaps occurred, array is sortedif (!swapped) break;}}// Usage exampleconst unsorted = [64, 34, 25, 12, 22, 11, 90];const sorted = [...unsorted]; // Copy to avoid mutating originalbubbleSort(sorted);console.log(sorted); // [11, 12, 22, 25, 34, 64, 90]
Примеры использования в реальных задачах
Обучение принципам сортировки
Сортировка пузырьком — самый интуитивный алгоритм сортировки для новичков. Он наглядно демонстрирует ключевые концепции: сравнение элементов, обмен значений и повторение до полной отсортированности. Большинство курсов по информатике начинают с неё.
Почти отсортированные данные
Когда данные уже почти отсортированы (лишь несколько элементов не на месте), сортировка пузырьком с ранним завершением может быть весьма эффективной — она завершает работу за O(n) всего за один-два прохода.
Малые наборы данных
Для очень маленьких массивов (5–10 элементов) простота сортировки пузырьком может сделать её конкурентоспособной с более сложными алгоритмами благодаря низким накладным расходам и хорошей локальности кэша.
Проверка отсортированности массива
Один проход сортировки пузырьком (без обменов) — это по сути проверка O(n) того, отсортирован ли уже массив. Полезно как предварительная проверка перед запуском более дорогого алгоритма.
Графика и заливка полигонов
В компьютерной графике сортировка пузырьком иногда используется для небольших списков в алгоритмах заливки полигонов и сортировки по глубине, где количество элементов невелико и простота важнее асимптотической производительности.