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

Базовый Algorithms
≈ 2 мин чтения

Большие элементы всплывают вправо

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

static void bubbleSort(int[] a) {
    for (int end = a.length - 1; end > 0; end--) {
        boolean swapped = false;

        for (int i = 0; i < end; i++) {
            if (a[i] > a[i + 1]) {
                int tmp = a[i];
                a[i] = a[i + 1];
                a[i + 1] = tmp;
                swapped = true;
            }
        }

        if (!swapped) {
            return;
        }
    }
}

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

Зачем нужен флаг swapped

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

Сложность

В среднем и в худшем случае пузырьковая сортировка выполняет O(n²) сравнений. С оптимизацией через swapped уже отсортированный массив обрабатывается за O(n). Дополнительная память — O(1), потому что обмены происходят внутри исходного массива.

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