"Пузырьковая сортировка" (Bubble sort)

характеристикизначения
сложность в лучшем 1
сложность в среднем
сложность в худшем
дополнительная память
стабильная ли?

1 : В лучшем случае достигается линейная сложность, например, если массив отсортирован по возрастанию. Только в случае, если использовать ускоренную реализацию (реализация ниже с break)

Алгоритм

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

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

Преимущества алгоритма

  1. Не используется дополнительная память.
  2. Для маленьких массивов предпочтительнее, чем другие алгоритмы. Я помню, что я находил статью в третьем классе на стакоферфлоу, там делали сети сортировок. TODO
  3. Относительная простота в написание кода.

Недостатки алгоритма

Сложность - .

Почему такое название алгоритма?

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

Обычная версия алгоритма

void bubbleSort(int* a, int n) {
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n - 1; j++) {
      if (a[j] > a[j + 1]) {
        std::swap(a[j], a[j + 1]);
      }
    }
  }
}

Ускоренная версия алгоритма

Если во втором цикле ни один элемент не поменялся местами с соседом, значит, что массив уже отсортирован — можно выйти из функции сортировки.

void bubbleSort(int* a, int n) {
  for (int i = 0; i < n; i++) {
    bool is_any_swapped = false;
    for (int j = 0; j < n - 1; j++) {
      if (a[j] > a[j + 1]) {
        std::swap(a[j], a[j + 1]);
        is_any_swapped = true;
      }
    }
    if (!is_any_swapped) {
      break;
    }
  }
}

Запуск функции сортировки bubbleSort(array, size);

Доказательство сложности алгоритма

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

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

Вообще можно всегда пользоваться такой мудростью "если в коде есть два цикла, то это похоже на ".

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

Ввод:

1 9 45 7 -2

Работа алгоритма: Алгоритм попарно сравнивает 1 с 9, 9 с 45, 45 с 7 (меняет их местами), 45 с -2 (меняет их местами), а потом идёт с самого начала, но уже с обновлённым массивом

Вывод:

-2 1 7 9 45
Last change: 2023-10-16, commit: 0f1c938