Bubble Sort-Algorithmus in Java: Array-Sortierprogramm und Beispiel

โšก Intelligente Zusammenfassung

Bubble Sort-Algorithmus in Java Es vergleicht wiederholt benachbarte Array-Elemente und vertauscht sie, bis die Sequenz geordnet ist. Dieser Artikel erklรคrt den Funktionsmechanismus, den Pseudocode und die vollstรคndige Beschreibung. Java Implementierung, optimierte Variante, Komplexitรคtsanalyse und praktische Vergleiche mit anderen Sortierverfahren.

  • ๐Ÿ”„ Kernprinzip: Vergleiche jedes benachbarte Paar und tausche die Werte, wenn der linke Wert den rechten Wert รผbersteigt. Das grรถรŸte Element wird dabei an das Ende jedes Durchlaufs verschoben.
  • ๐Ÿงฎ Passstruktur: Ein Array mit n Elementen benรถtigt hรถchstens n-1 Durchlรคufe, und jeder Durchlauf verkรผrzt den unsortierten Bereich um eine Position.
  • โ˜• Java Implementierung: Zwei verschachtelte for-Schleifen und eine temporรคre Variable fรผhren den Tausch durch, ohne dass eine zusรคtzliche Array-Allokation erforderlich ist.
  • โšก Optimierungstechnik: Ein boolescher Wert, der das Flag โ€žswappedโ€œ setzt, beendet die รคuรŸere Schleife vorzeitig und reduziert so die Laufzeit im besten Fall von quadratisch auf linear.
  • ๏ธ Komplexitรคtsprofil: Die schlechteste und durchschnittliche Laufzeit betrรคgt O(nยฒ), im besten Fall O(n) bei Optimierung, und der zusรคtzliche Speicherplatz bleibt bei O(1).
  • ๏ธ Algorithmenvergleich: Quicksort und Heapsort sind รผberlegen. Bubble Sort auf groรŸen Datensรคtzen, aber Bubble Sort bleibt stabil.
  • ๐ŸŽฏ Praktischer Nutzen: Wรคhlen Bubble Sort fรผr Lehrzwecke, winzige Arrays oder nahezu sortierte Daten.

Bubble Sort-Algorithmus in Java

Was ist Bubble Sortieren?

Bubble Sort ist ein einfacher, auf Vergleichen basierender Sortieralgorithmus, der das erste Element des Arrays mit dem nรคchsten vergleicht. Ist das aktuelle Element numerisch grรถรŸer als das nรคchste, werden die Elemente vertauscht. Der Algorithmus durchlรคuft dabei alle Elemente des Arrays.

Der Algorithmus verdankt seinen Namen der Art und Weise, wie der grรถรŸte Wert im unsortierten Bereich stetig zu seiner endgรผltigen Position aufsteigt, รคhnlich einer Wasserblase, die an die Oberflรคche gelangt. Nach dem ersten Durchlauf befindet sich das grรถรŸte Element am letzten Index. Nach dem zweiten Durchlauf wird das zweitgrรถรŸte Element an seiner Position fixiert, und der Prozess wiederholt sich, bis das Array vollstรคndig sortiert ist.

In diesem Artikel werden wir ein Java Programm zur Umsetzung BubblSortieren Sie die Ergebnisse. รœberprรผfen Sie die Ausgabe des Codes, um die Programmlogik zu verstehen, und sehen Sie sich anschlieรŸend die optimierte Version und die Komplexitรคtsanalyse an.

Wie funktioniert das? BubblFunktioniert der Sortieralgorithmus?

BubblDer Sortieralgorithmus durchlรคuft das Array in mehreren Durchlรคufen. Jeder Durchlauf geht vom ersten Index bis zum Ende des aktuell unsortierten Bereichs, vergleicht benachbarte Werte und tauscht sie.ping Sie werden immer dann verschoben, wenn sie in der falschen Reihenfolge erscheinen. Da der grรถรŸte verbleibende Wert immer ganz rechts im unsortierten Bereich liegt, verkleinert sich der Bereich nach jedem Durchlauf um genau eine Position.

Der gesamte Prozess lรคsst sich in vier wiederholbare Schritte unterteilen:

  1. Vergleichen Sie: Vergleiche das Element am Index j-1 mit dem Element am Index j.
  2. Swap: Ist das linke Element grรถรŸer als das rechte Element, werden die beiden Werte mithilfe einer temporรคren Variable vertauscht.
  3. Vorauszahlung: Gehen Sie jeweils eine Position nach rechts und wiederholen Sie den Vorgang, bis Sie das Ende des unsortierten Bereichs erreicht haben.
  4. Wiederholen: Beginne einen neuen Durchlauf รผber eine Region, die ein Element kรผrzer ist, und beende ihn nach n-1 Durchlรคufen oder wenn ein Durchlauf keine Vertauschungen mehr durchfรผhrt.

In der nachstehenden Tabelle tracDas Beispielarray {860, 8, 200, 9}, das spรคter auf dieser Seite im Programm verwendet wird, zeigt genau, welcher Wert am Ende jedes Durchlaufs seine endgรผltige Position einnimmt.

Passieren Array am Anfang des Durchlaufs Durchgefรผhrte Vergleiche Array am Ende des Durchlaufs Element gesperrt
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

Beachten Sie, dass im dritten Durchlauf ein Vergleich, aber kein Tausch durchgefรผhrt wird. Eine optimierte Implementierung erkennt diesen Zustand und stoppt sofort. Dies ist die mit Abstand wertvollste Verbesserung, die Sie an diesem Algorithmus vornehmen kรถnnen.

BubblPseudocode des Sortieralgorithmus

Vor dem Schreiben Java Die Syntax hilft dabei, die Logik in sprachneutralem Pseudocode auszudrรผcken. Die untenstehende Version enthรคlt das Flag fรผr vorzeitiges Beenden und deckt somit sowohl das klassische als auch das optimierte Verhalten ab.

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

Die รคuรŸere Schleife steuert die Anzahl der Durchlรคufe, die innere Schleife die Vergleiche innerhalb eines einzelnen Durchlaufs. Die obere Grenze der inneren Schleife ist n โ€“ i โ€“ 1, da die letzten i Positionen bereits ihre endgรผltigen Werte enthalten.

Java Programm zur Umsetzung Bubble Sortieren

Das folgende Programm sortiert ein Integer-Array aufsteigend. Zusรคtzliche print-Anweisungen wurden absichtlich innerhalb der Schleifen eingefรผgt, da das Lesen der einzelnen Durchlรคufe schwierig ist. trace ist der schnellste Weg fรผr einen Anfรคnger zu verstehen, wie sich die Swaps anhรคufen.

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

    }
}

Ausgang:

---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 Erlรคuterung: Das Bubble-Sort Die Methode erhรคlt das Array als Referenz, sodass der Aufrufer das sortierte Ergebnis ohne Rรผckgabewert sieht. Die Variable Temp. speichert wรคhrend des Dreizeilentauschs einen Wert, weshalb der Algorithmus nur O(1) zusรคtzlichen Speicher benรถtigt. Der Ausdruck n โ€“i Die Bedingung in der inneren Schleife garantiert, dass bereits sortierte Positionen am Ende der Schleife niemals erneut besucht werden.

Optimiert Bubble Programm sortieren in Java

Das obige Programm fรผhrt stets n-1 Durchlรคufe aus, selbst wenn das Array frรผhzeitig sortiert ist. Durch Hinzufรผgen eines einzelnen booleschen Flags lรคsst sich diese Ineffizienz beheben. Wenn ein vollstรคndiger Durchlauf ohne einen einzigen Tauschvorgang abgeschlossen ist, ist das Array garantiert sortiert und die รคuรŸere Schleife kann sofort beendet werden.

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

Ausgang:

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

Das Eingabe-Array war bereits sortiert, daher benรถtigte die optimierte Version nur einen Durchlauf anstatt vier. Bei nahezu sortierten Daten wandelt diese ร„nderung eine quadratische Arbeitslast in eine nahezu lineare um, was der Hauptgrund dafรผr ist. Bubble Sort taucht auch heute noch gelegentlich in realem Code auf.

Zeitkomplexitรคt und Speicherkomplexitรคt von Bubble Sortieren

Die Komplexitรคt beschreibt, wie die Laufzeit mit zunehmender EingabegrรถรŸe ansteigt. Bubble Sortieren Die Anzahl der Vergleiche in der nicht optimierten Version ist auf n(n-1)/2 festgelegt, was sie eindeutig in die Klasse der quadratischen Algorithmen einordnet.

Szenario Eingabebedingung Zeitliche Komplexitรคt Raumkomplexitรคt
bester Fall Array bereits sortiert, optimierte Version O (n) O (1)
Durchschnittlicher Fall Elemente in zufรคlliger Reihenfolge O(nยฒ) O (1)
Schlimmsten Fall Array in umgekehrter Reihenfolge sortiert O(nยฒ) O (1)

Weil jeder Austausch innerhalb des ursprรผnglichen Arrays stattfindet und nur eine temporรคre Variable verwendet wird, Bubble Sort ist ein In-Place-Algorithmus mit O(1) zusรคtzlichem Speicherplatz. Es handelt sich auรŸerdem um einen stabilen Sortieralgorithmus, d. h., zwei Datensรคtze mit demselben Schlรผssel behalten nach dem Sortieren ihre ursprรผngliche relative Reihenfolge bei.

Vor- und Nachteile von Bubble Sortieren

Das Verstรคndnis beider Seiten hilft Ihnen zu entscheiden, wann der Algorithmus eine akzeptable Wahl ist und wann er ersetzt werden sollte.

Vorteile

  • Einfachheit: Die Logik passt in etwa zehn Zeilen, was es einfach macht, sie unter Interviewbedingungen korrekt zu formulieren.
  • Betrieb vor Ort: Es wird kein Hilfsarray zugewiesen, sodass der Speicherverbrauch nicht mit der EingabegrรถรŸe ansteigt.
  • Stabilitรคt: Gleiche Schlรผssel behalten ihre ursprรผngliche Reihenfolge, was beim Sortieren von Datensรคtzen nach einem sekundรคren Feld wichtig ist.
  • Frรผherkennung des Ausstiegs: Das vertauschte Flag kennzeichnet ein bereits sortiertes Array in einem einzigen Durchlauf.

Nachteile

  • Quadratisches Wachstum: Das Sortieren von 10,000 Elementen erfordert im schlimmsten Fall fast 50 Millionen Vergleiche.
  • Excessive schreibt: Der Algorithmus fรผhrt deutlich mehr Tauschvorgรคnge durch als Selection Sort, was speicherintensiv ist und langsame Schreibvorgรคnge erfordert.
  • Schlechte Skalierbarkeit: Bei Produktionsworkloads werden fast immer Quicksort, Mergesort oder die integrierte Arrays.sort-Methode bevorzugt.

๐Ÿ’ก Tipp: In Produktion Java Code, bevorzugt Arrays.sort () fรผr primitive und Collections.sort() fรผr Listen. Beide verwenden hochoptimierte Algorithmen, Dual-Pivot Quicksort bzw. TimSort, die einen handgeschriebenen Algorithmus รผbertreffen. Bubble Nach GrรถรŸenordnungen sortieren.

Bubble-Sortierung vs. andere Sortiermethoden Algorithms

Die folgende Tabelle vergleicht BubblSortieren Sie anschlieรŸend mit den Sortiertechniken, die Anfรคnger kennenlernen, damit Sie genau sehen kรถnnen, wo jede einzelne ihre Stรคrken hat.

Algorithmus besten Case Durchschnittlicher Fall Schlimmsten Fall Weltraum Stabil
Bubble Sortieren O (n) O(nยฒ) O(nยฒ) O (1) Ja
Auswahl Sortieren O(nยฒ) O(nยฒ) O(nยฒ) O (1) Nein
Sortieren durch Einfรผgen O (n) O(nยฒ) O(nยฒ) O (1) Ja
Schnelle Sorte O (n log n) O (n log n) O(nยฒ) O (log n) Nein
Haufen sortieren O (n log n) O (n log n) O (n log n) O (1) Nein

Bubble Sort und Insertion Sort haben denselben linearen Bestfall, aber Insertion Sort fรผhrt bei teilweise sortierten Daten weniger Vertauschungen durch. Selection Sort fรผhrt immer genau n-1 Vertauschungen durch, was ihn zu einem linearen Bestfall macht.tracQuicksort oder Heapsort sind die richtige Wahl, wenn Schreibvorgรคnge aufwรคndig sind, allerdings auf Kosten der Stabilitรคt. Fรผr Arrays mit mehr als einigen hundert Elementen sind Quicksort oder Heapsort die beste Lรถsung.

Sobald Sie mit den hier verwendeten Array-Traversierungsmustern vertraut sind, taucht dieselbe Schleifenstruktur in vielen klassischen รœbungen auf, wie zum Beispiel in der Fibonacci-Folge in Java und der Java Palindromprogramm. Revansehen Java Arrays und je breiter Java Lernprogramm wird die Grundlagen stรคrken, auf denen dieser Algorithmus beruht.

Hรคufig gestellte Fragen

Der Name spiegelt die Bewegung der Werte bei jedem Durchlauf wider. Das grรถรŸte verbleibende Element bewegt sich stetig zum Ende des Arrays, รคhnlich einer Blase, die durch Wasser aufsteigt, bis sie die Oberflรคche erreicht.

Es sind maximal n-1 Durchlรคufe erforderlich, was zu n(n-1)/2 Vergleichen fรผhrt. Mit der Optimierung durch vertauschte Flags ist ein sortiertes Array in einem Durchlauf fertig, da wรคhrend dieses Durchlaufs kein Austausch stattfindet.

Reverse Der Vergleichsoperator innerhalb der inneren Schleife. ร„ndern if (array[j-1] > array[j]) zu if (array[j-1] < array[j])Alle anderen Zeilen des Programms bleiben unverรคndert.

Ja. Ersetzen Sie den GrรถรŸer-als-Operator durch vergleichen mit() Fรผr String-Werte oder mit einem Comparator-Aufruf fรผr benutzerdefinierte Objekte. Die umgebende Schleifenstruktur und die Tauschlogik bleiben identisch.

Ja. KI-Assistenten erstellen zuverlรคssig funktionierende Ergebnisse. BubblSortieren Sie den Code, da dieses Muster in den Trainingsdaten sehr hรคufig vorkommt. รœberprรผfen Sie stets die Schleifengrenzen und testen Sie mit umgekehrten und doppelten Werten, bevor Sie dem Ergebnis vertrauen.

Ja. Interviewer nutzen es immer noch, um das logische Denken in Schleifen und die Komplexitรคtsanalyse zu testen. Das Verstรคndnis des Algorithmus ermรถglicht es auรŸerdem, zu beurteilen, ob KI-generierter Sortiercode effizient und nicht nur funktional ist.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: