Einfache Sortierverfahren: Auswahl, Einfügen, Bubblesort
Sortierte Daten machen vieles einfacher: In einer sortierten Liste findest du ein Element mit binärer Suche in logarithmisch vielen Schritten, doppelte Einträge stehen nebeneinander, und der Median liegt in der Mitte. Kein Wunder, dass das Sortieren eines der am besten untersuchten Probleme der Informatik ist.
Wir beginnen mit drei Verfahren, die man sich leicht selbst ausdenken könnte. Alle drei haben im ungünstigen Fall einen quadratischen Aufwand. Sie sind trotzdem wichtig: Sie zeigen die Grundideen, und bei kleinen oder fast sortierten Eingaben sind sie in der Praxis oft schneller als ausgefeilte Verfahren. Du kannst jedes davon im Werkzeug Sortieralgorithmen Schritt für Schritt ablaufen lassen und die Vergleiche mitzählen.
Sortierproblem
Gegeben ist eine Folge von Elementen, die sich paarweise vergleichen lassen. Gesucht ist eine Permutation (Umordnung) der Folge, sodass gilt.
Ein Verfahren heißt stabil, wenn gleiche Elemente ihre ursprüngliche Reihenfolge behalten. Das ist wichtig, wenn du nacheinander nach mehreren Kriterien sortierst (erst nach Vorname, dann nach Nachname). Ein Verfahren arbeitet in place, wenn es außer wenigen Hilfsvariablen keinen zusätzlichen Speicher braucht.
Selectionsort (Sortieren durch Auswählen)
Die Idee: Suche in dem noch unsortierten Rest das kleinste Element und tausche es an den Anfang dieses Rests. Dann ist der Anfang ein Stück größer sortiert.
Im -ten Durchgang vergleichst du das Minimum mit den restlichen Elementen. Insgesamt sind das immer Vergleiche, egal wie die Eingabe aussieht, aber nur höchstens Vertauschungen. Selectionsort ist deshalb sinnvoll, wenn Vertauschen teuer ist.
Insertionsort (Sortieren durch Einfügen)
Die Idee kennst du vom Kartenspiel: Du hältst die Karten in der Hand sortiert und nimmst die nächste Karte vom Stapel, um sie an der richtigen Stelle einzuschieben. Das Verfahren verschiebt dazu größere Elemente nach rechts, bis die Lücke passt.
Im besten Fall (schon sortiert) braucht es nur Vergleiche, also . Im schlechtesten Fall (umgekehrt sortiert) werden alle Paare verglichen: . Insertionsort ist stabil, in place und besonders schnell bei fast sortierten Daten.
Insertionsort auf
Insertionsort auf
Der sortierte Teil steht links vom senkrechten Strich:
- Start:
- Füge ein:
- Füge ein:
- Füge ein: (kein Verschieben nötig)
- Füge ein: (alle vier Elemente rutschen nach rechts)
- Füge ein:
Die Zahl der nötigen Verschiebungen entspricht der Zahl der Inversionen, also der Paare, die in falscher Reihenfolge stehen. Hier sind es , also Inversionen.
Bubblesort
Die Idee: Gehe die Folge von links nach rechts durch und vertausche jedes Paar benachbarter Elemente, das in falscher Reihenfolge steht. Nach dem ersten Durchlauf ist das größte Element ganz rechts angekommen, wie eine Blase, die aufsteigt. Wiederhole das für den Rest.
Bubblesort ist stabil und in place. Die Zahl der Vertauschungen entspricht genau der Zahl der Inversionen. Mit einer Abbruchbedingung (kein Tausch im Durchlauf, also bereits sortiert) erreicht Bubblesort im besten Fall , im schlechtesten und mittleren Fall . In der Praxis ist Bubblesort langsamer als Insertionsort, wird aber gern zur Veranschaulichung benutzt.
Zusammenfassung
Selectionsort wählt wiederholt das Minimum aus: immer Vergleiche, aber höchstens Vertauschungen.
Insertionsort fügt jedes Element in den sortierten Teil ein: im besten, im schlechtesten Fall, stabil, gut bei fast sortierten Daten.
Bubblesort vertauscht benachbarte Paare; die Zahl der Vertauschungen ist die Zahl der Inversionen.
Alle drei sind im schlechtesten Fall quadratisch und deshalb nur für kleine Eingaben geeignet.
Stabil heißt: gleiche Elemente behalten ihre Reihenfolge.
Übungen
Wie viele Vergleiche führt Selectionsort bei einer Folge der Länge aus?
Wie sieht die Folge nach dem ersten vollständigen Durchlauf von Bubblesort aus?
Wie viele Inversionen hat die Folge ? (So viele Vertauschungen benötigt Bubblesort.)
Warum ist Insertionsort bei einer fast sortierten Folge viel schneller als Selectionsort?