Бульбашкове сортування – навчальні посібники зі структури даних і алгоритмів
Бульбашкове сортування є найпростішим алгоритм сортування який працює шляхом багаторазової заміни суміжних елементів, якщо вони розташовані в неправильному порядку. Цей алгоритм не підходить для великих наборів даних, оскільки його середня та найгірша часова складність досить висока.
Алгоритм бульбашкового сортування
Рекомендована практика Сортування бульбашок Спробуйте!В алгоритмі бульбашкового сортування
- перейдіть зліва та порівняйте сусідні елементи, а вищий розміщено праворуч.
- Таким чином, найбільший елемент спочатку переміщується в крайній правий кінець.
- Потім цей процес продовжується, щоб знайти другий за величиною та розмістити його і так далі, доки дані не будуть відсортовані.
Як працює бульбашкове сортування?
Давайте зрозуміємо роботу бульбашкового сортування за допомогою наступної ілюстрації:
введення: 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 їх порядок змінюється (два елементи міняються місцями) лише на перетині двох ліній.
Пов'язані статті:
- Рекурсивне бульбашкове сортування
- Практика кодування для сортування
- Тест на сортування бульбашок
- Аналіз складності бульбашкового сортування