Sortieralgorithmus: Verfahren einfach vergleichen
Du prüfst Zahlenfolgen, führst drei Sortierverfahren aus und vergleichst ihren Zeitbedarf, ihre Stabilität und ihren zusätzlichen Speicher.
Kurz gesagt
Ein Sortieralgorithmus ist eine genaue Schrittfolge, die Elemente in eine gewünschte Reihenfolge bringt. Er kann dazu benachbarte Zahlen tauschen, das kleinste Element auswählen oder Zahlen passend einfügen.
Beim Sortieren bleiben alle Zahlen erhalten, auch mehrfach vorkommende Zahlen. Nur ihre Reihenfolge kann sich ändern. Du lernst drei Verfahren kennen und untersuchst, wie ihre Arbeit von der Ausgangsfolge abhängt.
Deine Lernziele
Eine Zahlenfolge besteht aus Zahlen in einer bestimmten Reihenfolge. Jede einzelne Zahl darin heißt Element. Eine Folge ist aufsteigend sortiert, wenn keine Zahl größer als ihr rechter Nachbar ist. Gleiche Nachbarn sind erlaubt.
Prüfe dazu alle benachbarten Zahlenpaare von links nach rechts. Findest du eine linke Zahl, die größer als die rechte ist, ist die Folge nicht aufsteigend sortiert. Gibt es bei keinem Nachbarpaar einen solchen Abstieg, ist die ganze Folge aufsteigend sortiert: Die Zahlen werden nach rechts hin nicht kleiner.
Ein richtig geordnetes Nachbarpaar allein genügt für diese Prüfung nicht. Auch die übrigen Nachbarpaare müssen passen. Eine leere Folge und eine Folge mit nur einer Zahl gelten ebenfalls als sortiert, weil sie kein falsch geordnetes Nachbarpaar enthalten.
Aufsteigend sortiert
Jede Zahl ist kleiner als oder gleich ihrem rechten Nachbarn. Wiederholungen sind erlaubt.
Beispiel: Eine Folge mit Wiederholung prüfen
- 1Die Folge lautet: 2, 2, 7, 9.
- 2Vergleiche 2 und 2: Die linke Zahl ist gleich groß.
- 3Vergleiche 2 und 7: Die linke Zahl ist kleiner.
- 4Vergleiche 7 und 9: Die linke Zahl ist kleiner.
- 5Alle Nachbarpaare passen. Die Folge ist aufsteigend sortiert.
Teste dich
Wir sortieren aufsteigend und verwenden die folgenden festen Varianten. Ihre Schritte sind Beschreibungen in Alltagssprache, kein ausführbarer Programmcode.
Bei Bubblesort gehst du von links nach rechts durch die Folge. Vergleiche jeweils zwei Nachbarn und tausche sie, wenn die linke Zahl größer ist. Gleiche Zahlen werden nicht getauscht. Nach einem vollständigen Durchlauf steht eine größte Zahl des geprüften Bereichs an dessen rechtem Ende. Diese Stelle ist fertig. Im nächsten Durchlauf prüfst du eine Stelle weniger. Wiederhole das, bis der Bereich höchstens eine Zahl enthält. Mit Frühabbruch darfst du schon dann aufhören, wenn ein ganzer Durchlauf durch den noch zu prüfenden Bereich ohne Tausch endet. Ein einzelnes Nachbarpaar ohne Tausch reicht nicht.
Bei Selectionsort suchst du im noch nicht fertigen Bereich die kleinste Zahl. Gibt es sie dort mehrfach, wähle die erste von links. Tausche sie direkt mit der ersten Zahl dieses Bereichs. Steht sie bereits dort, bleibt sie stehen. Danach gehört diese Stelle zum fertigen linken Teil. Suche und tausche im verbleibenden rechten Bereich weiter. Ist dort höchstens eine Zahl übrig, bist du fertig. Beim direkten Tausch wechseln die beiden betroffenen Zahlen ihre Plätze; die Zahlen dazwischen werden nicht verschoben.
Bei Insertionsort beginnst du mit der ersten Zahl als sortiertem linken Teil. Nimm jeweils die nächste Zahl rechts daneben und merke sie dir. Vergleiche sie im linken Teil von rechts nach links mit den Vorgängern. Verschiebe jeden größeren Vorgänger um eine Stelle nach rechts. Sobald du einen kleineren oder gleichen Vorgänger erreichst, fügst du die gemerkte Zahl direkt dahinter ein. Erreichst du den Anfang, kommt sie nach ganz links. Gleiche Vorgänger werden nicht verschoben. Wiederhole das mit jeder weiteren Zahl.
Beispiel: Bubblesort mit 6, 1, 4
- 1Start: 6, 1, 4.
- 2Vergleiche 6 und 1, dann tausche: 1, 6, 4.
- 3Vergleiche 6 und 4, dann tausche: 1, 4, 6. Die letzte Stelle ist fertig.
- 4Im verkürzten nächsten Durchlauf vergleichst du 1 und 4. Kein Tausch ist nötig. Fertig: 1, 4, 6.
Beispiel: Selectionsort mit 7, 3, 5, 2
- 1Start: 7, 3, 5, 2. Die kleinste Zahl ist 2.
- 2Tausche 2 direkt mit der ersten Zahl 7: 2, 3, 5, 7.
- 3Im restlichen Bereich 3, 5, 7 ist 3 die kleinste Zahl. Sie bleibt an ihrer Stelle.
- 4Im restlichen Bereich 5, 7 ist 5 die kleinste Zahl. Sie bleibt ebenfalls stehen.
- 5Eine Zahl ist übrig. Fertig: 2, 3, 5, 7.
Beispiel: Insertionsort mit 4, 9, 2, 6
- 1Start: 4, 9, 2, 6. Zunächst bildet 4 den sortierten linken Teil.
- 2Nimm 9. Weil 4 kleiner ist, bleibt 9 dahinter: 4, 9, 2, 6.
- 3Nimm 2. Verschiebe 9 und 4 nach rechts und setze 2 an den Anfang: 2, 4, 9, 6.
- 4Nimm 6. Verschiebe 9 nach rechts. Hinter 4 ist der passende Platz.
- 5Fertig: 2, 4, 6, 9.
Teste dich
Der Zeitbedarf hängt von der Anzahl der Elemente ab. Diese Anzahl nennen wir n. Für den Vergleich betrachten wir Folgen mit mindestens zwei Zahlen. Wir zählen Zahlenvergleiche, Tausche und Verschiebungen als Arbeitsschritte. Dabei behandeln wir jeden Zahlenvergleich und jede Bewegung einer Zahl als gleich aufwendig, unabhängig von der Ziffernzahl. Das ist ein vereinfachtes Modell, keine Messung von Sekunden auf einem bestimmten Computer.
Die O-Schreibweise, gesprochen „O von …“, beschreibt eine obere Grenze für das Wachstum des Arbeitsbedarfs bei längeren Folgen. Feste Faktoren und kleine Zusatzarbeiten stehen dabei nicht im Vordergrund. Die Tabelle nennt die üblichen engen Grenzen: O(n) steht dort für lineares Wachstum, also Wachstum ungefähr im Verhältnis zur Folgenlänge. O(n^2) steht dort für quadratisches Wachstum; n^2 bedeutet n mal n. Bei doppelter Länge kann der führende quadratische Anteil etwa viermal so groß werden. Daraus folgt keine genaue Vervierfachung gemessener Sekunden.
Der beste und der schlechteste Fall beziehen sich auf Anordnungen derselben Anzahl von Zahlen. Für „im Mittel“ betrachten wir zufällige Anordnungen verschiedener Zahlen, bei denen jede Reihenfolge gleich wahrscheinlich ist. Ein Mittelwert sagt nicht voraus, wie lange jede einzelne Folge braucht.
Bubblesort mit Frühabbruch prüft eine bereits sortierte Folge in einem Durchlauf. Stehen verschiedene Zahlen von der größten bis zur kleinsten, braucht es mit wachsender Folgenlänge immer mehr Durchläufe. Selectionsort sucht auch in einer sortierten Folge immer wieder die kleinste verbleibende Zahl. Dabei entstehen insgesamt n(n-1)/2 Vergleiche: erst n-1, dann n-2 und schließlich ein Vergleich. Insertionsort muss bei einer sortierten Folge keine Zahl verschieben. Stehen verschiedene Zahlen von der größten bis zur kleinsten, muss dagegen jede neu genommene Zahl an allen bisherigen Zahlen vorbei. Diese Arbeitsweisen erklären die Unterschiede in der Tabelle; ein einzelner Beispieldurchlauf allein beweist sie nicht.
Stabilität betrifft Elemente mit demselben Sortierwert. Ein Sortierwert ist die Zahl oder Eigenschaft, nach der geordnet wird. Ein stabiles Verfahren erhält die bisherige Reihenfolge von Elementen mit gleichem Sortierwert. Unsere Bubble- und Insertion-Varianten sind stabil, weil sie gleiche Werte nicht aneinander vorbeibewegen. Selectionsort mit direktem Tausch ist nicht stabil: Die Reihenfolge gleicher Werte kann sich ändern. Sie muss sich aber nicht bei jeder Folge ändern.
Zusätzlicher Speicher ist Speicher über die gespeicherte Eingabefolge hinaus. Unsere Varianten brauchen nur wenige Hilfswerte, etwa zum Merken einer Zahl und einer Stelle. Dafür steht O(1), gesprochen „O von eins“: Der zusätzliche Bedarf bleibt durch eine feste Größe begrenzt, wenn die Folge länger wird. Der Speicher für die Eingabefolge selbst wird dabei nicht mitgezählt. Keine unserer Varianten braucht eine zweite vollständige Folge.
| Verfahren | Zeitbedarf | Stabilität und Zusatzspeicher |
|---|---|---|
| Bubblesort mit Frühabbruch | Bester Fall: O(n). Im Mittel und im schlechtesten Fall: O(n^2). | Stabil; zusätzlicher Speicher: O(1). |
| Selectionsort mit direktem Tausch | Bester Fall, im Mittel und schlechtester Fall: O(n^2). | Nicht stabil; zusätzlicher Speicher: O(1). |
| Insertionsort ohne Überholen gleicher Werte | Bester Fall: O(n). Im Mittel und im schlechtesten Fall: O(n^2). | Stabil; zusätzlicher Speicher: O(1). |
Beispiel: Gleiche Sortierwerte unterscheiden
- 1Die erfundenen Einträge 4a und 4b haben beide den Sortierwert 4. Die Buchstaben markieren ihre ursprüngliche Reihenfolge.
- 2Start: 4a, 4b, 1. Sortiert wird nach den Zahlen, nicht nach den Buchstaben.
- 3Selectionsort tauscht die kleinste Zahl 1 direkt mit 4a: 1, 4b, 4a.
- 4Die Zahlenwerte sind sortiert. Trotzdem steht 4b nun vor 4a. Der direkte Tausch hat ihre Reihenfolge geändert.
Teste dich
Einfache Sortierverfahren können für kleine Folgen sinnvoll sein. Bei wenigen Elementen bleibt auch eine quadratische Zahl von Arbeitsschritten klein. Die Verfahren sind außerdem leicht nachzuvollziehen und brauchen wenig zusätzlichen Speicher. Das garantiert nicht, dass sie auf jedem Computer bei jeder kleinen Folge am schnellsten sind. Für eine Auswahl zählen neben der Folgenlänge auch die Ausgangsordnung und eine mögliche Forderung nach Stabilität.
Für Insertionsort ist wichtig, wie viele falsch geordnete Paare die Folge enthält. Ein solches Paar besteht aus einer früheren größeren und einer späteren kleineren Zahl. Die beiden müssen keine direkten Nachbarn sein. Gleiche Zahlen bilden kein falsch geordnetes Paar. Wir nennen die Anzahl dieser Paare I. Wie groß die Zahlenwerte sind oder wie viele Ziffern sie haben, bestimmt in unserem Modell nicht die Zahl der Verschiebungen.
Jede Verschiebung bei Insertionsort bewegt einen größeren Vorgänger nach rechts an der gerade einzufügenden Zahl vorbei. Dadurch wird genau eines dieser falsch geordneten Paare beseitigt. Insgesamt gibt es deshalb genau I solche Verschiebungen. Hinzu kommt die Arbeit, jede weitere Zahl aufzunehmen und ihren Platz zu prüfen. Zusammen ergibt das O(n+I), wobei n wieder die Anzahl der Zahlen ist. Wenn I höchstens im Verhältnis zu n wächst, bleibt dieser Bedarf linear. Wenige falsch geordnete Paare helfen Insertionsort also besonders.
„Fast sortiert“ ist ohne genauere Erklärung ungenau. Eine Folge kann entstehen, indem aus einer sortierten Folge die kleinste Zahl ans rechte Ende versetzt wird. Dann muss diese Zahl an allen anderen Zahlen vorbei. Bei unserem Bubblesort von links nach rechts kommt sie pro Durchlauf nur eine Stelle nach links. Solange sie noch falsch steht, gibt es einen Tausch und der Frühabbruch greift nicht.
Für eine solche Folge mit n verschiedenen Zahlen braucht Bubblesort n-1 Durchläufe mit insgesamt n(n-1)/2 Vergleichen. Der Bedarf wächst damit quadratisch, obwohl nur die kleinste Zahl aus der sortierten Folge ans Ende versetzt wurde. Insertionsort verschiebt hier die anderen n-1 Zahlen jeweils einmal und arbeitet insgesamt linear. Selectionsort bleibt auch bei dieser Vorordnung quadratisch, weil es seine Suche nach dem kleinsten verbleibenden Wert wiederholt.
Beispiel: Eine kleine Zahl am rechten Ende
- 1Start: 2, 4, 6, 8, 1. Die ersten vier Zahlen stehen bereits aufsteigend.
- 2Bubblesort nach dem ersten Durchlauf: 2, 4, 6, 1, 8.
- 3Nach dem zweiten Durchlauf: 2, 4, 1, 6, 8.
- 4Nach dem dritten Durchlauf: 2, 1, 4, 6, 8.
- 5Nach dem vierten Durchlauf: 1, 2, 4, 6, 8. Insgesamt waren es 4 + 3 + 2 + 1 = 10 Vergleiche.
- 6Insertionsort verschiebt beim Einfügen der 1 die vier größeren Zahlen jeweils einmal nach rechts.
Merke: Wenige falsch geordnete Paare helfen Insertionsort. Die vage Beschreibung „fast sortiert“ garantiert dagegen keinen schnellen Bubblesort mit Frühabbruch.
Teste dich
Alles auf einen Blick
Sortieralgorithmus
Aufsteigend bedeutet, dass kein Nachbarpaar abfällt; gleiche Zahlen sind erlaubt.
Bubble tauscht Nachbarn, Selection sucht die kleinste Zahl, Insertion fügt in einen sortierten Teil ein.
Unsere Bubble- und Insertion-Varianten haben lineare Bestfälle; Selection sucht auch bei sortierter Eingabe quadratisch.
Unsere Bubble- und Insertion-Varianten erhalten die Reihenfolge gleicher Werte; der direkte Tausch bei Selection garantiert das nicht.
Alle drei beschriebenen Varianten brauchen konstanten zusätzlichen Speicher, ohne den Speicher der Eingabefolge mitzuzählen.
Kleine Folgen können einfache Verfahren sinnvoll machen; wenige falsch geordnete Paare begünstigen besonders Insertionsort.
Mit Insertionsort eine Zahl in den sortierten Teil einfügen
- 1Die Folge lautet 2, 6, 11, 15, 9. Die ersten vier Zahlen bilden bereits den sortierten linken Teil.
- 2Merke dir die nächste Zahl 9. Vergleiche sie zuerst mit ihrem Vorgänger 15.
- 315 ist größer als 9 und wird eine Stelle nach rechts verschoben.
- 4Auch 11 ist größer als 9 und wird eine Stelle nach rechts verschoben.
- 56 ist kleiner als 9. Setze die gemerkte 9 direkt hinter 6 ein.
- 6Das Ergebnis lautet 2, 6, 9, 11, 15. Alle Nachbarpaare sind aufsteigend geordnet.
Fehler finden
Fehler in Zeile 3Ein einzelnes richtig geordnetes Nachbarpaar sagt nichts über alle weiteren Paare aus. Richtig: Ein ganzer Durchlauf durch den noch zu prüfenden Bereich ohne Tausch genügt für den Frühabbruch.
Lückentext
Weil bei 5, 5, 12 kein Nachbarpaar abfällt, ist diese Folge . Beim Vergleich der ersten mit der zweiten und danach der zweiten mit der dritten Zahl prüft Bubblesort Zahlenpaare. Weil unsere Varianten unabhängig von der Folgenlänge nur eine feste Zahl von Hilfswerten brauchen, bleibt ihr zusätzlicher Speicherbedarf ; die Eingabefolge selbst zählt dabei nicht mit.