Bubble sort mengurutkan array dengan membandingkan dua angka yang bersebelahan, lalu menukarnya kalau urutannya salah. Satu kali jalan dari kiri ke kanan disebut satu pass. Di tiap pass, angka terbesar yang belum di tempatnya terdorong ke kanan, kayak gelembung yang naik ke permukaan.
🧪 Tebakan cepat: array-nya sudah urut,
[1, 2, 3, 4, 5]. Apa bubble sort tetap mengulang pass sampai habis? Tebak dulu, jawabannya ada di bagian "Berhenti lebih awal".
Cara kerjanya
Urutkan [64, 34, 25, 12, 22, 11, 90] dari kecil ke besar. Di pass 1, 64 dibandingkan dengan 34: lebih besar, jadi ditukar. Lalu dengan 25, ditukar lagi, begitu terus sampai ketemu 90 yang lebih besar, jadi 64 berhenti tepat sebelum 90.
| Pass | Yang terjadi | Array sesudahnya |
|---|---|---|
| 1 | 64 ditukar ke kanan sampai sebelum 90 | [34, 25, 12, 22, 11, 64, 90] |
| 2 | 34 ditukar ke kanan sampai sebelum 64 | [25, 12, 22, 11, 34, 64, 90] |
| 3 | 25 ditukar ke kanan sampai sebelum 34 | [12, 22, 11, 25, 34, 64, 90] |
| 4 | 22 ditukar dengan 11 | [12, 11, 22, 25, 34, 64, 90] |
| 5 | 12 ditukar dengan 11 | [11, 12, 22, 25, 34, 64, 90] |
| 6 | gak ada yang ditukar | [11, 12, 22, 25, 34, 64, 90] |
Sesudah tiap pass, ujung kanan array sudah urut dan gak perlu disentuh lagi.
function bubbleSort(arr) {
for (let i = 0; i < arr.length - 1; i++) {
for (let j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]; // tukar
}
}
}
return arr;
}
console.log(bubbleSort([64, 34, 25, 12, 22, 11, 90]).join(",")); // 11,12,22,25,34,64,90
- Loop luar (
i) menghitung pass. 7 angka butuh paling banyak 6 pass, jadii < arr.length - 1. - Loop dalam (
j) berjalan di pasangan tetangga,arr[j]danarr[j + 1]. Batasnyaarr.length - 1 - i, karena sesudahipass,iangka paling kanan sudah di tempatnya. if (arr[j] > arr[j + 1]): tukar cuma kalau yang kiri lebih besar.[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]menukar dua isi array dalam satu baris. Cara panjangnya pakai variabel bantu:const temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp;.return arrsesudah kedua loop. Bubble sort mengubah array aslinya, lalu mengembalikan array yang sama..join(",")menggabungkan isi array jadi satu teks, dipisah koma tanpa spasi.
Berhenti lebih awal
Kalau satu pass gak menukar apa pun, berarti semua tetangga sudah urut, dan sort-nya boleh berhenti. Caranya pakai flag swapped:
- Di awal tiap pass, tulis
let swapped = false;. - Waktu menukar, tulis juga
swapped = true;. - Sesudah loop dalam selesai, tulis
if (!swapped) break;.
Jawaban tebakan: tanpa swapped, array yang sudah urut tetap dicek pass demi pass sampai habis. Dengan swapped, cukup satu pass, lalu berhenti.
Seberapa lambat
Banyaknya data disebut n. 7 angka butuh 6 + 5 + 4 + 3 + 2 + 1 = 21 perbandingan. Loop di dalam loop seperti ini ditulis O(n²): datanya dua kali lipat, waktunya kira-kira empat kali lipat. 100 angka butuh 4.950 perbandingan, 200 angka sudah 19.900.
- Kasus rata-rata dan terburuk (misalnya data terbalik): O(n²).
- Kasus terbaik: data sudah urut dan pakai
swapped. Cukup satu pass, n - 1 perbandingan, jadi O(n): datanya dua kali lipat, waktunya dua kali lipat. Tanpaswapped, kasus terbaiknya tetap O(n²).
Bubble sort gampang dipahami, tapi terlalu lambat untuk data besar. Untuk kerja sehari-hari, JavaScript sudah punya arr.sort((a, b) => a - b).
⚠️ Jebakan yang sering ketemu
- Lupa
return arr. Function mengembalikanundefined, dan.join(",")sesudahnya bikin error. return arrdi dalam loop. Function berhenti sesudah pass pertama, jadi hasilnya masih[34, 25, 12, 22, 11, 64, 90]. Taruhreturn arrsesudah kedua loop selesai.- Angka yang ditulis langsung.
j < 6cuma pas untuk 7 angka. Pakaiarr.lengthsupaya jalan untuk array berapa pun panjangnya.
💡 Bubble sort itu stabil. Dua angka yang sama gak pernah ditukar (karena
>, bukan>=), jadi urutan aslinya tetap. Ini berguna waktu mengurutkan data seperti daftar siswa berdasarkan nilai.
TL;DR: Bubble sort membandingkan tetangga arr[j] dan arr[j + 1], lalu menukarnya kalau yang kiri lebih besar. Tiap pass mendorong angka terbesar yang tersisa ke kanan, jadi loop dalam cukup sampai arr.length - 1 - i. Jangan lupa return arr. Flag swapped menghentikan sort begitu satu pass gak menukar apa pun. Kecepatannya O(n²), dan O(n) untuk data yang sudah urut kalau pakai swapped.