Bubble Sort
Terakhir diperbarui
Bubble sort adalah algoritma pengurutan yang berulang kali menyusuri list, membandingkan setiap pasangan elemen yang bersebelahan, lalu menukarnya jika urutannya salah. Setelah setiap putaran penuh, nilai terbesar yang tersisa sudah "menggelembung" ke posisi yang benar di ujung, sehingga setiap putaran memeriksa satu elemen lebih sedikit. Tekan Putar di atas untuk melihat perbandingan dan penukarannya, atau jalankan satu per satu.
Bubble sort adalah salah satu algoritma pengurutan yang paling mudah dipahami, sehingga sangat cocok sebagai algoritma pertama. Namun, waktu berjalannya yang O(n²) membuatnya tidak praktis untuk input yang besar.
Kompleksitas waktu dan ruang
| Kasus | Kompleksitas | Catatan |
|---|---|---|
| Kasus terbaik | O(n) | Sudah terurut, dengan pengecekan keluar lebih awal |
| Kasus rata-rata | O(n²) | Urutan acak |
| Kasus terburuk | O(n²) | Terurut terbalik |
| Ruang | O(1) | In-place, hanya satu variabel sementara |
| Stabil | Ya | Elemen yang sama mempertahankan urutan relatifnya |
Langkah demi langkah
| Langkah | Apa yang terjadi |
|---|---|
| 1 | Mulai dari awal array. |
| 2 | Bandingkan elemen saat ini dengan elemen berikutnya. |
| 3 | Jika urutannya salah, tukar keduanya. |
| 4 | Geser satu posisi ke kanan dan ulangi sampai ujung (satu putaran). |
| 5 | Ulangi putaran; setiap putaran menempatkan satu elemen lagi di ujung. |
| 6 | Berhenti saat satu putaran penuh tidak melakukan penukaran. |
Contoh penerapan
Mengurutkan [5, 2, 4, 1]:
| Putaran | Array | Aksi |
|---|---|---|
| 1 | [2, 4, 1, 5] | Tukar 5,2, lalu 5,4, lalu 5,1; 5 menggelembung ke ujung. |
| 2 | [2, 1, 4, 5] | 2,4 sudah urut; tukar 4,1; 4,5 sudah urut; 4 kini sudah di tempatnya. |
| 3 | [1, 2, 4, 5] | Tukar 2,1; sisanya sudah urut; 2 sudah di tempatnya. |
| 4 | [1, 2, 4, 5] | Satu putaran penuh tanpa penukaran, jadi array sudah terurut dan algoritma berhenti. |
Kapan memakai bubble sort
| Pakai saat | Hindari saat |
|---|---|
| Mengajar atau mempelajari cara kerja pengurutan berbasis perbandingan | Mengurutkan input besar, di mana O(n²) terlalu lambat |
Inputnya sangat kecil atau hampir terurut (dengan keluar lebih awal, mendekati O(n)) | Kamu butuh algoritma pengurutan umum tercepat: pakai quicksort atau merge sort |
| Kamu butuh pengurutan stabil dan in-place dengan kode yang sangat sedikit | Datanya berurutan acak dan performa penting |
| Mendeteksi apakah list pendek sudah terurut dalam satu putaran | Banyak penulisan itu mahal (misalnya flash memory); selection sort melakukan lebih sedikit penukaran |
Kode Bubble Sort
Implementasi Bubble Sort yang rapi dan siap dijalankan dalam Python, JavaScript, Java, C++, C, Pseudocode. Pilih bahasa, salin kodenya, atau buka langsung di Coddy Playground.
Kode Bubble Sort dalam Python
1def bubble_sort(a):2 n = len(a)3 for i in range(n - 1):4 swapped = False5 for j in range(n - 1 - i):6 if a[j] > a[j + 1]:7 a[j], a[j + 1] = a[j + 1], a[j]8 swapped = True9 if not swapped:10 break # no swaps means the list is already sorted11 return a12
13
14nums = [5, 1, 4, 2, 8]15print("Before:", nums)16bubble_sort(nums)17print("After: ", nums)Kode Bubble Sort dalam JavaScript
1function bubbleSort(a) {2 for (let end = a.length - 1; end > 0; end--) {3 let swapped = false;4 for (let j = 0; j < end; j++) {5 if (a[j] > a[j + 1]) {6 [a[j], a[j + 1]] = [a[j + 1], a[j]];7 swapped = true;8 }9 }10 if (!swapped) break; // Already sorted: stop early11 }12 return a;13}14
15const data = [5, 2, 9, 1, 7, 3];16console.log("Before:", data);17console.log("Sorted:", bubbleSort([...data]));Kode Bubble Sort dalam Java
1import java.util.Arrays;2
3public class Main {4 static void bubbleSort(int[] arr) {5 for (int i = arr.length - 1; i > 0; i--) {6 boolean swapped = false;7 for (int j = 0; j < i; j++) {8 if (arr[j] > arr[j + 1]) {9 int tmp = arr[j];10 arr[j] = arr[j + 1];11 arr[j + 1] = tmp;12 swapped = true;13 }14 }15 if (!swapped) break; // already sorted16 }17 }18
19 public static void main(String[] args) {20 int[] arr = {5, 1, 4, 2, 8, 3};21 System.out.println("Before: " + Arrays.toString(arr));22 bubbleSort(arr);23 System.out.println("After: " + Arrays.toString(arr));24 }25}Kode Bubble Sort dalam C++
1#include <iostream>2#include <utility>3#include <vector>4
5void printVec(const std::vector<int>& a) {6 for (int x : a) std::cout << x << " ";7 std::cout << "\n";8}9
10void bubbleSort(std::vector<int>& a) {11 for (size_t pass = 0; pass + 1 < a.size(); ++pass) {12 bool swapped = false;13 // Each pass bubbles the largest remaining value to the end14 for (size_t j = 0; j + 1 < a.size() - pass; ++j) {15 if (a[j] > a[j + 1]) {16 std::swap(a[j], a[j + 1]);17 swapped = true;18 }19 }20 if (!swapped) break; // already sorted21 }22}23
24int main() {25 std::vector<int> data = {5, 1, 4, 2, 8, 3};26 std::cout << "Before: ";27 printVec(data);28 bubbleSort(data);29 std::cout << "After: ";30 printVec(data);31 return 0;32}Kode Bubble Sort dalam C
1#include <stdbool.h>2#include <stdio.h>3
4void printArr(const int a[], int n) {5 for (int i = 0; i < n; i++) printf("%d ", a[i]);6 printf("\n");7}8
9void bubbleSort(int a[], int n) {10 for (int pass = 0; pass < n - 1; pass++) {11 bool swapped = false;12 // Each pass bubbles the largest remaining value to the end13 for (int j = 0; j < n - 1 - pass; j++) {14 if (a[j] > a[j + 1]) {15 int tmp = a[j];16 a[j] = a[j + 1];17 a[j + 1] = tmp;18 swapped = true;19 }20 }21 if (!swapped) break; // already sorted22 }23}24
25int main(void) {26 int data[] = {5, 1, 4, 2, 8, 3};27 int n = sizeof(data) / sizeof(data[0]);28 printf("Before: ");29 printArr(data, n);30 bubbleSort(data, n);31 printf("After: ");32 printArr(data, n);33 return 0;34}Kode Bubble Sort dalam Pseudocode
1DECLARE nums : ARRAY[1:7] OF INTEGER2DECLARE n : INTEGER3n ← 74nums[1] ← 75nums[2] ← 36nums[3] ← 97nums[4] ← 18nums[5] ← 59nums[6] ← 810nums[7] ← 211DECLARE i : INTEGER12DECLARE j : INTEGER13DECLARE temp : INTEGER14
15// Bubble the largest remaining value to the end on each pass16FOR i ← 1 TO n - 117 FOR j ← 1 TO n - i18 IF nums[j] > nums[j + 1] THEN19 temp ← nums[j]20 nums[j] ← nums[j + 1]21 nums[j + 1] ← temp22 ENDIF23 NEXT j24NEXT i25
26FOR i ← 1 TO n27 OUTPUT nums[i]28NEXT iFAQ Bubble Sort
Berapa kompleksitas waktu bubble sort?
O(n²) pada kasus rata-rata dan terburuk karena memakai loop bersarang. Dengan optimasi keluar lebih awal, bubble sort bisa mencapai O(n) pada array yang sudah terurut. Ruang tambahan yang dipakai O(1).Apakah bubble sort stabil?
Ya. Bubble sort hanya menukar elemen yang bersebelahan jika urutannya benar-benar salah, jadi elemen yang sama tidak pernah saling melewati dan tetap mempertahankan urutan relatif aslinya.
Mengapa disebut bubble sort?
Pada setiap putaran, nilai terbesar yang belum terurut bergerak selangkah demi selangkah menuju ujung array, seperti gelembung (bubble) yang naik ke permukaan. Karena itulah namanya "bubble" sort.
Apa perbedaan bubble sort dan insertion sort?
O(n²), stabil, dan in-place, tetapi cara memindahkan datanya berbeda: bubble sort berulang kali menukar pasangan bersebelahan yang urutannya salah, sedangkan insertion sort mengambil setiap elemen dan menggesernya mundur ke tempat yang benar di bagian awal yang sudah terurut. Insertion sort biasanya melakukan lebih sedikit penulisan dan lebih cepat dalam praktik, terutama pada data yang hampir terurut.Kapan sebaiknya memakai bubble sort, bukan quicksort?
O(n log n) milik quicksort jauh mengungguli O(n²) milik bubble sort, kecuali pada input yang sangat kecil. Bubble sort layak dipakai hanya saat list-nya sangat kecil atau hampir terurut, atau saat kamu ingin pengurutan stabil yang paling sederhana untuk mengajar.Apakah optimasi keluar lebih awal mengubah kasus terburuk bubble sort?
O(n) pada input yang sudah terurut, tetapi array yang terurut terbalik tetap membutuhkan setiap perbandingan, jadi kasus terburuknya tetap O(n²). Optimasi ini hanya membantu kasus terbaik dan kasus yang hampir terurut.