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.

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:
- Vergleichen Sie: Vergleiche das Element am Index j-1 mit dem Element am Index j.
- Swap: Ist das linke Element grรถรer als das rechte Element, werden die beiden Werte mithilfe einer temporรคren Variable vertauscht.
- Vorauszahlung: Gehen Sie jeweils eine Position nach rechts und wiederholen Sie den Vorgang, bis Sie das Ende des unsortierten Bereichs erreicht haben.
- 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.
