Praktische Informatik
Sortieralgorithmen: von der Auswahl zum Teilen und Herrschen
Drei einfache Verfahren, ein schnelles, und der Beweis, dass es durch bloßes Vergleichen nicht schneller geht.
Benötigte Grundlagen
Dieses Vorwissen brauchst du für das Kapitel. Schau kurz nach, wenn dir etwas davon nicht mehr präsent ist, sonst leg direkt los.
Einführung
Sortieren wirkt wie eine Fingerübung. Tatsächlich ist es eines der am gründlichsten untersuchten Probleme der Informatik, und der Grund steht im vorigen Kapitel: Sortierte lassen sich binär durchsuchen, und das entscheidet über Sekunden oder Stunden.
Dieses Kapitel zeigt drei einfache Verfahren, die alle brauchen, und dann eines mit . Bei einer Million Einträgen ist das der Unterschied zwischen elf Tagen und einer Sekunde.
Am Ende steht eine Frage, die man selten stellt: Geht es noch besser? Die Antwort ist nein, und sie ist beweisbar.
Das kannst du nach diesem Kapitel
Sortieren durch Auswahl und durch Einfügen beschreiben und durchführen.
den Aufwand dieser Verfahren begründen, nicht nur nennen.
das Prinzip Teile und herrsche am Sortieren durch Mischen erläutern (Vertiefung).
Verfahren nach Aufwand, Stabilität und Speicherbedarf vergleichen.
begründen, warum vergleichendes Sortieren nicht schneller als sein kann (Vertiefung).
Kurz aufgefrischt
Vorausgesetzt werden geschachtelte aus Algorithmen entwerfen, die aus Aufwand von Algorithmen und das Feld aus Datentypen und Datenstrukturen.
Sortieren durch Auswahl
Die Idee ist die, mit der man von Hand Karten ordnet: Man sucht die kleinste Karte, legt sie nach vorn, sucht die kleinste der übrigen, und so weiter.
für i von 0 bis n-2:
kleinstesIndex = i
für j von i+1 bis n-1:
wenn a[j] < a[kleinstesIndex]:
kleinstesIndex = j
vertausche a[i] und a[kleinstesIndex]
Warum ? Die äußere läuft -mal. Die innere durchsucht beim ersten Mal Elemente, dann , dann und so weiter. Zusammen:
Das ist . Bemerkenswert: Die Zahl der Vergleiche hängt gar nicht von den ab. Ob das Feld bereits sortiert ist oder völlig durcheinander, es werden immer gleich viele Vergleiche ausgeführt. Bester, mittlerer und schlechtester Fall sind identisch.
Dafür ist die Zahl der Vertauschungen minimal, nämlich höchstens . Das ist der einzige echte Vorteil des Verfahrens: Wenn das Umlagern der Elemente sehr teuer ist, etwa bei großen Datensätzen, zählt das.
Sortieren durch Auswahl
Lies das Bild von oben nach unten: Jeder Durchgang sucht den kleinsten der noch nicht eingefärbten Werte und holt ihn an den Anfang. Der eingefärbte Bereich wächst dadurch von links, und was einmal darin steht, steht endgültig. 🔴 Sieh dir den zweiten Durchgang genau an: Dort ändert sich nichts, weil die 2 schon an ihrem Platz stand. Trotzdem hat das Verfahren alle Werte dahinter durchgesehen. Es konnte ja vorher nicht wissen, dass keiner kleiner ist. Genau das ist die Eigenart des Verfahrens: Die Zahl der Vergleiche hängt gar nicht von den ab. Bester, mittlerer und schlechtester Fall sind identisch, immer Vergleiche. Dafür wird höchstens -mal vertauscht, und wenn das Umlagern teuer ist, ist das der Vorteil, für den man alles andere in Kauf nimmt.
Sortieren durch Einfügen
Die Idee ist die, mit der man ein Blatt Karten sortiert, das man nacheinander aufnimmt: Jede neue Karte wird an der richtigen Stelle in den bereits sortierten Teil eingeschoben.
für i von 1 bis n-1:
wert = a[i]
j = i - 1
solange j ≥ 0 und a[j] > wert:
a[j+1] = a[j] // nach rechts schieben
j = j - 1
a[j+1] = wert
Der Bereich links von ist dabei immer schon sortiert. Man nennt eine solche Aussage, die während der ganzen gilt, eine Invariante; sie ist der Kern jeder Begründung, dass ein Verfahren wirklich sortiert.
Aufwand: Im schlechtesten Fall (absteigend sortiert) muss jedes Element ganz nach vorn geschoben werden, also wieder etwa Schritte, damit .
Im besten Fall aber, wenn das Feld bereits sortiert ist, bricht die innere Schleife sofort ab, und es bleiben Vergleiche, also . Genau das unterscheidet dieses Verfahren vom Sortieren durch Auswahl: Es profitiert von Vorsortierung.
Deshalb ist es bei kleinen oder fast sortierten Feldern das Verfahren der Wahl, und deshalb schalten gute Sortierbibliotheken bei kurzen Teilstücken darauf um.
Sortieren durch Einfügen
Dieselben fünf Zahlen, ein anderer Gedanke: Jeder Durchgang nimmt den nächsten Wert und schiebt ihn an die richtige Stelle des schon sortierten Anfangs. 🔴 Und jetzt vergleiche mit dem Bild darüber. Beim Auswählen ändern sich je Durchgang genau zwei Zellen, nämlich die getauschten. Hier ändern sich im dritten Durchgang vier, die 1 muss ganz nach vorn, und alles davor rückt einen Platz nach rechts. Das Verschieben ist die Arbeit dieses Verfahrens, und darum steht es im schlechtesten Fall (absteigend sortiert) wieder bei . Dafür bekommt es etwas, das das Auswählen nicht hat: Ist das Feld schon fast sortiert, bricht die innere sofort ab und es bleiben Vergleiche, also . Deshalb schalten gute Sortierbibliotheken bei kurzen Teilstücken genau hierauf um.
Sortieren durch Vertauschen
Beim Sortieren durch Vertauschen (Bubblesort) vergleicht man wiederholt benachbarte Elemente und tauscht sie, wenn sie in falscher Reihenfolge stehen. Nach dem ersten Durchlauf steht das größte Element ganz hinten, nach dem zweiten das zweitgrößte, und so weiter.
Auch das ist . Das Verfahren ist in der Praxis das langsamste der drei, weil es sehr viele Vertauschungen ausführt; es wird fast nur zu Lehrzwecken benutzt, weil sein Ablauf besonders anschaulich ist.
Vertiefung: Sortieren durch Mischen
Dieser Abschnitt gehört zum erhöhten Anforderungsniveau.
Alle drei bisherigen Verfahren haben denselben Aufbau: eine in einer Schleife. Daraus folgt , und daran ändert kein Detailtrick etwas. Für einen echten Fortschritt braucht es eine andere Idee.
Die Idee heißt Teile und herrsche:
Teilen: Das Problem in kleinere gleichartige Teilprobleme zerlegen. Herrschen: Die Teile auf dieselbe Weise lösen. Zusammenfügen: Die Teillösungen verbinden.
Beim Sortieren durch Mischen (Mergesort) heißt das:
sortiere(Feld):
wenn Länge ≤ 1: fertig // Abbruch
teile das Feld in zwei Hälften
sortiere(linke Hälfte) // Rekursion
sortiere(rechte Hälfte) // Rekursion
mische die beiden sortierten Hälften
Das Mischen zweier bereits sortierter Folgen ist der Kern und erstaunlich einfach: Man vergleicht die beiden vordersten Elemente und nimmt das kleinere. Das wiederholt man, bis beide leer sind.
[2, 5, 8] und [1, 3, 9]
1 < 2 → 1 Rest: [2,5,8] [3,9]
2 < 3 → 1,2 Rest: [5,8] [3,9]
3 < 5 → 1,2,3 Rest: [5,8] [9]
5 < 9 → 1,2,3,5 Rest: [8] [9]
8 < 9 → 1,2,3,5,8
Rest → 1,2,3,5,8,9
Jedes Element wird dabei genau einmal angefasst, das Mischen kostet also .
Warum insgesamt ? Zwei Beobachtungen genügen:
- Halbieren, bis Stücke der Länge 1 übrig sind, geht -mal. Das ist dieselbe Rechnung wie bei der binären Suche.
- Auf jeder dieser Ebenen wird zusammen jedes Element einmal gemischt, das kostet je Ebene .
Zusammen: Ebenen mal je Ebene, also .
Der Vergleich in Zahlen bei :
| Verfahren | Schritte (Größenordnung) |
|---|---|
Ein Faktor von etwa 50 000. Bei einer Million Datensätzen ist das der Unterschied zwischen elf Tagen und einer Sekunde.
Der Preis ist der Speicher: Das Mischen braucht ein zweites Feld, also zusätzlichen Platz. Die einfachen Verfahren kommen ohne aus.
Warum Mischen n mal log n kostet
Die Zahl in jedem ist die Länge des Stücks, nicht sein Inhalt, denn genau darauf kommt es beim Aufwand an. Zähle die beiden Größen, aus denen sich alles ergibt. Erstens die Ebenen: von 8 über 4 und 2 bis 1 sind es drei Halbierungen, und . Bei einer Million wären es zwanzig. Zweitens jede Ebene für sich: , auf jeder Ebene stehen zusammen wieder alle acht Elemente, und alle acht werden beim Zusammenmischen genau einmal angefasst. Also kostet jede Ebene , und es gibt davon: . 🔴 Der Unterschied zu den drei Verfahren davor liegt nicht im Fleiß, sondern im Bau: Eine in einer Schleife ergibt zwangsläufig , ein Baum dieser Form zwangsläufig .
Stabilität
Ein Sortierverfahren heißt stabil, wenn es die Reihenfolge gleichwertiger Elemente beibehält.
Das klingt nebensächlich und ist es nicht. Sortiert man eine Liste erst nach Vorname und dann stabil nach Nachname, sind gleiche Nachnamen anschließend nach Vorname geordnet. Bei einem instabilen Verfahren wäre diese Ordnung zerstört, und mehrstufige Sortierungen wären unmöglich.
| Verfahren | stabil |
|---|---|
| Auswahl | nein (das Vertauschen über weite Strecken zerreißt die Reihenfolge) |
| Einfügen | ja |
| Vertauschen | ja |
| Mischen | ja |
Vertiefung: die untere Schranke
Dieser Abschnitt gehört zum erhöhten Anforderungsniveau.
Geht es noch besser als ? Für Verfahren, die ausschließlich vergleichen, lautet die Antwort nein, und der Beweis benutzt reines Abzählen.
Es gibt mögliche Anordnungen von Elementen, und genau eine davon ist die sortierte. Ein Verfahren muss also durch seine Vergleiche zwischen Möglichkeiten unterscheiden können.
Jeder Vergleich hat zwei mögliche Ausgänge, halbiert die Zahl der verbliebenen Möglichkeiten also höchstens. Mit Vergleichen lassen sich damit höchstens Fälle unterscheiden. Notwendig ist also
und wächst wie .
🔴 Also braucht jedes vergleichende Sortierverfahren mindestens Vergleiche. Das Sortieren durch Mischen ist damit nicht nur gut, sondern in der Größenordnung optimal. Wer ein schnelleres vergleichendes Verfahren sucht, sucht etwas beweisbar Nichtexistierendes.
Der Zusatz „vergleichend" ist wesentlich. Verfahren, die zusätzliche Annahmen über die machen, können schneller sein: Weiß man, dass alle Werte ganze Zahlen zwischen 1 und 100 sind, kann man sie einfach in 100 Fächern zählen und ist in fertig. Diese Verfahren umgehen die Schranke nicht, sie fallen nicht unter sie, weil sie gar nicht vergleichen.
Warum kein Vergleichsverfahren schneller sein kann
Die Tabelle rechnet den Beweis in Zahlen nach. Ein Sortierverfahren muss am Ende eine von möglichen Anordnungen herausgefunden haben, bei zehn Elementen also eine von über 3,6 Millionen. Jeder Vergleich liefert genau ein , ja oder nein, und trennt die verbliebenen Möglichkeiten damit höchstens in zwei Hälften. Mit Vergleichen sind so höchstens Fälle unterscheidbar, also braucht es und damit . Prüfe die dritte Zeile: , aber , sieben Vergleiche, keiner weniger. 🔴 Und wächst wie . Das Sortieren durch Mischen ist damit nicht bloß gut, sondern in der Größenordnung optimal: Wer ein schnelleres vergleichendes Verfahren sucht, sucht etwas beweisbar Nichtexistierendes.
Die Übersicht
| Verfahren | bester Fall | schlechtester Fall | Speicher | stabil |
|---|---|---|---|---|
| Auswahl | nein | |||
| Einfügen | ja | |||
| Vertauschen | ja | |||
| Mischen | ja |
Sortieren durch Auswahl von Hand
Sortiere durch Auswahl. Notiere jeden Durchlauf.
- 1
Durchlauf 1 (): Kleinstes im Bereich 0–4 ist die 1 an Index 3. Tausche mit Index 0. →
- 2
Durchlauf 2 (): Kleinstes im Bereich 1–4 ist die 2, steht schon an Index 1. Tausch mit sich selbst. →
- 3
Durchlauf 3 (): Kleinstes im Bereich 2–4 ist die 5 an Index 3. Tausche mit Index 2. →
- 4
Durchlauf 4 (): Kleinstes im Bereich 3–4 ist die 7 an Index 4. Tausche mit Index 3. →
- 5
Nach vier Durchläufen ist das Feld sortiert. Der letzte Platz braucht keinen eigenen Durchlauf, denn dort steht zwangsläufig das größte übrige Element; deshalb läuft die äußere nur bis .
- 6
Vergleiche gezählt: . Genau die Formel aus dem Theorieteil, und diese Zahl fällt bei jedem Ausgangsfeld gleich aus, auch bei einem bereits sortierten.
nach vier Durchläufen mit 10 Vergleichen und höchstens 4 Vertauschungen.
Zwei sortierte Hälften mischen
Mische und zu einer sortierten Folge und bestimme den Aufwand.
- 1
Regel: Immer die beiden vordersten Elemente vergleichen und das kleinere übernehmen.
- 2
Ablauf:
Schritt links rechts Vergleich Ausgabe 1 [1,4,6] [2,3,8] 1 2 [4,6] [2,3,8] 1,2 3 [4,6] [3,8] 1,2,3 4 [4,6] [8] 1,2,3,4 5 [6] [8] 1,2,3,4,6 6 [] [8] links leer 1,2,3,4,6,8 - 3
Warum das genügt: Da beide Hälften sortiert sind, ist das kleinste noch nicht ausgegebene Element zwangsläufig eines der beiden vordersten. Man muss also nie weiter hineinschauen.
- 4
Aufwand: Jeder Schritt gibt genau ein Element aus, und insgesamt sind es Elemente. Also Vergleiche.
- 5
Wichtig für die Stabilität: Bei Gleichstand nimmt man das Element aus der linken Hälfte. Damit bleiben gleichwertige Elemente in ihrer ursprünglichen Reihenfolge, und das Verfahren ist stabil.
- 6
Der Schluss auf : Dieses Mischen findet auf jeder Halbierungsebene statt, insgesamt kostet jede Ebene . Da es Ebenen gibt, ergibt sich .
in sechs Schritten. Mischen kostet , weil jedes Element genau einmal angefasst wird.
Typischer Fehler
„Sortieren durch Auswahl ist schneller, wenn das Feld schon fast sortiert ist."
Das gilt für das Sortieren durch Einfügen, nicht für das durch Auswahl, und der Unterschied lohnt genaues Hinsehen.
Beim Sortieren durch Auswahl muss die innere immer den gesamten Restbereich durchsuchen, um das kleinste Element sicher zu finden. Sie kann nicht früher abbrechen, denn das Minimum könnte ganz am Ende stehen. Deshalb sind es immer Vergleiche, ob das Feld bereits sortiert ist oder nicht. Bester und schlechtester Fall sind identisch.
Beim Sortieren durch Einfügen ist das anders. Die innere Schleife bricht ab, sobald ein kleineres Element gefunden wird. In einem bereits sortierten Feld ist das sofort der Fall, also bleibt es bei einem Vergleich je Element und damit insgesamt.
Was beim Auswahlverfahren tatsächlich sinkt, ist die Zahl der Vertauschungen: höchstens , unabhängig von den . Das ist sein einziger echter Vorteil, und er zählt nur, wenn das Umlagern der Elemente teuer ist, etwa bei sehr großen Datensätzen.
Die Lehre daraus ist allgemeiner: Man muss unterscheiden, was gezählt wird. Vergleiche und Vertauschungen sind zwei verschiedene Kostenarten, und welche wichtiger ist, hängt von den Daten ab.
Übung 1
leichta) Sortiere durch Auswahl und notiere jeden Durchlauf. b) Wie viele Vergleiche braucht das Verfahren bei ? c) Welches der behandelten Verfahren wird schneller, wenn das Feld schon fast sortiert ist?
Tipp anzeigen
Zu b): Verwende .
Lösung anzeigen
a) Durchläufe:
Durchlauf 1: Kleinstes ist 1 an Index 1, tausche mit Index 0. Durchlauf 2: Kleinstes im Rest ist 2 an Index 3, tausche mit Index 1. Durchlauf 3: Kleinstes im Rest ist 3, steht schon richtig.
b) Vergleiche.
c) Sortieren durch Einfügen. Die innere bricht ab, sobald ein kleineres Element gefunden wird; bei einem bereits sortierten Feld ist das sofort der Fall, und es bleiben Vergleiche, also .
Detaillierte Schritterklärung anzeigen
Hier wird jeder Schritt einzeln erklärt, vor allem, warum er gemacht wird.
✦ Empfohlen: Standard – Die normale Erklärungstiefe passt zum Einstieg.
- 1
a) Sortieren durch Auswahl: jeden Durchlauf einzeln notieren
Das Verfahren sucht in jedem Durchlauf das kleinste Element des Restes und tauscht es nach vorn. Durchlauf 1: Kleinstes ist 1 an Index 1, tauschen mit Index 0 → . Durchlauf 2: Kleinstes im Rest ist 2 an Index 3, tauschen mit Index 1 → . Durchlauf 3: Kleinstes im Rest ist 3, steht schon richtig.
- 2
b) Die Vergleichszahl über die Summenformel
Im ersten Durchlauf werden Elemente verglichen, im zweiten , und so weiter. Die Summe ergibt . Für : Vergleiche.
Zwischenergebnis
15 Vergleiche.
- 3
c) Welches Verfahren von einer Vorsortierung profitiert
Sortieren durch Einfügen. Seine innere Schleife bricht ab, sobald ein kleineres Element gefunden wird; bei einem bereits sortierten Feld ist das sofort der Fall, und es bleiben Vergleiche, also .
Übung 2
mittela) Sortiere durch Einfügen. Notiere den Feldzustand nach jedem eingefügten Element. b) Wie viele Vergleiche braucht dieses Verfahren im besten und im schlechtesten Fall? c) Erkläre, was die Invariante des Verfahrens ist und wozu sie dient. d) Warum ist das Sortieren durch Auswahl nicht stabil? Gib ein Gegenbeispiel.
Tipp anzeigen
Zu d): Betrachte zwei gleiche Werte und ein kleineres Element weiter hinten.
Lösung anzeigen
a) Ablauf, der bereits sortierte Teil ist fett:
Start: , Wert 3: vor die 7 → , Wert 9: bleibt hinten → , Wert 2: ganz nach vorn → , Wert 5: zwischen 3 und 7 →
b) Bester Fall (schon sortiert): Jedes Element wird genau einmal mit seinem linken Nachbarn verglichen, die innere bricht sofort ab. Das sind Vergleiche, also .
Schlechtester Fall (absteigend sortiert): Jedes Element muss bis ganz nach vorn geschoben werden, also Vergleiche, also .
c) Die Invariante lautet: Nach jedem Durchlauf der äußeren Schleife ist der Bereich von Index 0 bis sortiert. Sie gilt vor dem ersten Durchlauf (ein einzelnes Element ist trivialerweise sortiert) und bleibt bei jedem Schritt erhalten, weil das neue Element genau an seine richtige Stelle geschoben wird.
Wozu: Sie ist die Begründung, dass das Verfahren wirklich sortiert. Am Ende ist , also der gesamte Bereich sortiert. Ohne eine solche Aussage könnte man nur beobachten, dass es in den ausprobierten Fällen funktioniert hat.
d) Betrachte , wobei die Kennzeichnungen nur der Unterscheidung dienen.
Durchlauf 1: Kleinstes ist die 1 an Index 2, sie wird mit Index 0 vertauscht → .
Die beiden Dreien haben ihre Reihenfolge getauscht: vorher stand vor , jetzt umgekehrt. Das Verfahren ist also nicht stabil. Die Ursache ist das Vertauschen über weite Strecken: Das Element an Position wird an eine ganz andere Stelle geworfen, ohne Rücksicht auf gleichwertige Elemente dazwischen.
Detaillierte Schritterklärung anzeigen
Hier wird jeder Schritt einzeln erklärt, vor allem, warum er gemacht wird.
✦ Empfohlen: Standard – Die normale Erklärungstiefe passt zum Einstieg.
- 1
Teil a): Den sortierten Teil markieren
Man schreibt nach jedem Schritt das ganze Feld auf und markiert, welcher Teil bereits sortiert ist. Genau dieser Teil wächst in jedem Durchlauf um eins.
Zwischenergebnis
Nach : .
Beachte, dass die 9 in ihrem Durchlauf gar nicht bewegt wird. Die innere Schleife bricht sofort ab, weil links davon ein kleinerer Wert steht.
- 2
Teil b): Beide Extreme konstruieren
Man überlegt, welche Eingabe die innere Schleife sofort abbrechen lässt und welche sie maximal lange laufen lässt. Das sind das bereits sortierte und das absteigend sortierte Feld.
1 + 2 + \ldots + (n-1) = \frac{n(n-1)}{2}
Zwischenergebnis
bester, schlechtester Fall.
- 3
Teil c): Was eine Invariante leistet
Die Invariante ist eine Aussage, die vor und nach jedem Schleifendurchlauf gilt. Hier: Der Bereich links von ist sortiert.
Zwischenergebnis
Am Ende ist der ganze Bereich sortiert.
- 4
Teil d): Ein Gegenbeispiel konstruieren
Man braucht zwei gleichwertige Elemente und ein kleineres dahinter, das den Tausch über sie hinweg auslöst.
[3_a, 3_b, 1] \to [1, 3_b, 3_a]
Zwischenergebnis
Die Reihenfolge der Dreien ist vertauscht.
Ein einziges Gegenbeispiel genügt, um Stabilität zu widerlegen. Um sie zu belegen, müsste man dagegen für alle Fälle argumentieren.
Übung 3
schwera) (Vertiefung) Erkläre das Prinzip Teile und herrsche am Sortieren durch Mischen und begründe den Aufwand . b) (Vertiefung) Warum kann kein vergleichendes Sortierverfahren schneller als sein? c) Warum sortieren gute Bibliotheken kurze Teilstücke mit einem -Verfahren? d) Wann ist Stabilität wichtig? Nenne ein konkretes Beispiel.
Tipp anzeigen
Zu b): Wie viele Anordnungen gibt es, und wie viele Fälle unterscheiden Vergleiche?
Lösung anzeigen
a) Prinzip: Das Feld wird in zwei Hälften geteilt (teilen), jede Hälfte auf dieselbe Weise sortiert (herrschen, also ), und die beiden sortierten Hälften werden gemischt (zusammenfügen). Der Abbruch erfolgt bei Länge 1, denn ein einzelnes Element ist bereits sortiert.
Aufwand: Das Halbieren lässt sich -mal durchführen, bis Stücke der Länge 1 übrig sind. Auf jeder dieser Ebenen wird insgesamt jedes Element genau einmal gemischt, was je Ebene kostet, denn beim Mischen zweier sortierter Folgen ist das kleinste Element immer eines der beiden vordersten. Zusammen also Ebenen mal , das ergibt .
b) Es gibt mögliche Anordnungen von Elementen, und genau eine davon ist die sortierte. Das Verfahren muss allein durch Vergleiche herausfinden, welche Anordnung vorliegt.
Jeder Vergleich hat zwei mögliche Ausgänge, teilt die verbliebenen Möglichkeiten also höchstens in zwei Gruppen. Mit Vergleichen sind damit höchstens Fälle unterscheidbar. Notwendig ist folglich
und wächst wie . Also braucht jedes vergleichende Verfahren mindestens diese Größenordnung.
Der Zusatz „vergleichend" ist wesentlich: Verfahren, die zusätzliche Annahmen über die nutzen, unterliegen der Schranke nicht. Weiß man etwa, dass alle Werte ganze Zahlen zwischen 1 und 100 sind, kann man sie in 100 Fächern zählen und ist in fertig, ohne je zwei Werte zu vergleichen.
c) Weil die nur das Wachstum beschreibt und die konstanten Faktoren weglässt. Diese Faktoren sind bei den einfachen Verfahren klein: Sortieren durch Einfügen braucht keine Rekursion, keine Funktionsaufrufe und keinen zusätzlichen Speicher, sondern arbeitet direkt im Feld.
Bei kurzen Stücken, etwa bis zehn oder zwanzig Elementen, überwiegt dieser Vorteil den Nachteil des schlechteren Wachstums. Hinzu kommt, dass die Teilstücke beim Sortieren durch Mischen oft bereits fast sortiert sind, und genau davon profitiert das Einfügeverfahren mit seinem besten Fall .
Das ist kein Widerspruch zur Theorie, sondern ihre saubere Anwendung: Die Aussage von gilt für große , und die Bibliothek nutzt genau die Lücke, die für kleine bleibt.
d) Immer dann, wenn mehrstufig sortiert wird.
Konkretes Beispiel: Eine Tabelle mit Schülerdaten soll nach Klasse und innerhalb jeder Klasse nach Nachname geordnet werden. Man sortiert zuerst nach Nachname, dann stabil nach Klasse. Da die stabile zweite Sortierung die Reihenfolge gleicher Klassen unangetastet lässt, bleiben die Nachnamen innerhalb jeder Klasse geordnet.
Mit einem instabilen Verfahren wäre die Ordnung nach Nachname im zweiten Schritt zerstört, und das Ergebnis wäre nur noch nach Klasse sortiert. Genau deshalb bieten Tabellenprogramme und Datenbanken stabile Sortierungen an: Sie erlauben, eine Ansicht schrittweise zu verfeinern.
Detaillierte Schritterklärung anzeigen
Hier wird jeder Schritt einzeln erklärt, vor allem, warum er gemacht wird.
✦ Empfohlen: Standard – Die normale Erklärungstiefe passt zum Einstieg.
- 1
a) (Vertiefung) Teile und herrsche am Sortieren durch Mischen
Prinzip: Das Feld wird in zwei Hälften geteilt, jede Hälfte auf dieselbe Weise sortiert (herrschen, also Rekursion), und die beiden sortierten Hälften werden gemischt. Der Abbruch erfolgt bei Länge 1, denn ein einzelnes Element ist bereits sortiert.
- 2
a) (Vertiefung) Warum der Aufwand O(n log n) ist
Das Halbieren lässt sich -mal durchführen, bis Stücke der Länge 1 übrig sind. Das ist die Zahl der Ebenen. Auf jeder Ebene wird insgesamt jedes Element genau einmal gemischt, was je Ebene kostet. Zusammen: Ebenen mal , also .
- 3
b) (Vertiefung) Die untere Schranke für vergleichendes Sortieren
Es gibt mögliche Anordnungen von Elementen, und genau eine davon ist die sortierte. Jeder Vergleich hat zwei mögliche Ausgänge, teilt die verbliebenen Möglichkeiten also höchstens in zwei Gruppen. Mit Vergleichen sind damit höchstens Fälle unterscheidbar. Notwendig ist folglich , also , und wächst wie .
- 4
c) Warum Bibliotheken kurze Teilstücke mit O(n²) sortieren
Weil die O-Notation nur das Wachstum beschreibt und die konstanten Faktoren weglässt. Diese Faktoren sind bei den einfachen Verfahren klein: Sortieren durch Einfügen braucht keine Rekursion, keine Funktionsaufrufe und keinen zusätzlichen Speicher, sondern arbeitet direkt im Feld. Bei kurzen Stücken, etwa bis zehn oder zwanzig Elementen, überwiegt dieser Vorteil den Nachteil des schlechteren Wachstums.
- 5
d) Wann Stabilität wichtig ist
Immer dann, wenn mehrstufig sortiert wird. Beispiel: Eine Tabelle mit Schülerdaten soll nach Klasse und innerhalb jeder Klasse nach Nachname geordnet werden. Man sortiert zuerst nach Nachname, dann stabil nach Klasse, da die stabile zweite Sortierung die Reihenfolge gleicher Klassen unangetastet lässt, bleiben die Nachnamen innerhalb jeder Klasse geordnet.
Zusammenfassung
Sortieren durch Auswahl sucht wiederholt das kleinste Element des Restes und tauscht es nach vorn; es braucht immer Vergleiche, unabhängig von den , dafür aber höchstens Vertauschungen. Sortieren durch Einfügen schiebt jedes Element in den bereits sortierten linken Teil und profitiert deshalb von Vorsortierung, mit im besten und im schlechtesten Fall; der sortierte linke Teil ist dabei die Invariante, aus der sich die Richtigkeit des Verfahrens begründen lässt. Alle Verfahren mit zwei geschachtelten bleiben bei , weshalb ein echter Fortschritt eine andere Idee verlangt: Teile und herrsche zerlegt das Feld, sortiert die Teile und mischt sie anschließend, was über Ebenen mit je Mischaufwand auf führt, allerdings zum Preis von zusätzlichem Speicher. Stabilität, also die Erhaltung der Reihenfolge gleichwertiger Elemente, entscheidet darüber, ob mehrstufiges Sortieren möglich ist. Schneller als kann kein vergleichendes Verfahren sein, denn Vergleiche unterscheiden höchstens Fälle, und es gibt mögliche Anordnungen.


