Сортировка пузырьком - простейший для понимания и реализации алгоритм сортировки. Эффективен только для небольших массивов, считается учебным и не применяется в практических задачах. С другой стороны, метод используется в учебных целях, поскольку лежит в основе некоторых других сортировок, более эффективных, таких как шейкерная (Коктейльная) сортировка, пирамидальная сортировка и быстрая сортировка.

Алгоритм сортировки

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

Визуализация работы алгоритма

Оптимизации

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

Саму пузырьковую сортировку можно различными способами улучшать и получать некоторые другие обменные алгоритмы:

  • Коктейльная сортировка. Двунаправленная пузырьковая сортировка. Дойдя до конца массива начинаем проход в начало, тем самым вытесняем большие элементы в конец, а маленькие - в начало массива.
  • Чётно-нечётная сортировка. За один проход нечётные индексы сравниваются с чётными, затем чётные — с нечётными.
  • Сортировка расчёской. Сравниваются не соседи, а элементы между которыми некоторое расстояние, уменьшающееся после каждого прохода по массиву.

Реализация алгоритма

void bubbleSort(int arr[], int n)
{
   int i, j;
   for (i = 0; i < n-1; i++)      

       // Last i elements are already in place   
       for (j = 0; j < n-i-1; j++) 
           if (arr[j] > arr[j+1])
              swap(&arr[j], &arr[j+1]);
}

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

static void BubbleSort(List<int> a)
        {
            bool NotSorted = true;
            while (NotSorted)
            {
                NotSorted = false;                  
                for (int i = 1; i < a.Count(); i++)
                {
                    if (a[i] < a[i - 1])
                    {
                        int temp = a[i];
                        a[i] = a[i - 1];
                        a[i - 1] = temp;
                        NotSorted = true;
                    }
                }
            }
        }

Характеристики алгоритма

Класс алгоритма Сортировки обменами
Структура данных массив
Худший случай $$\mathcal{O}(n^2)$$
Лучший случай $$\mathcal{O}(n)$$ с оптимизацией
Средний случай $$\mathcal{O}(n^2)$$
Доп. затраты на память $$\mathcal{O}(1)$$
Устойчивость Да

results matching ""

    No results matching ""