Gebrauch
Der Bubblesort wird gebraucht, um einen Array zu sortieren.
Während er einer der simpleren Sortierungsalgorithmen ist, ist er auch einer der weniger effizienten.
Spezifikationen
Der Bubblesort Algorithmus hat eine worst-case Performance von O(n2) Vergleiche, O(n2) Tauschungen und eine best-case Performance von O(n) Vergleiche, O(1) Tauschungen. Seine Durchschnittsperformance beträgt O(n2) Vergleiche, O(n2) Tauschungen.
Der Algorithmus braucht keine weiteren Arrays und hat somit jeweils eine Space-complexity von O(1).
Funktionsweise
Beim Bubblesort Algorithmus beginnt man am Anfang des Arrays und arbeitet sich so hoch.
Das Grundprinzip basiert darauf, dass ein Wert, welcher nie kleiner ist als ein anderer, der Grösste im Array ist. Dies kann zu nutzen gemacht werden, indem, dass man den ersten Wert des Arrays untersucht und ihn mit dem Wert vergleicht, dessen Index um eins grösser ist als sein eigener. Falls der untersuchte Wert grösser ist als der Verglichene, dann tauscht man dessen Plätze. Ansonsten fokussiert man sich neu auf den verglichenen Wert und vergleicht ihn mit dem Wert, dessen Index um eines grösser ist als der des nun neu fokussierten Wertes. Man vergleicht diese dann wieder auf die gleiche Weise, wie die ersten zwei.
Dies tut man so lange, bis man am Ende des Arrays angekommen ist. Da wir nun jeden Wert im Array miteinander verglichen und jenachdem ausgetauscht haben, wissen wir, dass der Wert am Ende des Arrays der Grösste im Array ist. Nun beginnt man wieder am Anfang des Arrays und führt das Prozedere nochmals durch, jedoch nur bis zum zweitletzten Index. Nach dem Vergleichen bis zum zweitletzten Index weiss man nun, dass der Wert am zweitletzten Index der zweitgrösste Wert im Array, beziehungsweise der Grösste ohne den letzten Wert im Array, ist. Dann wird der Algorithmus bis zum drittletzten Index weitergeführt. Dies wird alles so lange gemacht, bis der maximal zu untersuchende Index eins ist, denn dies bedeutet schlussendlich, dass der ganze Array sortiert wurde.
Beispielcode
Dies ist ein in Python geschriebener Beispielcode:
# arr ist der Array, welcher zu sortieren ist. Die Funktion gibt den sortierten Array zurück
def bubbleSort(arr):
# Der maximale Index, welcher der fokussierte Wert haben kann
max = len(arr) - 1
# Der fokussierte Index
focusedIndex = 0
# Der Index des Wertes, welcher mit dem Wert am fokussierten Index verglichen wird
comparedIndex = 1
# Sobald der maximal zu fokussierende Index 1 ist, ist der Array sortiert. Falls max anfangs schon kleiner als 1 ist, hat der Array so wenig Elemente, dass er schon sortiert ist
while max > 1:
# Falls der fokussierte Index dem maximal zu fokussierendem Index entspricht, wird der Algorithmus wieder vom Index null weitergeführt
if focusedIndex == max:
# Der maximal zu fokussierende Index muss nun um eins kleiner sein
max -= 1
# Man beginnt wieder am Anfang des Arrays => Der fokussierte Index ist wieder 0
focusedIndex = 0
# Der Index, mit dem verglichen wird, ist wieder 1
comparedIndex = 1
# Falls der Wert am fokussierten Index grösser ist als der am Verglichenen
if arr[focusedIndex] > arr[comparedIndex]:
# Die beiden Werte werden miteinander getauscht
arr[focusedIndex], arr[comparedIndex] = arr[comparedIndex], arr[focusedIndex]
# Nach jeder Iteration wird der fokussierte Index um eins erhöht
focusedIndex += 1
# Nach jeder Iteration wird der verglichene Index um eins erhöht
comparedIndex += 1
# Der sortierte Array wird zurückgegeben
return arr
Dies ist ein in Java geschriebener Beispielcode:
Es können selbstverständlich auch andere Datentypen gebraucht werden.
// arr ist der Array, welcher zu sortieren ist. Die Funktion gibt den sortierten Array zurück
public static int bubbleSort(int[] arr) {
// Der maximale Index, welcher der fokussierte Wert haben kann
int max = arr.length - 1;
// Der fokussierte Index
int focusedIndex = 0;
// Der Index des Wertes, welcher mit dem Wert am fokussierten Index verglichen wird
int comparedIndex = 1;
// Sobald der maximal zu fokussierende Index 1 ist, ist der Array sortiert. Falls max anfangs schon kleiner als 1 ist, hat der Array so wenig Elemente, dass er schon sortiert ist
while (max > 1) {
// Falls der fokussierte Index dem maximal zu fokussierendem Index entspricht, wird der Algorithmus wieder vom Index 0 weitergeführt
if (focusedIndex == max) {
// Der maximal zu fokussierende Index muss nun um eins kleiner sein
max--;
// Man beginnt wieder am Anfang des Arrays => Der fokussierte Index ist wieder 0
focusedIndex = 0;
// Der Index, mit dem verglichen wird, ist wieder 1
comparedIndex = 1;
}
// Falls der Wert am fokussierten Index grösser ist als der am Verglichenen, werden die beiden Werte miteinander getauscht
if (arr[focusedIndex] > arr[comparedIndex]) {
int temp = arr[focusedIndex];
arr[focusedIndex] = arr[comparedIndex];
arr[comparedIndex] = temp;
}
// Nach jeder Iteration wird der fokussierte Index um eins erhöht
focusedIndex++;
// Nach jeder Iteration wird der verglichene Index um eins erhöht
comparedIndex++;
}
// Der sortierte Array wird zurückgegeben
return arr;
}
Animiertes Beispiel
Legende
- Fokussierter Wert
- Wert, mit dem der fokussierte Wert verglichen wird
- Momentan nicht beachteter Wert
- Wert am korrekten Index
Drücke Start, um die Animation zu starten. Ändere die Position des Sliders, um die Geschwindigkeit der Animation zu verändern.