Bubble Sorteeralgoritme in Java: Array-sorteerprogramma en voorbeeld

⚡ Slimme samenvatting

Bubble Sorteeralgoritme in Java Vergelijkt herhaaldelijk aangrenzende array-elementen en verwisselt ze totdat de volgorde correct is. Dit artikel legt het werkingsmechanisme, pseudocode en een complete beschrijving uit. Java Implementatie, geoptimaliseerde variant, complexiteitsanalyse en praktische vergelijkingen met andere sorteertechnieken.

  • 🔄 Kernprincipe: Vergelijk elk aangrenzend paar en wissel de elementen om wanneer de linkerwaarde groter is dan de rechterwaarde. Het grootste element wordt naar het einde van elke ronde verplaatst.
  • 🧮 Doorloopstructuur: Een array van n elementen vereist maximaal n-1 passes, waarbij elke pass het ongesorteerde gedeelte met één positie verkort.
  • ☕ Java Implementatie: Twee geneste for-lussen plus een tijdelijke variabele voeren de swap uit, waardoor geen extra array-allocatie nodig is.
  • ⚡ Optimalisatietechniek: Een boolean-vlag die wordt verwisseld, beëindigt de buitenste lus voortijdig, waardoor de complexiteit in het gunstigste geval van kwadratisch naar lineair wordt teruggebracht.
  • ​ Complexiteitsprofiel: De ergste en gemiddelde tijd is O(n²), in het beste geval is het O(n) wanneer geoptimaliseerd, en de extra ruimte blijft O(1).
  • ​ Algoritmevergelijking: Quicksort en Heap Sort presteren beter. Bubble Sorteren op grote datasets, toch Bubble Sort blijft stabiel.
  • 🎯 Praktisch gebruik: Kies Bubble Sorteerfunctie voor onderwijsdoeleinden, kleine arrays of bijna gesorteerde data.

Bubble Sorteeralgoritme in Java

Wat is Bubble Sorteren?

BubbleSort is een eenvoudig vergelijkingsalgoritme dat het eerste element van een array vergelijkt met het volgende. Als het huidige element numeriek groter is dan het volgende, worden de elementen verwisseld. Op deze manier doorloopt het algoritme alle elementen van de array.

Het algoritme dankt zijn naam aan de manier waarop de grootste waarde in het ongesorteerde gedeelte gestaag naar zijn uiteindelijke positie stijgt, net zoals een bubbel naar het wateroppervlak stijgt. Na de eerste volledige doorgang bevindt het grootste element zich op de laatste index. Na de tweede doorgang wordt het op één na grootste element vastgezet en herhaalt het proces zich totdat de array volledig geordend is.

In dit artikel gaan we een Java programma om te implementeren Bubble Sorteer. Controleer de uitvoer van de code om de programmalogica te begrijpen, en bekijk vervolgens de geoptimaliseerde versie en de complexiteitsanalyse die volgen.

Hoe doet de BubblWerkt het sorteeralgoritme?

BubbleSort werkt door herhaaldelijk door de array te gaan. Elke keer loopt de array van de eerste index naar het einde van het momenteel ongesorteerde gedeelte, waarbij aangrenzende waarden worden vergeleken en verwisseld.ping Ze worden verwijderd wanneer ze in de verkeerde volgorde verschijnen. Omdat de grootste overgebleven waarde altijd naar de uiterste rechterkant van het ongesorteerde gebied beweegt, krimpt het gebied na elke doorgang met precies één positie.

Het volledige proces kan worden onderverdeeld in vier herhaalbare stappen:

  1. Vergelijken: Vergelijk het element op index j-1 met het element op index j.
  2. swap: Als het linkerelement groter is dan het rechterelement, wissel dan de twee waarden om met behulp van een tijdelijke variabele.
  3. Van te voren: Schuif één positie naar rechts en herhaal dit totdat het einde van het ongesorteerde gebied is bereikt.
  4. Herhaling: Begin een nieuwe doorgang over een regio die één element korter is, en stop na n-1 doorgangen of wanneer een doorgang geen wisselingen uitvoert.

De tafel onder tracDe voorbeeldreeks {860, 8, 200, 9} die later in het programma op deze pagina wordt gebruikt, laat precies zien welke waarde aan het einde van elke iteratie op zijn uiteindelijke positie terechtkomt.

Passeren Array aan het begin van de pass Uitgevoerde vergelijkingen Array aan het einde van de doorgang Element vergrendeld
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

Merk op dat de derde stap een vergelijking uitvoert, maar geen verwisseling. Een geoptimaliseerde implementatie detecteert die situatie en stopt onmiddellijk, wat de meest waardevolle verbetering is die je op dit algoritme kunt toepassen.

Bubble Sort-algoritme pseudocode

Voor het schrijven Java Syntaxis helpt om de logica uit te drukken in taalneutrale pseudocode. De onderstaande versie bevat de vlag voor vroegtijdige beëindiging, waardoor zowel het klassieke als het geoptimaliseerde gedrag wordt afgedekt.

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

De buitenste lus bepaalt het aantal iteraties, en de binnenste lus bepaalt de vergelijkingen binnen één iteratie. De bovengrens van de binnenste lus is n – i – 1, omdat de laatste i posities al hun eindwaarden bevatten.

Java Programma ter implementatie Bubble Sorteren

Het volgende programma sorteert een array van gehele getallen in oplopende volgorde. Extra print-statements zijn opzettelijk binnen de lussen geplaatst, omdat het lezen van de pass-by-pass-uitvoer anders onnodig zou zijn. tracDit is de snelste manier voor een beginner om te begrijpen hoe de swaps zich ophopen.

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();

    }
}

Output:

---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 uitleg: De bubbleSort De methode ontvangt de array via referentie, waardoor de aanroeper het gesorteerde resultaat ziet zonder een retourwaarde. De variabele temp behoudt één waarde tijdens de drieregelige swap, waardoor het algoritme slechts O(1) extra geheugen nodig heeft. De uitdrukking n – i De voorwaarde in de binnenste lus garandeert dat reeds gesorteerde posities aan het einde nooit opnieuw worden bezocht.

Geoptimaliseerde Bubble Programma sorteren Java

Het bovenstaande programma voert altijd n-1 passes uit, zelfs als de array al vroeg gesorteerd is. Door een enkele boolean-vlag toe te voegen, wordt deze inefficiëntie verholpen. Als een volledige pass zonder één enkele swap is voltooid, is de array gegarandeerd gesorteerd en kan de buitenste lus direct stoppen.

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);
    }
}

Output:

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

De invoerarray was al gesorteerd, waardoor de geoptimaliseerde versie na één doorgang in plaats van vier klaar was. Bij bijna gesorteerde data verandert deze wijziging een kwadratische werklast in een bijna lineaire, wat de belangrijkste reden is. BubblSort komt nog steeds af en toe voor in echte code.

Tijdcomplexiteit en ruimtecomplexiteit van Bubble Sorteren

Complexiteit beschrijft hoe de looptijd toeneemt naarmate de invoergrootte toeneemt. Bubble Sorteer het aantal vergelijkingen in de niet-geoptimaliseerde versie, dat vaststaat op n(n-1)/2, waardoor het stevig in de kwadratische klasse valt.

Scenario Invoervoorwaarde Tijdcomplexiteit Complexiteit van de ruimte
Beste geval Array is al gesorteerd, geoptimaliseerde versie O (n) O (1)
gemiddeld geval Elementen in willekeurige volgorde O(n²) O (1)
Het slechtste geval Array gesorteerd in omgekeerde volgorde O(n²) O (1)

Omdat elke uitwisseling plaatsvindt binnen de oorspronkelijke array en er slechts één tijdelijke variabele wordt gebruikt, BubbleSort is een in-place sorteeralgoritme met O(1) hulpruimte. Het is ook een stabiele sorteermethode, wat betekent dat twee records met dezelfde sleutel hun oorspronkelijke relatieve volgorde behouden na het sorteren.

Voor- en nadelen van Bubble Sorteren

Door beide kanten te begrijpen, kun je beter bepalen wanneer een algoritme een acceptabele keuze is en wanneer het vervangen moet worden.

Voordelen

  • Eenvoud: De logica past in ongeveer tien regels, waardoor het gemakkelijk is om het correct te formuleren tijdens een sollicitatiegesprek.
  • In-situ werking: Er wordt geen hulparray toegewezen, waardoor het geheugenverbruik niet toeneemt met de grootte van de invoer.
  • Stabiliteit: Gelijke sleutels behouden hun oorspronkelijke volgorde, wat belangrijk is bij het sorteren van records op een secundair veld.
  • Vroegtijdige detectie van uitgangen: De 'swapperd'-vlag geeft aan dat de array al in één keer gesorteerd is.

Nadelen

  • Kwadratische groei: Het sorteren van 10,000 elementen vereist in het ergste geval bijna 50 miljoen vergelijkingen.
  • Overmatig schrijven: Het algoritme voert veel meer swaps uit dan Selection Sort, wat geheugenintensief is vanwege de trage schrijfbewerkingen.
  • Slechte schaalbaarheid: In productieomgevingen geven we bijna altijd de voorkeur aan Quicksort, Merge Sort of de ingebouwde Arrays.sort-methode.

💡Tip: In de maak Java code, liever Arrays.sort () voor primitieve volkeren en Collecties.sort() voor lijsten. Beide gebruiken zeer verfijnde algoritmes, respectievelijk Dual-Pivot Quicksort en TimSort, die beter presteren dan een handgeschreven lijst. Bubble Sorteer op orde van grootte.

Bubble Sorteermethode versus andere sorteermethoden Algorithms

De onderstaande tabel vergelijkt Bubble Sorteer met behulp van de sorteertechnieken die beginners hierna tegenkomen, zodat je precies kunt zien waar elke techniek in uitblinkt.

Algoritme Beste geval Gemiddeld geval Het slechtste geval Tussenruimte Stal
Bubble Sorteren O (n) O(n²) O(n²) O (1) Ja
Selectie sorteren O(n²) O(n²) O(n²) O (1) Nee
Invoegsortering O (n) O(n²) O(n²) O (1) Ja
Snel sorteren O (n log n) O (n log n) O(n²) O (log n) Nee
Heap Sorteren O (n log n) O (n log n) O (n log n) O (1) Nee

BubblSelectiesortering en invoegsortering hebben hetzelfde lineaire beste geval, maar invoegsortering voert minder wisselingen uit op gedeeltelijk gesorteerde gegevens. Selectiesortering voert altijd precies n-1 wisselingen uit, waardoor het op een bepaald moment beter presteert.tracQuicksort is nuttig wanneer schrijfbewerkingen veel tijd kosten, hoewel dit ten koste gaat van de stabiliteit. Voor arrays met meer dan een paar honderd elementen zijn Quicksort of Heapsort de juiste keuze.

Als je eenmaal vertrouwd bent met de hier gebruikte array-traversalpatronen, zul je dezelfde lusstructuur terugvinden in veel klassieke oefeningen, zoals de Fibonacci-reeks in Java en Java palindroomprogramma. Revkijken Java arrays en de bredere Java zelfstudie Dit zal de fundamenten versterken waarop dit algoritme is gebaseerd.

Veelgestelde vragen

De naam weerspiegelt de beweging van waarden tijdens elke doorgang. Het grootste resterende element beweegt gestaag naar het einde van de array, vergelijkbaar met een bubbel die door water stijgt tot aan het oppervlak.

Er zijn maximaal n-1 passes nodig, wat resulteert in n(n-1)/2 vergelijkingen. Met de optimalisatie met verwisselde vlaggen is een gesorteerde array in één pass voltooid, omdat er tijdens die doorloop geen uitwisseling plaatsvindt.

Reverse de vergelijkingsoperator binnen de binnenste lus. Wijzigen als (array[j-1] > array[j]) naar als (array[j-1] < array[j])Alle andere regels van het programma blijven ongewijzigd.

Ja. Vervang de groter-dan-operator door vergelijk met() Voor tekenreekswaarden, of met een Comparator-aanroep voor aangepaste objecten. De omringende lusstructuur en de wissellogica blijven identiek.

Ja. AI-assistenten leveren betrouwbaar werkende resultaten op. Bubble Sorteer de code omdat het patroon zeer vaak voorkomt in de trainingsdata. Controleer altijd de lusgrenzen en test met omgekeerde en dubbele waarden voordat u de uitvoer vertrouwt.

Ja. Interviewers gebruiken het nog steeds om lusredenering en complexiteitsanalyse te testen. Inzicht in het algoritme stelt je ook in staat om te beoordelen of door AI gegenereerde sorteercode efficiënt is in plaats van louter functioneel.

Vat dit bericht samen met: