Sortieren 1: Bubblesort, Selectionsort und Insertionsort
Selectionsort macht bei jeder Liste mit 10 Werten genau 45 Vergleiche, ob die Liste gemischt oder schon geordnet beginnt.
Dinge in Ordnung bringen
Sortieren heißt, eine Liste so umzuordnen, dass ihre Werte vom kleinsten zum größten laufen (oder nach Name, Datum, Preis, jeder Ordnung, nach der man vergleichen kann). Es ist eine der häufigsten Aufgaben eines Computers: die Kontakte im Handy, Suchergebnisse nach Relevanz, eine Tabellenspalte nach Datum. Sortieren erleichtert auch andere Aufgaben. Wie die letzte Einheit gezeigt hat, lässt sich eine sortierte Liste binär durchsuchen, und doppelte Werte stehen in einer sortierten Liste nebeneinander.
Diese Einheit behandelt drei einfache Verfahren. Alle drei vergleichen jeweils zwei Werte und verschieben Werte innerhalb derselben Liste. Sie sind kurz zu schreiben und leicht nachzuvollziehen, und alle drei werden bei langen Listen stark langsamer. Zu beobachten, warum, ist die beste Vorbereitung auf die schnelleren Verfahren der nächsten Einheit. Dabei zählen wir durchgehend zwei Dinge: Vergleiche (die Frage „ist dieser Wert größer als jener?“) und Vertauschungen (zwei Werte tauschen die Plätze).
Bubblesort: Nachbarn in falscher Reihenfolge vertauschen
Bubblesort läuft die Liste entlang und vergleicht jedes Nachbarpaar. Ist der linke Wert größer, werden die beiden vertauscht. Nach einem vollen Durchlauf ist der größte Wert Schritt für Schritt ganz nach rechts gewandert, wie eine aufsteigende Blase, und muss sich nie wieder bewegen. Der nächste Durchlauf kann eine Stelle früher aufhören. Eine übliche Verbesserung: auf einen Durchlauf ganz ohne Vertauschung achten. Dann ist alles schon geordnet, und das Sortieren kann früher enden.
Verfolge es an der Liste [5, 1, 4, 2, 8]. Der erste Durchlauf vergleicht 5 und 1 (tauschen), 5 und 4 (tauschen), 5 und 2 (tauschen), 5 und 8 (lassen): Die Liste ist jetzt [1, 4, 2, 5, 8], und 8 steht an seinem Platz. Der zweite Durchlauf vergleicht 1 und 4, 4 und 2 (tauschen), 4 und 5, das ergibt [1, 2, 4, 5, 8]. Der dritte Durchlauf vergleicht 1 und 2, dann 2 und 4, tauscht nichts und hört auf. Insgesamt: 4 + 3 + 2 = 9 Vergleiche und 4 Vertauschungen.
function bubbleSort(a) {
for (let pass = 0; pass < a.length - 1; pass++) {
let swapped = false;
for (let j = 0; j < a.length - 1 - pass; j++) {
if (a[j] > a[j + 1]) {
[a[j], a[j + 1]] = [a[j + 1], a[j]]; // tauschen
swapped = true;
}
}
if (!swapped) break; // schon sortiert
}
return a;
}Selectionsort: das Kleinste suchen und als Nächstes einsetzen
Selectionsort funktioniert so, wie viele Leute Spielkarten auf der Hand ordnen. Durchsuche die ganze Liste nach dem kleinsten Wert und tausch ihn an die erste Stelle. Dann durchsuche den Rest nach dem kleinsten übrigen Wert und tausch ihn an die zweite Stelle, und so weiter. Bei [5, 1, 4, 2, 8] findet der erste Durchgang 1 und tauscht es mit 5. Der zweite findet 2 und tauscht es mit 5. Die letzten beiden Durchgänge finden 4 und 5 schon an ihrem Platz. Das sind nur 2 Vertauschungen, aber die Durchgänge vergleichen trotzdem 4 + 3 + 2 + 1 = 10 Mal.
Selectionsort hört nie früher auf. Selbst bei einer schon sortierten Liste muss es jeden übrigen Wert prüfen, um sicher zu sein, dass es den kleinsten hat. Bei n Werten summieren sich die Vergleiche immer zu (n − 1) + (n − 2) + … + 1 = n(n − 1)/2. Bei 10 Werten sind das 45, bei 100 Werten 4950, bei 1000 Werten 499 500. Seine Stärke ist die kleine Zahl an Vertauschungen: höchstens n − 1. Das zählt, wenn das Verschieben eines Werts teuer ist.
Insertionsort: jeden neuen Wert an seinen Platz schieben
Insertionsort hält den linken Teil der Liste sortiert und vergrößert ihn um einen Wert nach dem anderen. Es nimmt den nächsten Wert und schiebt ihn nach links, indem es ihn mit seinem Nachbarn tauscht, bis der Nachbar nicht größer ist. Dann steht dieser Wert an seinem Platz zwischen den sortierten. Bei einer Liste, die schon fast geordnet ist, rückt jeder neue Wert nur ein oder zwei Schritte, deshalb ist Insertionsort dort sehr schnell. Bei [5, 1, 4, 2, 8] macht es 7 Vergleiche und 4 Vertauschungen.
Zum Drehen ziehen. Zum Zoomen scrollen oder mit zwei Fingern ziehen.
Vertauschungen zählen: Fehlstellungen
Es gibt einen eleganten Weg vorherzusagen, wie viele Vertauschungen Bubblesort und Insertionsort brauchen. Zähl die Fehlstellungen (Inversionen): Paare von Werten, die zueinander in der falschen Reihenfolge stehen. In [5, 1, 4, 2, 8] sind das (5, 1), (5, 4), (5, 2) und (4, 2), insgesamt vier. Jede Vertauschung zweier Nachbarn in falscher Reihenfolge behebt genau eine Fehlstellung und erzeugt keine neue, also machen beide Verfahren genau 4 Vertauschungen. Eine umgekehrte Liste mit n Werten hat jedes Paar vertauscht, also n(n − 1)/2 Fehlstellungen, und das ist der schlechteste Fall.
| Verfahren | Beispiel | Sortiert (5 Werte) | Umgekehrt (4 Werte) |
|---|---|---|---|
| Bubblesort | 9 / 4 | 4 / 0 | 6 / 6 |
| Selectionsort | 10 / 2 | 10 / 0 | 6 / 2 |
| Insertionsort | 7 / 4 | 4 / 0 | 6 / 6 |
Jede Zelle zeigt Vergleiche / Vertauschungen. Die Beispielliste ist [5, 1, 4, 2, 8]. Bubblesort ist hier die Version, die nach einem Durchlauf ohne Vertauschung aufhört.
Alle drei Verfahren haben dieselbe Schwäche. Im schlechtesten Fall vergleicht jedes ungefähr jedes Paar von Werten, also etwa n²/2 Vergleiche. Verdoppelt sich die Liste, vervierfacht sich die Arbeit. Zehnmal so viele Werte heißen hundertmal so viel Arbeit. Bei ein paar Dutzend Werten spielt das kaum eine Rolle, bei einer Million ist es hoffnungslos, und die nächste Einheit zeigt, wie es viel besser geht.
| Vergleich | Die Frage, ob ein Wert größer ist als ein anderer |
| Vertauschung | Zwei Werte tauschen die Plätze |
| Durchlauf | Ein Gang die Liste entlang |
| Bubblesort | Nachbarn in falscher Reihenfolge vertauschen; der größte Wert steigt bei jedem Durchlauf ans Ende |
| Selectionsort | Den kleinsten übrigen Wert suchen und an die nächste Stelle tauschen |
| Insertionsort | Jeden neuen Wert nach links in den sortierten Teil schieben |
| Fehlstellung (Inversion) | Ein Paar von Werten, die zueinander in der falschen Reihenfolge stehen |
| n(n − 1)/2 | Die Zahl der Paare unter n Werten |
- Wie viele Vergleiche macht Selectionsort bei einer beliebigen Liste mit 10 Werten?
- Wie viele Fehlstellungen hat [3, 1, 2]?
- Wie viele Vertauschungen macht Insertionsort bei [4, 3, 2, 1]?
- Welcher Wert steht nach dem ersten Durchlauf von Bubblesort sicher an seinem endgültigen Platz?
- Der kleinste, vorn
- Der größte, am Ende
- Der mittlere Wert
- Noch keiner
- Welches Verfahren macht bei [5, 1, 4, 2, 8] die wenigsten Vertauschungen?
- Bubblesort
- Selectionsort
- Insertionsort
- Eine Liste ist schon sortiert. Welches Verfahren macht trotzdem n(n − 1)/2 Vergleiche?
- Bubblesort mit frühem Abbruch
- Selectionsort
- Insertionsort
- Wie viele Vergleiche macht Bubblesort (mit frühem Abbruch) bei [5, 1, 4, 2, 8]?
- Aus einer Liste mit 1000 Werten werden 2000 Werte. Wie ändert sich die Arbeit von Insertionsort im schlechtesten Fall ungefähr?
- Sie verdoppelt sich
- Sie wird etwa viermal so groß
- Sie wächst um 1000 Schritte
- Sie bleibt gleich
- Welches Verfahren ist für eine schon fast sortierte Liste die beste Wahl?
- Insertionsort
- Selectionsort
- Egal, alle sind gleich gut
- Wie viele Paare lassen sich aus 100 Werten bilden (die Zahl der Vergleiche im schlechtesten Fall, n(n − 1)/2)?
- Bring die Liste [3, 1, 2] in die Reihenfolge der Zwischenstände von Insertionsort.
- Bubblesort vertauscht Nachbarn; jeder Durchlauf trägt den größten Wert ans Ende.
- Selectionsort macht immer n(n − 1)/2 Vergleiche und höchstens n − 1 Vertauschungen.
- Insertionsort ist bei fast sortierten Listen schnell.
- Bubblesort und Insertionsort machen eine Vertauschung pro Fehlstellung.
- Alle drei brauchen im schlechtesten Fall etwa n² Schritte.
Quellen zu diesem Kurs (11)
- MIT OpenCourseWare 6.006 Introduction to Algorithms, Spring 2020 (Demaine, Ku, Solomon)
- lecture notes 1 Introduction, 3 Sorting, 9 Breadth-First Search, 10 Depth-First Search (ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/pages/lecture-notes) and Fall 2011 lecture 13 BFS notes (ocw.mit.edu/courses/6-006-introduction-to-algorithms-fall-2011)
- Cormen, Leiserson, Rivest, Stein, Introduction to Algorithms (MIT Press)
- with the CLRS-based Khan Academy algorithms unit by Thomas Cormen and Devin Balkcom of Dartmouth (khanacademy.org/computing/computer-science/algorithms: binary search, selection sort analysis, merge sort, quicksort overview and analysis)
- MacTutor History of Mathematics, Al-Khwarizmi (mathshistory.st-andrews.ac.uk/Biographies/Al-Khwarizmi: word algorithm from the Latin title Algoritmi de numero Indorum)
- D. E. Joyce, Euclid's Elements Book VII Propositions 1 and 2 (mathcs.clarku.edu/~djoyce/elements/bookVII)
- Wolfram MathWorld, Merge Sort (mathworld.wolfram.com/MergeSort.html: proposed by John von Neumann in 1945, after Knuth 1998 p. 159)
- Stanford CS "Tony Hoare: Quicksort" (cs.stanford.edu/people/eroberts/courses/soco/projects/2008-09/tony-hoare/quicksort.html: devised while a student at Moscow State University for Russian-English machine translation with a tape dictionary, programmed in Algol 60 and published 1961; the year 1959 from the Wikipedia Quicksort article and its cited sources)
- Bodleian Libraries, Ada Lovelace (blogs.bodleian.ox.ac.uk/adalovelace: 1843 paper, Note G Bernoulli numbers)
- Fourmilab text of Menabrea's Sketch with Lovelace's notes (fourmilab.ch/babbage/sketch.html)
- Seven Bridges of Konigsberg (Euler 1736) and Tower of Hanoi (Edouard Lucas, 1883) checked against the Wikipedia articles and their cited sources.
Abgerufen: 2026-10-17