www.wikidata.de-de.nina.az
Bubblesort auch Sortieren durch Aufsteigen oder Austauschsortieren ist ein Algorithmus der vergleichsbasiert eine Liste von Elementen sortiert Dieses Sortierverfahren arbeitet in place sortiert stabil und hat eine Laufzeit von 8 n 2 displaystyle Theta n 2 im schlimmsten Fall Worst Case wie auch im durchschnittlichen Fall Average Case Damit ist die Laufzeit asymptotisch nicht optimal In der Praxis wird Bubblesort kaum eingesetzt da andere Verfahren ein besseres Laufzeitverhalten haben Der Algorithmus spielt allerdings in der Lehre eine Rolle da er als einfach zu erklaren bzw zu demonstrieren gilt Des Weiteren eignet sich der Algorithmus um Techniken wie schrittweise Optimierungen Laufzeit bzw Komplexitats und Korrektheitsanalyse einzufuhren Visualisierung von Bubblesort Inhaltsverzeichnis 1 Prinzip 2 Algorithmus 3 Beispiel 4 Komplexitat 4 1 Ungunstigster Fall 4 2 Bester Fall 4 3 Durchschnittlicher Fall 5 Abgrenzung 5 1 Hasen und Schildkroten 6 Literatur 7 Weblinks 8 EinzelnachweisePrinzip Bearbeiten nbsp Bubblesort an einer ZahlenlisteIn der Bubble Phase wird die Eingabe Liste von links nach rechts durchlaufen Dabei wird in jedem Schritt das aktuelle Element mit dem rechten Nachbarn verglichen Falls die beiden Elemente das Sortierkriterium verletzen werden sie getauscht Am Ende der Phase steht bei auf bzw absteigender Sortierung das grosste bzw kleinste Element der Eingabe am Ende der Liste Die Bubble Phase wird solange wiederholt bis die Eingabeliste vollstandig sortiert ist Dabei muss das letzte Element des vorherigen Durchlaufs nicht mehr betrachtet werden da die restliche zu sortierende Eingabe keine grosseren bzw kleineren Elemente mehr enthalt Je nachdem ob auf oder absteigend sortiert wird steigen die grosseren oder kleineren Elemente wie Blasen im Wasser daher der Name immer weiter nach oben das heisst an das Ende der Liste Es werden stets zwei Zahlen miteinander in Bubbles vertauscht Algorithmus BearbeitenUm die Darstellung des Algorithmus zu vereinfachen wird im Folgenden als Vergleichsrelation gt displaystyle gt nbsp grosser als verwendet Wie bei jedem auf Vergleichen basierenden Sortierverfahren kann diese auch durch eine andere Relation ersetzt werden die eine totale Ordnung definiert Der Algorithmus in seiner einfachsten Form als Pseudocode bubbleSort Array A for n A size n gt 1 n n 1 aussere Schleife for i 0 i lt n 1 i i 1 innere Schleife if A i gt A i 1 A swap i i 1 Die Eingabe ist in einem Array gespeichert Die aussere Schleife verringert schrittweise die rechte Grenze fur die Bubble Phase da nach jedem Bubblen an der rechtesten Position das grosste Element der jeweils unsortierten Rest Eingabe steht In der inneren Schleife wird der noch nicht sortierte Teil des Feldes durchlaufen Dabei werden zwei benachbarte Daten vertauscht wenn sie in falscher Reihenfolge sind also das Sortierkriterium verletzen Allerdings nutzt diese einfachste Variante nicht die Eigenschaft aus dass nach einer Iteration in der keine Vertauschungen stattfanden auch in den restlichen Iterationen keine Vertauschungen mehr stattfinden Der folgende Pseudocode berucksichtigt dies bubbleSort2 Array A n A size do aussere Schleife swapped false for i 0 i lt n 1 i i 1 innere Schleife if A i gt A i 1 A swap i i 1 swapped true n n 1 while swapped Die aussere Schleife durchlauft die zu sortierenden Daten bis keine Vertauschungen mehr notwendig sind Beispiel BearbeitenEine Reihe von funf Zahlen soll aufsteigend sortiert werden Die fett gedruckten Zahlen werden jeweils verglichen Ist die linke grosser als die rechte so werden beide vertauscht das Zahlenpaar ist dann blau markiert Im ersten Durchlauf wandert somit die grosste Zahl ganz nach rechts Der zweite Durchlauf braucht somit die letzte und vorletzte Position nicht mehr zu vergleichen Dritter Durchlauf kein Vergleich letzte vorletzte vorvorletzte span style color 0000ff b 55 07 b span 78 12 42 1 Durchlauf br 07 b 55 78 b 12 42 br 07 55 span style color 0000FF b 78 12 b span 42 br 07 55 12 span style color 0000FF b 78 42 b span Letzter Vergleich br b 07 55 b 12 42 78 2 Durchlauf br 07 span style color 0000FF b 55 12 b span 42 78 br 07 12 span style color 0000FF b 55 42 b span 78 Letzter Vergleich br b 07 12 b 42 55 78 3 Durchlauf br 07 b 12 42 b 55 78 Letzter Vergleich br b 07 12 b 42 55 78 4 Durchlauf Letzter Vergleich br 07 12 42 55 78 Fertig sortiert Komplexitat Bearbeiten nbsp Beispiel wie Bubblesort eine Liste sortiert Die Listenelemente werden durch Balken dargestellt Die x Achse gibt an wo sich ein Element in der Liste befindet die Hohe gibt an wie gross ein Element ist Ein Frame entspricht einem Durchlauf Animation starten Ungunstigster Fall Bearbeiten Bubblesort hat die Laufzeit O n 2 displaystyle mathcal O n 2 nbsp fur Listen der Lange n displaystyle n nbsp Im Falle der umgekehrt sortierten Liste n n 1 2 1 displaystyle n n 1 dotsc 2 1 nbsp werden maximal n n 1 2 displaystyle tfrac n cdot n 1 2 nbsp viele Vertauschungen ausgefuhrt um das erste und grosste Element n displaystyle n nbsp ganz nach rechts zu bewegen werden n 1 displaystyle n 1 nbsp Vertauschungen vorgenommen Allgemein Die Bewegung des k displaystyle k nbsp ten Elements an die Stelle n displaystyle n nbsp wird durch n k displaystyle n k nbsp Vertauschungen vollzogen Aufsummieren uber alle k displaystyle k nbsp ergibt im Ganzen 1 2 n 2 n O n 2 displaystyle tfrac 1 2 n 2 n in mathcal O n 2 nbsp Vertauschungen Da nur Paare vertauscht werden die auch vorher verglichen wurden benotigt der Algorithmus auch mindestens ebenso viele Vergleiche Betrachtet man den Pseudocode des Algorithmus so sieht man leicht ein dass keine der Anweisungen ofter als 1 2 n 2 n displaystyle tfrac 1 2 n 2 n nbsp mal ausgefuhrt werden kann also ist dies auch die bestmogliche untere Schranke Bester Fall Bearbeiten Bei einer bereits sortierten Liste wird Bubblesort die Liste nur einmal durchgehen d h es gibt nur einen Durchgang um festzustellen dass die Liste bereits sortiert ist weil keine benachbarten Elemente vertauscht werden mussten Daher benotigt Bubblesort O n displaystyle mathcal O n nbsp Schritte um eine bereits sortierte Liste zu bearbeiten Falls die Elemente der Liste bereits nah den Stellen sind die sie nach der Sortierung bekommen sollen ist die Laufzeit erheblich besser als O n 2 displaystyle mathcal O n 2 nbsp Durchschnittlicher Fall Bearbeiten Die erwartete Anzahl der Vergleiche fur eine zufallig gewahlte Permutation der Liste 1 2 n displaystyle 1 2 dotsc n nbsp ist 1 2 n 2 n ln n g ln 2 1 n O n displaystyle frac 1 2 left n 2 n cdot ln n gamma ln 2 1 cdot n right mathcal O sqrt n nbsp wobei g displaystyle gamma nbsp die Euler Mascheroni Konstante bezeichnet die erwartete Anzahl der Vertauschungen betragt 1 4 n 2 n displaystyle tfrac 1 4 n 2 n nbsp 1 Abgrenzung BearbeitenAuch wenn Bubblesort nicht asymptotisch optimal ist kann ein Einsatz fur kleine Eingaben in Frage kommen da fur kleine n displaystyle n nbsp die konstanten Laufzeitfaktoren eines Sortieralgorithmus dominieren welche bei Bubblesort klein sind Ein Anwendungsfall ware die Verwendung von Bubblesort innerhalb eines rekursiv arbeitenden Sortierverfahrens um die Anzahl an Rekursionen zu verringern Wenn die Elemente eines Feldes oder einer Liste bis zu einer bestimmten Anzahl mit einer hohen Wahrscheinlichkeit schon sortiert sind eignet sich Bubblesort da dies der Best Case ist in dem der Algorithmus eine lineare Laufzeit hat Im Gegensatz dazu haben andere effiziente Sortierverfahren wie z B Quicksort oder asymptotisch optimale Verfahren wie beispielsweise Mergesort einen Best Case von O n log n displaystyle mathcal O n log n nbsp Unter diesem Aspekt konkurriert Bubblesort mit Insertionsort dessen Best Case eine schon sortierte Folge ist und welches die gleiche Komplexitat wie Bubblesort aufweist wie auch im Average und Worst Case Fur beide Sortierverfahren gilt Sie sind stabil und arbeiten in place Je nach Implementation hat Insertionsort jedoch geringere konstante Laufzeitfaktoren als Bubblesort Hasen und Schildkroten Bearbeiten Die Position der Elemente vor dem Sortieren ist entscheidend fur den Sortieraufwand von Bubblesort Grosse Elemente zu Beginn wirken sich nicht negativ aus da sie schnell nach hinten getauscht werden jedoch kleine Elemente am Ende bewegen sich nur langsam nach vorn Deshalb bezeichnet man die schnell getauschten Elemente als Hasen und die langsamen als Schildkroten Combsort oder auch Gapsort genannt ist der schnellste auf Bubblesort beruhende Algorithmus Im Unterschied zu Bubblesort werden hier weit voneinander entfernt liegende Elemente miteinander verglichen und vertauscht um das Dilemma von langsam wandernden Elementen zu vermeiden Seine Laufzeit liegt im Worst Case ebenso bei O n 2 displaystyle mathcal O n 2 nbsp und im Best Case bei O n log n displaystyle mathcal O n log sqrt n nbsp Bubblesort O n displaystyle mathcal O n nbsp Damit erreicht Combsort im Worst und im Best Case die gleiche Komplexitat wie Quicksort Cocktailsort oder auch Shakersort genannt ist ein alternierender Sortieralgorithmus der die Elemente von der linken zur rechten Seite und von der rechten zur linken Seite wandern lasst Damit wird ebenso dem Problem von nur langsam nach vorn wandernden Elementen entgegengewirkt Aufgrund der Alternierung wird dieser Algorithmus auch Bidirectional Bubblesort genannt Im Worst Case liegt seine Laufzeit wie die von Bubblesort in O n 2 displaystyle mathcal O n 2 nbsp Oyelami O M veroffentlichte im Jahr 2009 eine optimierte Version von Bubblesort welche den Worst Case fur umgekehrt sortierte Felder Listen vermeidet Aufgrund der damit einhergehenden Sortierung uber Distanz ist der von ihm verwendete Algorithmus nicht mehr stabil In Anlehnung an das obige bubbleSort3 wird nachfolgend ein optimierter bidirektionaler Bubblesort mittels papyrus script function veranschaulicht Float a ist dabei beispielhaft der Zeiger auf ein Array mit Fliesskommazahlen Die beiden integer Parameter stellen den flexiblen Sortierbereich fur das Array dar Startwert L Endwert R Angenommen das Array hat 99 Elemente und beginnt bei 0 dann muss L 0 und R 98 gesetzt werden um es vollstandig zu sortieren void sortByBubble3 float a int L int R float X pivot element float f temp element for swap int m last swap position int i counter round 1 suggested by Oyelami i L m R while i lt m to avoid worst case by using an array sorted in reverse order X a i f a m if X gt f a m X a i f i i 1 m m 1 round 2 optimized bi directional BubbleSort while L lt R X a L m L 1 init m out of sorting range related to Left bound i L 1 while i lt R BottomUp loop sorts to maximum at the end f a i if X lt f X f no exchange set pivot to follower element else a i X swap two elements m i 1 update last swap position a m f and keep current pivot for next comparison i i 1 R R 1 if R gt m if L lt m R m shrink the Right bound as much as possible else R L no swap last time break the loop X a R m R 1 init m out of sorting range related to Right bound i R 1 while i gt L TopDown loop sorts to minimum on start f a i if X gt f X f no exchange set pivot to follower element else a i X swap two elements m i 1 update last swap position a m f and keep current pivot for next comparison i i 1 L L 1 if L lt m if R gt m L m else L R no swap last time break the loop Literatur BearbeitenThomas H Cormen Charles E Leiserson Ronald L Rivest Clifford Stein Introduction to Algorithms 2 Auflage MIT Press Cambridge MA 2001 ISBN 0 262 03293 7 S 38 Donald E Knuth The Art of Computer Programming 2 Auflage Volume 3 Sorting and Searching Addison Wesley Reading MA 1997 ISBN 0 201 89685 0 S 106 110 englisch Weblinks Bearbeiten nbsp Commons Bubblesort Sammlung von Bildern Videos und Audiodateien Sammlung von Bubblesort Implementierungen Wikibooks Bubblesort einfach erklart anhand eines ungarischen Volkstanzes Improving the performance of bubble sort PDF Einzelnachweise Bearbeiten Donald E Knuth The Art of Computer Programming 2 Auflage Volume 3 Sorting and Searching Addison Wesley Reading MA 1997 ISBN 0 201 89685 0 S 108 109 englisch Abgerufen von https de wikipedia org w index php title Bubblesort amp oldid 239303642