Bubble Algoritam sortiranja u Java: Program za sortiranje polja i primjer

⚡ Pametni sažetak

Bubble Algoritam sortiranja u Java više puta uspoređuje susjedne elemente niza i zamjenjuje ih dok se niz ne uredi. Ovaj članak objašnjava mehanizam rada, pseudokod, potpuni Java implementacija, optimizirana varijanta, analiza složenosti i praktične usporedbe s drugim tehnikama sortiranja.

  • 🔄 Osnovni princip: Usporedite svaki susjedni par i zamijenite kada lijeva vrijednost premaši desnu vrijednost, pomičući najveći element na kraj svakog prolaza.
  • 🧮 Struktura propusnice: Niz od n elemenata zahtijeva najviše n-1 prolaza, a svaki prolaz skraćuje nesortirano područje za jednu poziciju.
  • ☕ Java provedba: Dvije ugniježđene for petlje plus privremena varijabla izvode zamjenu, ne zahtijevajući dodatnu alokaciju polja.
  • ⚡ Tehnika optimizacije: Booleova zamjena zastavice prerano prekida vanjsku petlju, smanjujući najbolje vrijeme s kvadratnog na linearno.
  • 🇧🇷 Profil složenosti: Najgore i prosječno vrijeme je O(n²), najbolji slučaj je O(n) kada je optimiziran, a pomoćni prostor ostaje na O(1).
  • ⚖️ Usporedba algoritama: Quicksort i Heap sortiranje nadmašuju Bubble Sortiraj na velikim skupovima podataka, a ipak BubblSortiranje ostaje stabilno.
  • 🎯 Praktična upotreba: Odaberite Bubble Sortiranje za podučavanje, male nizove ili gotovo sortirane podatke.

Bubble Algoritam sortiranja u Java

Što je Bubble Sortiraj?

BubblSortiranje je jednostavan algoritam sortiranja temeljen na usporedbi koji uspoređuje prvi element polja sa sljedećim. Ako je trenutni element polja numerički veći od sljedećeg, elementi se zamjenjuju. Slično tome, algoritam će proći kroz cijeli element polja.

Algoritam je dobio ime po načinu na koji se najveća vrijednost u nesortiranom području stalno penje do svoje konačne pozicije, slično mjehuriću koji se diže na površinu vode. Nakon prvog potpunog prolaza, najveći element zauzima posljednji indeks. Nakon drugog prolaza, drugi najveći element se zaključava na mjestu i proces se ponavlja sve dok niz nije potpuno uređen.

U ovom članku ćemo stvoriti Java program za provedbu Bubble Sortiraj. Provjerite izlaz koda koji će vam pomoći da shvatite logiku programa, a zatim pregledajte optimiziranu verziju i analizu složenosti koja slijedi.

Kako BubblRadi li algoritam sortiranja?

BubblSortiranje funkcionira ponovljenim prolaskom kroz niz. Svaki prolaz ide od prvog indeksa do kraja trenutno nesortiranog područja, uspoređujući susjedne vrijednosti i zamjenjujući ih.ping ih kad god se pojave u pogrešnom redoslijedu. Budući da najveća preostala vrijednost uvijek putuje u krajnju desnu stranu nesortiranog područja, područje se smanjuje za točno jednu poziciju nakon svakog prolaza.

Cijeli proces može se podijeliti u četiri koraka koja se mogu ponavljati:

  1. Usporedite: Usporedite element na indeksu j-1 s elementom na indeksu j.
  2. swap: Ako je lijevi element veći od desnog elementa, zamijenite dvije vrijednosti pomoću privremene varijable.
  3. unaprijed: Pomaknite se za jednu poziciju udesno i ponavljajte dok se ne dođe do kraja nesortiranog područja.
  4. Ponoviti: Započni novi prolaz preko regije koja je za jedan element kraća i zaustavi se nakon n-1 prolaza ili kada prolaz ne izvrši zamjene.

Tablica ispod tracje primjer niza {860, 8, 200, 9} korištenog u programu kasnije na ovoj stranici. Točno pokazuje koja vrijednost se na kraju svakog prolaza postavlja na svoju konačnu poziciju.

Proći Niz na početku prolaza Izvršene usporedbe Niz na kraju prolaza Element zaključan
1 860, 8, 200, 9 3 8, 200, 9, 860 860
2 8, 200, 9, 860 2 8, 9, 200, 860 200
3 8, 9, 200, 860 1 8, 9, 200, 860 9
4 8, 9, 200, 860 0 8, 9, 200, 860 8

Primijetite da treći prolaz izvodi usporedbu, ali ne i zamjenu. Optimizirana implementacija detektira taj uvjet i odmah se zaustavlja, što je najvrjednije poboljšanje koje možete primijeniti na ovaj algoritam.

BubblPseudokod algoritma sortiranja e

Prije pisanja Java sintaksa, pomaže u izražavanju logike u jezično neutralnom pseudokodu. Verzija u nastavku uključuje zastavicu ranog izlaza, tako da pokriva i klasično i optimizirano ponašanje.

procedure bubbleSort(array A, integer n)
    for i from 0 to n - 2 do
        swapped := false
        for j from 1 to n - i - 1 do
            // compare the adjacent pair
            if A[j - 1] > A[j] then
                swap A[j - 1] and A[j]
                swapped := true
            end if
        end for
        // no swap in a full pass means the array is sorted
        if swapped = false then
            break
        end if
    end for
end procedure

Vanjska petlja kontrolira broj prolaza, a unutarnja petlja kontrolira usporedbe unutar jednog prolaza. Gornja granica unutarnje petlje je n – i – 1 jer posljednjih i pozicija već sadrži svoje konačne vrijednosti.

Java Program za provedbu Bubble Razvrstaj

Sljedeći program sortira niz cijelih brojeva u rastućem redoslijedu. Dodatne naredbe ispisa su namjerno zadržane unutar petlji, jer čitanje prolaznog niza tracTo je najbrži način za početnike da shvate kako se swapovi akumuliraju.

package com.guru99;

public class BubbleSort {

    public static void main(String[] args)
    {
        int arr[] = {860, 8, 200, 9};

        System.out.println("---Array BEFORE Bubble Sort---");

        printArray(arr);

        bubbleSort(arr); //sorting array elements using bubble sort

        System.out.println("---Array AFTER Bubble Sort---");

        printArray(arr);

    }

    static void bubbleSort(int[] array)
    {
        int n = array.length;
        int temp = 0;
        for(int i = 0; i < n; i++) // Looping through the array length
        {   System.out.println("Sort Pass Number " + (i + 1));
            for(int j = 1; j < (n - i); j++)
            {
                System.out.println("Comparing " + array[j - 1] + " and " + array[j]);
                if(array[j - 1] > array[j])
                {
                    //swap elements
                    temp = array[j - 1];
                    array[j - 1] = array[j];
                    array[j] = temp;
                    System.out.println(array[j] + " is greater than " + array[j - 1]);
                    System.out.println("Swapping Elements: New Array After Swap");
                    printArray(array);
                }

            }
        }

    }

    static void printArray(int[] array){

        for(int i = 0; i < array.length; i++)
        {
            System.out.print(array[i] + " ");
        }
        System.out.println();

    }
}

Izlaz:

---Array BEFORE Bubble Sort---
860 8 200 9
Sort Pass Number 1
Comparing 860 and 8
860 is greater than 8
Swapping Elements: New Array After Swap
8 860 200 9
Comparing 860 and 200
860 is greater than 200
Swapping Elements: New Array After Swap
8 200 860 9
Comparing 860 and 9
860 is greater than 9
Swapping Elements: New Array After Swap
8 200 9 860
Sort Pass Number 2
Comparing 8 and 200
Comparing 200 and 9
200 is greater than 9
Swapping Elements: New Array After Swap
8 9 200 860
Sort Pass Number 3
Comparing 8 and 9
Sort Pass Number 4
---Array AFTER Bubble Sort---
8 9 200 860

Code obrazloženje: The Sortiranje mjehurićima Metoda prima niz referencom, tako da pozivatelj vidi sortirani rezultat bez ikakve povratne vrijednosti. Varijabla temp sadrži jednu vrijednost tijekom zamjene triju redaka, zbog čega algoritmu treba samo O(1) dodatne memorije. Izraz n – i u uvjetu unutarnje petlje jamči da se već sortirane pozicije na repu nikada ne posjećuju ponovno.

Optimizirano Bubble Razvrstaj program u Java

Gornji program uvijek izvodi n-1 prolaza, čak i kada se niz rano sortira. Dodavanje jedne logičke vrijednosti ispravlja tu neučinkovitost. Ako se cijeli prolaz završi bez ijedne zamjene, niz je zajamčeno sortiran i vanjska petlja može se odmah zaustaviti.

package com.guru99;

public class OptimizedBubbleSort {

    public static void main(String[] args) {
        int arr[] = {5, 12, 33, 47, 58};
        bubbleSort(arr);
        System.out.println(java.util.Arrays.toString(arr));
    }

    static void bubbleSort(int[] array) {
        int n = array.length;
        int passes = 0;
        for (int i = 0; i < n - 1; i++) {
            boolean swapped = false;
            for (int j = 1; j < n - i; j++) {
                if (array[j - 1] > array[j]) {
                    int temp = array[j - 1];
                    array[j - 1] = array[j];
                    array[j] = temp;
                    swapped = true;
                }
            }
            passes++;
            // Early exit: the array is already sorted
            if (!swapped) {
                break;
            }
        }
        System.out.println("Passes executed: " + passes);
    }
}

Izlaz:

Passes executed: 1
[5, 12, 33, 47, 58]

Ulazni niz je već bio sortiran, pa je optimizirana verzija završila nakon jednog prolaza umjesto četiri. Na gotovo sortiranim podacima ova promjena pretvara kvadratno opterećenje u gotovo linearno, što je glavni razlog. BubblSortiranje se još uvijek povremeno pojavljuje u stvarnom kodu.

Vremenska složenost i prostorna složenost Bubble Razvrstaj

Složenost opisuje kako vrijeme izvođenja raste s povećanjem ulazne veličine. Za BubblBroj usporedbi u neoptimiziranoj verziji sortiranja je fiksan na n(n-1)/2, što ga čvrsto smješta u kvadratnu klasu.

scenario Ulazni uvjet Složenost vremena Složenost prostora
Najbolji slučaj Niz je već sortiran, optimizirana verzija O (n) O (1)
Prosječan slučaj Elementi u nasumičnom redoslijedu O(n²) O (1)
Najgori slučaj Niz sortiran obrnutim redoslijedom O(n²) O (1)

Budući da se svaka izmjena događa unutar izvornog niza i koristi se samo jedna privremena varijabla, BubblSortiranje je algoritam na mjestu s O(1) pomoćnim prostorom. Također je stabilno sortiranje, što znači da dva zapisa s istim ključem zadržavaju svoj izvorni relativni redoslijed nakon sortiranja.

Prednosti i nedostaci Bubble Razvrstaj

Razumijevanje obje strane pomaže vam da odlučite kada je algoritam prihvatljiv izbor i kada ga treba zamijeniti.

Prednosti

  • Jednostavnost: Logika stane u otprilike deset redaka, što olakšava ispravno pisanje u uvjetima intervjua.
  • Rad na licu mjesta: Nije dodijeljen pomoćni niz, tako da korištenje memorije ne raste s veličinom ulaza.
  • Stabilnost: Jednaki ključevi zadržavaju svoj izvorni redoslijed, što je važno pri sortiranju zapisa po sekundarnom polju.
  • Rano otkrivanje izlaska: Zastavica zamjene identificira već sortirani niz u jednom prolazu.

Nedostaci

  • Kvadratni rast: Sortiranje 10 000 elemenata zahtijeva gotovo 50 milijuna usporedbi u najgorem slučaju.
  • Prekomjerno piše: Algoritam izvodi puno više zamjena nego sortiranje odabirom, koje je skupo za memoriju sa sporim operacijama pisanja.
  • Slaba skalabilnost: Produkcijska opterećenja gotovo uvijek favoriziraju Quicksort, Merge Sort ili ugrađenu metodu Arrays.sort.

💡 Savjet: U proizvodnji Java kod, preferiram Arrays.sort() za primitivce i Zbirke.sort() za popise. Oba koriste visoko podešene algoritme, Dual-Pivot Quicksort i TimSort, koji nadmašuju rukom pisani Bubble Sortiraj po redovima veličine.

Bubble Sortiranje u odnosu na druga sortiranja Algorithms

Donja tablica uspoređuje Bubble Sortirajte pomoću tehnika sortiranja koje početnici susreću sljedeće, tako da možete točno vidjeti gdje koja pobjeđuje.

Algoritam Najbolji slučaj Prosječan slučaj Najgori slučaj Prostor Stabilan
Bubble Razvrstaj O (n) O(n²) O(n²) O (1) Da
Sortiranje odabira O(n²) O(n²) O(n²) O (1) Ne
Sortiranje umetanja O (n) O(n²) O(n²) O (1) Da
quicksort O (n zapisnik n) O (n zapisnik n) O(n²) O (zapisnik n) Ne
Sortiranje po hrpi O (n zapisnik n) O (n zapisnik n) O (n zapisnik n) O (1) Ne

BubblSortiranje i sortiranje umetanjem dijele isti linearni najbolji slučaj, ali sortiranje umetanjem izvodi manje zamjena na djelomično sortiranim podacima. Sortiranje odabirom uvijek izvodi točno n-1 zamjena, što ga čini...tracposebno kada su zapisi skupi, iako žrtvuje stabilnost. Za bilo koji niz veći od nekoliko stotina elemenata, Quicksort ili Heap Sort je ispravan izbor.

Nakon što se upoznate s ovdje korištenim obrascima prolaska kroz nizove, ista struktura petlje pojavljuje se u mnogim klasičnim vježbama kao što je Fibonaccijev niz u Java i Java palindromski program. Reviewing Java nizovi i šire Java udžbenik ojačat će osnove na kojima ovaj algoritam ovisi.

Pitanja i odgovori

Naziv odražava kretanje vrijednosti tijekom svakog prolaza. Najveći preostali element ravnomjerno se kreće prema kraju niza, slično mjehuriću koji se diže kroz vodu dok ne dosegne površinu.

Potrebno je najviše n-1 prolaza, što rezultira n(n-1)/2 usporedbi. S optimizacijom zamjene zastavica, sortirani niz završava u jednom prolazu jer se tijekom tog prolaska ne događa zamjena.

Reverse operator usporedbe unutar unutarnje petlje. Promjena ako (polje[j-1] > polje[j]) do ako (polje[j-1] < polje[j])Svaki drugi redak programa ostaje nepromijenjen.

Da. Zamijenite operator "veće od" s usporedi s() za string vrijednosti ili s pozivom metode Comparator za prilagođene objekte. Struktura okolne petlje i logika zamjene ostaju identične.

Da. AI asistenti pouzdano proizvode radnu BubblSortiraj kod jer je uzorak izuzetno čest u podacima za obuku. Uvijek provjerite granice petlje i testirajte s obrnutim i dupliciranim vrijednostima prije nego što povjerujete izlazu.

Da. Anketari ga još uvijek koriste za testiranje zaključivanja u petlji i analize složenosti. Razumijevanje algoritma također vam omogućuje da procijenite je li kod za sortiranje generiran umjetnom inteligencijom učinkovit, a ne samo funkcionalan.

Sažmite ovu objavu uz: