← Назад к вопросам

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

1.3 Junior🔥 91 комментариев
#Другое#Основы Java

Условие

Реализуйте алгоритм сортировки массива методом пузырька (Bubble Sort).

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

Пример

Входные данные: [64, 34, 25, 12, 22, 11, 90]

Выходные данные: [11, 12, 22, 25, 34, 64, 90]

Требования

  • Реализуйте базовый алгоритм
  • Добавьте оптимизацию: остановка, если на проходе не было обменов
  • Временная сложность O(n²)
  • Объясните, почему этот алгоритм называется "пузырьковая сортировка"

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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

Bubble Sort — один из самых простых, но наименее эффективных алгоритмов сортировки. Несмотря на его неэффективность для больших данных, он остаётся важным в обучении, так как демонстрирует базовые принципы алгоритмов сортировки.

Почему "пузырька"?

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

Базовый алгоритм

public class BubbleSort {
    public static void bubbleSort(int[] arr) {
        int n = arr.length;
        
        // Внешний цикл: количество проходов
        for (int i = 0; i < n - 1; i++) {
            // Внутренний цикл: сравнение и обмен соседних элементов
            for (int j = 0; j < n - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    // Обмен элементов
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }
}

Оптимизированная версия

Добавим флаг, чтобы остановиться, если на проходе не было обменов:

public class BubbleSortOptimized {
    public static void bubbleSort(int[] arr) {
        int n = arr.length;
        boolean swapped;
        
        for (int i = 0; i < n - 1; i++) {
            swapped = false;
            
            for (int j = 0; j < n - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    swapped = true;
                }
            }
            
            // Если обменов не было, массив отсортирован
            if (!swapped) {
                break;
            }
        }
    }
}

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

Для массива [64, 34, 25, 12, 22, 11, 90]:

Проход 1: Сравниваем соседние элементы и меняем их, если требуется:

  • 64, 34 → 34, 64 (обмен)
  • 64, 25 → 25, 64 (обмен)
  • 64, 12 → 12, 64 (обмен)
  • 64, 22 → 22, 64 (обмен)
  • 64, 11 → 11, 64 (обмен)
  • 64, 90 → 64, 90 (без обмена)

Результат: [34, 25, 12, 22, 11, 64, 90] — наибольший элемент на месте!

Проход 2: Самый большой элемент из оставшихся (64) занимает свою позицию и т.д.

Полная реализация с тестами

public class BubbleSortComplete {
    public static void bubbleSort(int[] arr) {
        int n = arr.length;
        boolean swapped;
        
        for (int i = 0; i < n - 1; i++) {
            swapped = false;
            
            for (int j = 0; j < n - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    swapped = true;
                }
            }
            
            if (!swapped) {
                break;
            }
        }
    }
    
    public static void main(String[] args) {
        int[] arr = {64, 34, 25, 12, 22, 11, 90};
        bubbleSort(arr);
        System.out.println(Arrays.toString(arr));
        // Вывод: [11, 12, 22, 25, 34, 64, 90]
    }
}

Анализ сложности

Временная сложность:

  • Худший случай: O(n²) — когда массив отсортирован в обратном порядке
  • Лучший случай: O(n) — когда массив уже отсортирован (с оптимизацией)
  • Средний случай: O(n²)

Пространственная сложность: O(1) — используем только переменные для обмена, без дополнительного выделения памяти.

Когда использовать Bubble Sort?

  • Образовательные цели — для изучения основ алгоритмов
  • Маленькие массивы — когда размер данных ≤ 10 элементов
  • Частично отсортированные данные — с оптимизацией быстро завершается
  • Практически НИКОГДА в production для больших данных

Альтернативы

Для реальных проектов используйте:

  • Quick Sort — в среднем O(n log n)
  • Merge Sort — гарантированно O(n log n)
  • Heap Sort — O(n log n), сортирует на месте
  • Arrays.sort() — встроенная оптимизированная сортировка Java