Bubble Sort di Jawa

1. Pengenalan

Dalam artikel ringkas ini, kita akan meneroka algoritma Bubble Sort secara terperinci, dengan fokus pada implementasi Java.

Ini adalah salah satu algoritma penyusun yang paling mudah; idea intinya adalah untuk terus menukar unsur larik yang berdekatan jika mereka berada dalam urutan yang tidak betul sehingga koleksi disusun.

Item kecil "gelembung" ke bahagian atas senarai ketika kita mengulang struktur data. Oleh itu, teknik ini dikenali sebagai gelembung.

Oleh kerana penyortiran dilakukan dengan pertukaran, kita dapat mengatakan bahawa ia melakukan penyortiran di tempat.

Juga, jika dua elemen mempunyai nilai yang sama, data yang dihasilkan akan mengekalkan susunannya - yang menjadikannya semacam stabil.

2. Metodologi

Seperti yang telah disebutkan sebelumnya, untuk menyusun array, kami mengulanginya sambil membandingkan elemen yang berdekatan, dan menukarnya jika perlu. Untuk susunan ukuran n , kami melakukan lelaran seperti n-1 .

Mari kita ambil contoh untuk memahami metodologi. Kami ingin menyusun susunan dalam urutan menaik:

4 2 1 6 3 5

Kami memulakan lelaran pertama dengan membandingkan 4 dan 2; mereka pasti tidak mengikut urutan yang betul. Pertukaran akan mengakibatkan:

[2 4] 1 6 3 5

Sekarang, mengulangi perkara yang sama untuk 4 dan 1:

2 [1 4] 6 3 5

Kami terus melakukannya sehingga akhir:

2 1 [ 4 6] 3 5

2 1 4 [3 6] 5

2 1 4 3 [5 6]

Seperti yang dapat kita lihat, pada akhir lelaran pertama, kita mendapat elemen terakhir di tempatnya yang betul. Sekarang, yang perlu kita lakukan adalah mengulangi prosedur yang sama dalam lelaran selanjutnya. Kecuali, kami mengecualikan elemen yang sudah disusun.

Pada lelaran kedua, kita akan melakukan iterasi melalui keseluruhan array kecuali untuk elemen terakhir. Begitu juga, untuk lelaran ke-3, kita menghilangkan 2 elemen terakhir. Secara amnya, untuk lelaran k-th, kita mengulang sehingga indeks nk (tidak termasuk). Pada akhir lelaran n-1 , kita akan mendapatkan susunan yang disusun.

Sekarang setelah anda memahami tekniknya, mari selami pelaksanaannya.

3. Pelaksanaan

Mari kita laksanakan penyortiran untuk array contoh yang kita bincangkan menggunakan pendekatan Java 8:

void bubbleSort(Integer[] arr) { int n = arr.length; IntStream.range(0, n - 1) .flatMap(i -> IntStream.range(1, n - i)) .forEach(j -> { if (arr[j - 1] > arr[j]) { int temp = arr[j]; arr[j] = arr[j - 1]; arr[j - 1] = temp; } }); }

Dan ujian JUnit cepat untuk algoritma:

@Test public void whenSortedWithBubbleSort_thenGetSortedArray() { Integer[] array = { 2, 1, 4, 6, 3, 5 }; Integer[] sortedArray = { 1, 2, 3, 4, 5, 6 }; BubbleSort bubbleSort = new BubbleSort(); bubbleSort.bubbleSort(array); assertArrayEquals(array, sortedArray); }

4. Kerumitan dan Pengoptimuman

Seperti yang dapat kita lihat, secara purata dan yang paling teruk , kerumitan masa adalah O (n ^ 2) .

Di samping itu, kerumitan ruang , bahkan dalam senario terburuk, adalah O (1) kerana algoritma semacam Bubble tidak memerlukan memori tambahan dan penyortiran berlaku dalam susunan asal.

Dengan menganalisis penyelesaiannya dengan teliti, kita dapat melihat bahawa jika tidak ada pertukaran dalam lelaran, kita tidak perlu melakukan lelang lebih lanjut .

Sekiranya terdapat contoh yang dibincangkan sebelumnya, selepas lelaran ke-2, kita mendapat:

1 2 3 4 5 6

Pada lelaran ketiga, kita tidak perlu menukar sepasang elemen bersebelahan. Oleh itu, kita boleh melangkau semua lelaran yang tinggal.

Sekiranya terdapat susunan yang disusun, pertukaran tidak akan diperlukan dalam lelaran pertama itu sendiri - yang bermaksud kita dapat menghentikan pelaksanaannya. Ini adalah senario kes terbaik dan kerumitan masa algoritma adalah O (n) .

Sekarang, mari kita laksanakan penyelesaian yang dioptimumkan.

public void optimizedBubbleSort(Integer[] arr) { int i = 0, n = arr.length; boolean swapNeeded = true; while (i < n - 1 && swapNeeded) { swapNeeded = false; for (int j = 1; j  arr[j]) { int temp = arr[j - 1]; arr[j - 1] = arr[j]; arr[j] = temp; swapNeeded = true; } } if(!swapNeeded) { break; } i++; } }

Mari periksa output untuk algoritma yang dioptimumkan:

@Test public void givenIntegerArray_whenSortedWithOptimizedBubbleSort_thenGetSortedArray() { Integer[] array = { 2, 1, 4, 6, 3, 5 }; Integer[] sortedArray = { 1, 2, 3, 4, 5, 6 }; BubbleSort bubbleSort = new BubbleSort(); bubbleSort.optimizedBubbleSort(array); assertArrayEquals(array, sortedArray); }

5. Kesimpulan

Dalam tutorial ini, kami melihat bagaimana Bubble Sort berfungsi, dan pelaksanaannya di Java. Kami juga melihat bagaimana ia dapat dioptimumkan. Ringkasnya, ini adalah algoritma stabil di tempat, dengan kerumitan masa:

  • Kes terburuk dan Purata: O (n * n), apabila tatasusunan berada dalam urutan terbalik
  • Kes terbaik: O (n), apabila susunan sudah disusun

Algoritma ini popular dalam grafik komputer, kerana kemampuannya untuk mengesan beberapa kesalahan kecil dalam menyusun. Sebagai contoh, dalam susunan yang hampir disusun, hanya dua elemen yang perlu ditukar, untuk mendapatkan susunan yang disusun sepenuhnya. Bubble Sort dapat memperbaiki kesalahan seperti itu (mis. Susun susunan ini) dalam masa linear.

Seperti biasa, kod untuk pelaksanaan algoritma ini boleh didapati di GitHub.