Бульбашкове сортування – навчальні посібники зі структури даних і алгоритмів

Бульбашкове сортування є найпростішим алгоритм сортування який працює шляхом багаторазової заміни суміжних елементів, якщо вони розташовані в неправильному порядку. Цей алгоритм не підходить для великих наборів даних, оскільки його середня та найгірша часова складність досить висока.

Алгоритм бульбашкового сортування

В алгоритмі бульбашкового сортування

  • перейдіть зліва та порівняйте сусідні елементи, а вищий розміщено праворуч.
  • Таким чином, найбільший елемент спочатку переміщується в крайній правий кінець.
  • Потім цей процес продовжується, щоб знайти другий за величиною та розмістити його і так далі, доки дані не будуть відсортовані.
Рекомендована практика Сортування бульбашок Спробуйте!

Як працює бульбашкове сортування?

Давайте зрозуміємо роботу бульбашкового сортування за допомогою наступної ілюстрації:

введення: arr[] = {6, 0, 3, 5}

Перший прохід:

Найбільший елемент розміщується в правильному положенні, тобто в кінці масиву.

Алгоритм бульбашкового сортування: розміщення найбільшого елемента в правильному положенні

Другий прохід:

Розмістіть другий за величиною елемент у правильному положенні

Алгоритм бульбашкового сортування: розміщення другого за величиною елемента в правильному місці

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

Розташуйте решту двох елементів у правильному місці.

Алгоритм бульбашкового сортування: розміщення решти елементів у правильному місці

  • Загальна кількість пропусків: n-1
  • Загальна кількість порівнянь: n*(n-1)/2

Реалізація Bubble Sort

Нижче наведено реалізацію бульбашкового сортування. Його можна оптимізувати, зупинивши алгоритм, якщо внутрішній цикл не спричинив жодного обміну.

C++
// Optimized implementation of Bubble sort #include  using namespace std; // An optimized version of Bubble Sort 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]);  поміняно = правда;  } } // Якщо жодні два елементи не були поміняні місцями // за допомогою внутрішнього циклу, тоді розрив if (swapped == false) break;  } } // Функція друку масиву void printArray(int arr[], int size) { int i;  для (i = 0; i < size; i++)  cout  < < ' '  < < arr[i]; } // Driver program to test above functions int main() {  int arr[] = { 64, 34, 25, 12, 22, 11, 90 };  int N = sizeof(arr) / sizeof(arr[0]);  bubbleSort(arr, N);  cout  < < 'Sorted array: 
';  printArray(arr, N);  return 0; } // This code is contributed by shivanisinghss2110 
C
// Optimized implementation of Bubble sort #include  #include  void swap(int* xp, int* yp) {  int temp = *xp;  *xp = *yp;  *yp = temp; } // An optimized version of Bubble Sort 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]);  поміняно = правда;  } } // Якщо жодні два елементи не були поміняні місцями у внутрішньому циклі, // тоді переривається if (swapped == false) break;  } } // Функція друку масиву void printArray(int arr[], int size) { int i;  для (i = 0; i < size; i++)  printf('%d ', arr[i]); } // Driver program to test above functions int main() {  int arr[] = { 64, 34, 25, 12, 22, 11, 90 };  int n = sizeof(arr) / sizeof(arr[0]);  bubbleSort(arr, n);  printf('Sorted array: 
');  printArray(arr, n);  return 0; } 
Java
// Optimized java implementation of Bubble sort import java.io.*; class GFG {    // An optimized version of Bubble Sort  static void bubbleSort(int arr[], int n)  {  int i, j, temp;  boolean swapped;  for (i = 0; i  < n - 1; i++) {  swapped = false;  for (j = 0; j  < n - i - 1; j++) {  if (arr[j]>arr[j + 1]) { // Поміняти місцями arr[j] і arr[j+1] temp = arr[j];  arr[j] = arr[j + 1];  arr[j + 1] = темп;  поміняно = правда;  } } // Якщо жоден з двох елементів // не було поміняно місцями у внутрішньому циклі, тоді розрив if (swapped == false) break;  } } // Функція друку масиву static void printArray(int arr[], int size) { int i;  для (i = 0; i < size; i++)  System.out.print(arr[i] + ' ');  System.out.println();  }  // Driver program  public static void main(String args[])  {  int arr[] = { 64, 34, 25, 12, 22, 11, 90 };  int n = arr.length;  bubbleSort(arr, n);  System.out.println('Sorted array: ');  printArray(arr, n);  } } // This code is contributed // by Nikita Tiwari. 
Python3
# Optimized Python program for implementation of Bubble Sort def bubbleSort(arr): n = len(arr) # Traverse through all array elements for i in range(n): swapped = False # Last i elements are already in place for j in range(0, n-i-1): # Traverse the array from 0 to n-i-1 # Swap if the element found is greater # than the next element if arr[j]>arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] поміняно = True if (поміняно == False): break # Код драйвера для перевірки вище if __name__ == '__main__': arr = [64, 34, 25, 12, 22, 11, 90] bubbleSort(arr) print('Відсортований масив:') для i в діапазоні (len(arr)): print('%d' % arr[i], end=' ') # Цей код змінено Сураджем крушною Ядавом>>> C#   Javascript   
// Optimized javaScript implementation // of Bubble sort // An optimized version of Bubble Sort function bubbleSort(arr, n) {  var i, j, temp;  var swapped;  for (i = 0; i  < n - 1; i++)   {  swapped = false;  for (j = 0; j  < n - i - 1; j++)   {  if (arr[j]>arr[j + 1]) { // Поміняти місцями arr[j] і arr[j+1] temp = arr[j];  arr[j] = arr[j + 1];  arr[j + 1] = темп;  поміняно = правда;  } } // ЯКЩО жодних двох елементів не було // поміняно місцями у внутрішньому циклі, тоді розрив if (swapped == false) break;  } } // Функція друку масиву function printArray(arr, size) { var i;  для (i = 0; i < size; i++)  console.log(arr[i] + ' '); } // Driver program var arr = [ 64, 34, 25, 12, 22, 11, 90 ]; var n = arr.length; bubbleSort(arr, n); console.log('Sorted array: '); printArray(arr, n); // This code is contributed shivanisinghss2110 
PHP
 // PHP Optimized implementation // of Bubble sort // An optimized version of Bubble Sort function bubbleSort(&$arr) { $n = sizeof($arr); // Traverse through all array elements for($i = 0; $i  < $n; $i++) { $swapped = False; // Last i elements are already // in place for ($j = 0; $j  < $n - $i - 1; $j++) { // Traverse the array from 0 to // n-i-1. Swap if the element  // found is greater than the // next element if ($arr[$j]>$arr[$j+1]) { $t = $arr[$j]; $arr[$j] = $arr[$j+1]; $arr[$j+1] = $t; $swapped = True; } } // Якщо жодні два елементи не були поміняні місцями // у внутрішньому циклі, тоді розрив if ($swapped == False) break; } } // Код драйвера $arr = array(64, 34, 25, 12, 22, 11, 90); $len = sizeof($arr); bubbleSort($arr); echo 'Відсортований масив: 
'; for($i = 0; $i < $len; $i++) echo $arr[$i].' '; // This code is contributed by ChitraNayal. ?> 

Вихід
Sorted array: 11 12 22 25 34 64 90 

Аналіз складності бульбашкового сортування :

Часова складність: O(N 2 )
Допоміжний простір: О(1)

Переваги Bubble Sort:

  • Бульбашкове сортування легко зрозуміти та реалізувати.
  • Він не вимагає додаткового місця в пам'яті.
  • Це стабільний алгоритм сортування, тобто елементи з однаковим значенням ключа зберігають свій відносний порядок у відсортованому виведенні.

Недоліки Bubble Sort:

  • Сортування бульбашок має часову складність O(N 2 ), що робить його дуже повільним для великих наборів даних.
  • Бульбашкове сортування — це алгоритм сортування на основі порівняння, що означає, що для визначення відносного порядку елементів у наборі вхідних даних потрібен оператор порівняння. У деяких випадках це може обмежити ефективність алгоритму.

Деякі поширені запитання щодо бульбашкового сортування:

Що таке граничний випадок для бульбашкового сортування?

Бульбашкове сортування займає мінімум часу (порядку n), коли елементи вже відсортовано. Тому найкраще заздалегідь перевірити, чи масив уже відсортований чи ні, щоб уникнути O(N 2 ) часова складність.

Чи відбувається сортування на місці в бульбашковому сортуванні?

Так, бульбашкове сортування виконує заміну суміжних пар без використання будь-якої основної структури даних. Отже, алгоритм бульбашкового сортування є алгоритмом на місці.

Чи стабільний алгоритм бульбашкового сортування?

Так, алгоритм бульбашкового сортування стабільний.

Де використовується алгоритм бульбашкового сортування?

Через свою простоту бульбашкове сортування часто використовується для введення поняття алгоритму сортування. У комп’ютерній графіці він популярний завдяки своїй здатності виявляти крихітну помилку (наприклад, заміну лише двох елементів) у майже відсортованих масивах і виправляти її лише з лінійною складністю (2n).

Приклад: він використовується в алгоритмі заповнення багатокутником, де обмежувальні лінії сортуються за координатою x на певній лінії сканування (лінії, паралельній осі x), а зі збільшенням y їх порядок змінюється (два елементи міняються місцями) лише на перетині двох ліній.

Пов'язані статті:

  • Рекурсивне бульбашкове сортування
  • Практика кодування для сортування
  • Тест на сортування бульбашок
  • Аналіз складності бульбашкового сортування