Метод сортировки пузырьком - шпаргалка для начинающих

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

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

ВЛ Виктория Лебедеваавтор материала

Примеры

Первый проход:

(5 1 4 2 8) (1 5 4 2 8), здесь алгоритм сравнивает два первых элемента и меняет их местами, так как (5>1).

(1 5 4 2 8) (1 4 5 2 8), меняет элементы местами, так как {displaystyle 5>4}{displaystyle 5>4}(5>4)

(1 4 5 2 8) (1 4 2 5 8), меняет элементы местами, так как {displaystyle 5>2}(5>2)

(1 4 2 5 8) (1 4 2 5 8), ввиду того, что элементы стоят на своих местах ({displaystyle 8>5}8>5), алгоритм не меняет их местами.

Второй проход:

(1 4 2 5 8) (1 4 2 5 8)

(1 4 2 5 8) (1 2 4 5 8), меняет элементы местами, так как (4>2){displaystyle 4>2}

(1 2 4 5 8) (1 2 4 5 8)

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

Третий проход:

( 1 2 4 5 8) -> ( 1 2 4 5 8)
(1 2 4 5 8) -> (1 2 4 5 8)
(1 2 4 5 8) -> (1 2 4 5 8) )
(1 2 4 5 8 ) -> (1 2 4 5 8 )

Теперь массив отсортирован, и алгоритм может быть завершён.

Ниже в качестве примера приведена сортировка пузырьком С :

// C программа реализации пузырьковой сортировки

#include <stdio.h>

void swap(int *xp, int *yp)

{

int temp = *xp;

*xp = *yp;

*yp = temp;

}

// функция реализации пузырьковой сортировки

void bubbleSort(int arr[], int n)

{

int i, j;

for (i = 0; i < n-1; i++)

// Последние i элементы уже на месте

for (j = 0; j < n-i-1; j++)

if (arr[j] > arr[j+1])

swap(&arr[j], &arr[j+1]);

}

/* Функция вывода массива на экран */

void printArray(int arr[], int size)

{

int i;

for (i=0; i < size; i++)

printf("%d ", arr[i]);

printf("n");

}

// Программа тестирования функций, приведенных выше

int main()

{

int arr[] = {64, 34, 25, 12, 22, 11, 90};

int n = sizeof(arr)/sizeof(arr[0]);

bubbleSort(arr, n);

printf("Sorted array: n");

printArray(arr, n);

return 0;

}

Сортировка пузырьком Java

// Java программа реализации пузырьковой сортировки

class BubbleSort

{

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])

{

// меняем местами temp и arr[i]

int temp = arr[j];

arr[j] = arr[j+1];

arr[j+1] = temp;

}

}

/* Вывод массива на экран */

void printArray(int arr[])

{

int n = arr.length;

for (int i=0; i<n; ++i)

System.out.print(arr[i] + " ");

System.out.println();

}

// Метод, тестирующий функции, приведенные выше

public static void main(String args[])

{

BubbleSort ob = new BubbleSort();

int arr[] = {64, 34, 25, 12, 22, 11, 90};

ob.bubbleSort(arr);

System.out.println("Sorted array");

ob.printArray(arr);

}

}

Сортировка пузырьком Python

# Python реализация сортировки пузырьком

def bubbleSort(arr):

n = len(arr)

# Проход через все элементы массива

for i in range(n):

# Последние i элементы уже на месте

for j in range(0, n-i-1):

# проход массива от 0 до n-i-1

# Поменять местами, если найденный элемент больше

# чем следующий элемент

if arr[j] > arr[j+1] :

arr[j], arr[j+1] = arr[j+1], arr[j]

# Код тестирования

arr = [64, 34, 25, 12, 22, 11, 90]

bubbleSort(arr)

print ("Сортированный массив:")

for i in range(len(arr)):

print ("%d" %arr[i]),

Результат:

Сортированный массив:

11 12 22 25 34 64 90
Сортировка пузырьком Python

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

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

С/С++

// Оптимизированная реализация пузырьковой сортировки

#include <stdio.h>

void swap(int *xp, int *yp)

{

int temp = *xp;

*xp = *yp;

*yp = temp;

}

// Оптимизированная версия пузырьковой сортировки

void bubbleSort(int arr[], int n)

{

int i, j;

bool swapped;

for (i = 0; i < n-1; i++)

{

swapped = false;

for (j = 0; j < n-i-1; j++)

{

if (arr[j] > arr[j+1])

{

swap(&arr[j], &arr[j+1]);

swapped = true;

}

}

// Если в процессе прохода не было ни одной замены, то выход из функции

if (swapped == false)

break;

}

}

/* Функция вывода массива */

void printArray(int arr[], int size)

{

int i;

for (i=0; i < size; i++)

printf("%d ", arr[i]);

printf("n");

}

// Программа тестирования функций, приведенных выше

int main()

{

int arr[] = {64, 34, 25, 12, 22, 11, 90};

int n = sizeof(arr)/sizeof(arr[0]);

bubbleSort(arr, n);

printf("Сортированный массив: n");

printArray(arr, n);

return 0;

}

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

# Оптимизированная реализация Python3

# сортировки пузырьком

# Оптимизированная версия пузырьковой сортировки

def bubbleSort(arr):

n = len(arr)

# Проход через все элементы массива

for i in range(n):

swapped = False

# Последние i элементы уже

# на месте

for j in range(0, n-i-1):

# проход через массив от 0

# n-i-1. Поменять местами элементы, если

# найденный элемент больше

# следующего

if arr[j] > arr[j+1] :

arr[j], arr[j+1] = arr[j+1], arr[j]

swapped = True

# Если в процессе прохода не было ни одной замены,

# то выход из функции

if swapped == False:

break

# тестирующий код

arr = [64, 34, 25, 12, 22, 11, 90]

bubbleSort(arr)

print ("Сортированный массив :")

for i in range(len(arr)):

print ("%d" %arr[i],end=" ")

Метод пузырька C - результат сортировки:

Сортированный массив:

11 12 22 25 34 64 90

Худшая и средняя сложность времени: O (n * n). Наихудший случай возникает, когда массив отсортирован по обратному адресу.

Сложность наилучшего случая: O (n). Наилучший случай возникает, когда массив уже отсортирован.

Пограничные случаи: сортировка занимает минимальное время (порядок n), когда элементы уже отсортированы.

Сортировка на месте: Да.

Стабильность: Да.

В компьютерной графике пузырьковая сортировка популярна благодаря возможности обнаруживать мелкие ошибки (например, обмен всего двух элементов) в почти отсортированных массивах и исправлять ее только с линейной сложностью (2n ). Например, она используется в алгоритме заполнения полигонов, где ограничивающие линии сортируются по их координате x на определенной линии сканирования (линия, параллельная оси X ), и с увеличением Y их порядок меняется (два элемента меняются местами) только на пересечениях двух линий.

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

Пожалуйста, оставьте свои комментарии, если захотите поделиться дополнительной информацией про алгоритм сортировки пузырьком.

ВЛ Виктория Лебедеваавтор-переводчик статьи «Bubble Sort»

Комментарии

Оставьте свой комментарий
Пока никто не оставил комментариев