Informatik

Sortieralgorithmus: Verfahren einfach vergleichen

Sortieralgorithmus: Verfahren einfach vergleichen
Sortieralgorithmus: Verfahren einfach vergleichen
Für Quiz, Lückentext, Lernkarten und Fortschritt ist JavaScript nötig. Alle Inhalte und Lösungen bleiben direkt lesbar.

Ein Sortieralgorithmus bringt Daten nach einer festgelegten Ordnung in eine Reihenfolge. Dabei dürfen keine Elemente verloren gehen oder neu hinzukommen. Du lernst hier, wie Bubble-, Selection- und Insertionsort arbeiten, woran du ihren Fortschritt erkennst und wie du ihren Aufwand vergleichst.

Deine Lernziele

Hake ab, was du schon kannst — und komm am Ende hierher zurück!

Was muss ein Sortieralgorithmus leisten?

Stell dir eine ungeordnete Liste vor:

[4, 2, 3, 1]

Für eine aufsteigende Ordnung soll daraus [1, 2, 3, 4] werden. Ein korrektes Ergebnis erfüllt zwei Bedingungen:

  1. Die Werte stehen in der verlangten Reihenfolge.
  2. Das Ergebnis enthält genau dieselben Werte wie die Eingabe, auch wenn ein Wert mehrfach vorkommt.
Definition

Sortierschlüssel

Der Sortierschlüssel ist die Eigenschaft, nach der geordnet wird. Bei Zahlen kann der Zahlenwert der Schlüssel sein. Bei Personendaten könnte es das Geburtsjahr sein. Mehrere Datensätze können denselben Schlüssel besitzen.

Die drei Verfahren auf dieser Seite sind vergleichsbasiert: Sie bestimmen die Reihenfolge, indem sie Schlüssel miteinander vergleichen. Sie unterscheiden sich vor allem darin, welcher Teil der Liste bereits als sicher sortiert gilt.

Merke

Beobachte beim Ausführen eines Sortierverfahrens immer drei Dinge: Was wird verglichen? Was wird bewegt? Welcher Bereich ist danach sicher sortiert?

Teste dich
Frage 1 von 1LeichtWelche Ausgabe ist für die Eingabe [3, 1, 3, 2] korrekt aufsteigend sortiert?
Lösung: [1, 2, 3, 3] — Die Werte müssen geordnet sein und mit ihren Häufigkeiten erhalten bleiben.
Wie lässt Bubblesort große Werte nach rechts steigen?

Bubblesort vergleicht benachbarte Werte von links nach rechts. Ist der linke Wert größer, werden beide vertauscht. Nach einer vollständigen Runde steht der größte noch nicht festgelegte Wert ganz rechts.

Beispiel

Wir sortieren [4, 2, 3, 1] aufsteigend.

Runde 1:

  • 4 und 2: tauschen → [2, 4, 3, 1]
  • 4 und 3: tauschen → [2, 3, 4, 1]
  • 4 und 1: tauschen → [2, 3, 1, 4]

Nun steht 4 endgültig rechts.

Runde 2: Nur der Bereich links von 4 ist noch offen.

  • 2 und 3: nicht tauschen
  • 3 und 1: tauschen → [2, 1, 3, 4]

Runde 3:

  • 2 und 1: tauschen → [1, 2, 3, 4]

Eine weitere Prüfrunde ohne Tausch würde bestätigen, dass die ganze Liste sortiert ist. Eine Umsetzung kann dann früh abbrechen.

Der entscheidende Fortschritt lautet: Nach jeder vollständigen Runde wächst rechts der Bereich, dessen Werte bereits an ihrer endgültigen Position stehen.

Teste dich
Frage 1 von 1MittelNach der ersten vollständigen Bubblesort-Runde durch [5, 2, 4, 1] steht welche Folge da?
Lösung: [2, 4, 1, 5] — Die 5 wird nacheinander mit 2, 4 und 1 getauscht und erreicht so den rechten Rand.
Wie wählt Selectionsort jeweils das Minimum aus?

Selectionsort teilt die Liste in einen sortierten linken und einen unsortierten rechten Bereich. In jeder Runde sucht das Verfahren das kleinste Element des unsortierten Bereichs und tauscht es an dessen erste Position.

Beispiel

Wir beginnen wieder mit [4, 2, 3, 1].

  1. Im gesamten Bereich ist 1 das Minimum. Tausch mit 4[1, 2, 3, 4].
  2. Im Rest [2, 3, 4] ist 2 bereits vorn. Es muss kein wertverändernder Tausch stattfinden.
  3. Im Rest [3, 4] ist 3 bereits vorn.

Nach Runde 1 steht das kleinste Element sicher links. Nach Runde 2 stehen die zwei kleinsten Elemente sortiert links. Dieses Muster setzt sich fort.

Diese Aussage über den wachsenden linken Bereich ist eine Schleifeninvariante. Sie beschreibt einen Zustand, der bei jeder passend betrachteten Runde erhalten bleibt, und hilft, die Korrektheit des Verfahrens zu begründen.

Definition

Schleifeninvariante

Eine Schleifeninvariante ist eine Aussage, die bei jeder Wiederholung einer Schleife erhalten bleibt. Bei Selectionsort lautet sie sinngemäß: Links stehen bereits die kleinsten Werte in richtiger Reihenfolge.

Teste dich
Frage 1 von 1MittelSelectionsort bearbeitet [7, 4, 6, 2]. Was geschieht in der ersten Runde?
Lösung: 2 wird als Minimum gefunden und mit 7 getauscht. — Selectionsort sucht zuerst das Minimum im gesamten unsortierten Bereich. Danach wächst der sortierte Bereich links um eine Position.
Wie fügt Insertionsort einen Wert passend ein?

Insertionsort hält links einen sortierten Bereich. Das nächste Element rechts davon wird zwischengespeichert. Größere Werte im sortierten Bereich werden nach rechts verschoben, bis die passende Lücke erreicht ist.

Beispiel

Auch hier ist die Eingabe [4, 2, 3, 1].

  1. [4] gilt als sortiert. Für 2 wird 4 nach rechts verschoben; 2 kommt in die freie Lücke → [2, 4, 3, 1].
  2. Für 3 wird 4 nach rechts verschoben. Weil 2 nicht größer als 3 ist, kommt 3 dahinter → [2, 3, 4, 1].
  3. Für 1 werden 4, 3 und 2 nach rechts verschoben. 1 kommt an den Anfang → [1, 2, 3, 4].

Nach jedem Einfügeschritt ist der linke Bereich wieder vollständig sortiert.

Insertionsort profitiert von Vorsortierung: Steht das nächste Element bereits richtig, sind nur wenige Vergleiche und keine langen Verschiebungen nötig.

Teste dich
Frage 1 von 1MittelDer linke Bereich [2, 5, 8] ist sortiert. Wo wird 6 beim Insertionsort eingefügt?
Lösung: Zwischen 5 und 88 wird nach rechts verschoben. Bei 5 endet die Suche, weil 5 nicht größer als 6 ist.
Worin unterscheiden sich Aufwand, Stabilität und Speicher?

Für den Aufwand zählt man zum Beispiel Vergleiche und Bewegungen. Bei wachsendem n beschreibt die Laufzeitklasse, wie stark der Aufwand wächst.

VerfahrenSortierter Bereich wächstBest CaseWorst CaseVorsortierung hilft
Bubblesort mit frühem Abbruchrechts$\Theta(n)$$\Theta(n^2)$ja
Selectionsortlinks$\Theta(n^2)$$\Theta(n^2)$bei der Zahl der Vergleiche nein
Insertionsortlinks$\Theta(n)$$\Theta(n^2)$ja

$\Theta(n)$ bedeutet hier: Der Aufwand wächst in derselben Größenordnung wie die Anzahl der Elemente. $\Theta(n^2)$ bedeutet quadratisches Wachstum. Verdoppelt sich n, kann der maßgebliche Aufwand ungefähr auf das Vierfache wachsen.

Warum entsteht bei den quadratischen Fällen eine Dreieckssumme? In aufeinanderfolgenden Runden werden höchstens n−1, dann n−2 und so weiter bis 1 Vergleiche benötigt:

$$1+2+\dots+(n-1)=\frac{n(n-1)}{2}$$

Für n = 7 sind das 7 · 6 : 2 = 21 Vergleiche.

Definition

Stabilität

Ein Sortierverfahren ist stabil, wenn Datensätze mit gleichem Sortierschlüssel ihre relative Reihenfolge behalten. Bubblesort ist stabil, wenn nur bei „links größer als rechts“ getauscht wird. Insertionsort ist stabil, wenn nur echt größere Werte verschoben werden. Selectionsort garantiert keine stabile Reihenfolge.

Beispiel: Eine Mitgliederliste ist zunächst alphabetisch geordnet und wird stabil nach Geburtsjahr sortiert. Personen desselben Jahrgangs bleiben dann untereinander alphabetisch geordnet.

Alle drei hier beschriebenen Verfahren können in-place arbeiten: Ihr zusätzlicher Speicherbedarf bleibt unabhängig von der Länge der Eingabe gering und konstant.

Vertiefung: Warum gibt es schnellere Vergleichsverfahren?

Im Modell des vergleichsbasierten Sortierens benötigt jeder Algorithmus im schlechtesten Fall mindestens eine Größenordnung von $\Omega(n\log n)$ Vergleichen. Die drei einfachen Verfahren benötigen im Worst Case dagegen $\Theta(n^2)$. Andere Verfahren können für große Datenmengen deshalb deutlich günstiger skalieren.

Teste dich
Frage 1 von 2MittelEine Liste ist bereits aufsteigend sortiert. Welche Aussage trifft zu?
Lösung: Bubblesort mit Abbruch und Insertionsort können mit linearem Aufwand auskommen. — Vorsortierung verkürzt Bubble- und Insertionsort. Die Zahl der Minimumvergleiche bei Selectionsort bleibt quadratisch.
Frage 2 von 2SchwerEine alphabetisch geordnete Mitgliederliste soll nach Jahrgang sortiert werden; die alphabetische Reihenfolge innerhalb eines Jahrgangs soll erhalten bleiben. Welche Eigenschaft ist entscheidend?
Lösung: Stabilität — Stabilität bewahrt die bisherige relative Reihenfolge von Datensätzen mit gleichem Sortierschlüssel.
Wie wählst du ein passendes einfaches Verfahren?

Es gibt nicht unabhängig von der Situation „den besten“ Algorithmus. Prüfe stattdessen:

  1. Eingabe: Ist sie kurz oder schon fast sortiert?
  2. Ziel: Muss die Reihenfolge gleicher Schlüssel erhalten bleiben?
  3. Kosten: Sind viele Vergleiche oder viele Datenbewegungen besonders teuer?
  4. Größe: Reicht ein einfaches quadratisches Verfahren aus, oder ist besseres Wachstum nötig?
Gut zu wissen

Selectionsort führt immer quadratisch viele Minimumvergleiche aus, kann aber in einer Variante auf höchstens n−1 wertverändernde Tausche kommen. Bubblesort bewegt Werte dagegen durch viele Nachbartausche. Insertionsort verschiebt beim Einfügen nur die Werte, die im Weg stehen.

Deine Anwendung

Sortiere [5, 3, 4, 1] mit Insertionsort. Notiere nach jedem Einfügeschritt den sortierten linken Bereich. Entscheide danach, ob die Eingabe bereits stark vorsortiert war.

Beispiel

Lösung:

  • Start: [5]
  • 3 einfügen: [3, 5] → Gesamtfolge [3, 5, 4, 1]
  • 4 einfügen: [3, 4, 5] → Gesamtfolge [3, 4, 5, 1]
  • 1 einfügen: [1, 3, 4, 5]

Die Eingabe war nur teilweise vorsortiert. Besonders das letzte Element 1 verursacht viele Verschiebungen, weil es vor alle bisherigen Werte gehört.

Teste dich
Frage 1 von 1SchwerEine kurze Liste ist fast sortiert; nur wenige Werte stehen etwas zu weit rechts. Welches der drei Verfahren nutzt diese Vorsortierung durch wenige Verschiebungen besonders direkt?
Lösung: Insertionsort — Insertionsort verschiebt nur größere Werte links vom einzufügenden Element. Bei einer fast sortierten Liste können das sehr wenige sein.
Karteikasten
Karteikasten

Überlege zuerst selbst und drehe die Karte anschließend zum Prüfen um.

Alles auf einen Blick
Mindmap
  • Sortieralgorithmus
    • Korrektes Ergebnis
      • Reihenfolge stimmt
      • Elemente und Häufigkeiten bleiben erhalten
    • Bubblesort
      • Nachbarvergleiche
      • sicherer Bereich rechts
    • Selectionsort
      • Restminimum wählen
      • sicherer Bereich links
    • Insertionsort
      • in linken Bereich einfügen
      • nutzt Vorsortierung
    • Auswahlkriterien
      • Laufzeit und Bewegungen
      • Stabilität und Speicher
Abschluss-Check
Teste dich
Frage 1 von 3LeichtWelches Verfahren sucht in jeder Runde das Minimum des unsortierten Restbereichs?
Lösung: Selectionsort — Selectionsort wählt das Restminimum und setzt es an die erste freie Position des linken sortierten Bereichs.
Frage 2 von 3MittelNach einer vollständigen Bubblesort-Runde steht bei aufsteigender Sortierung sicher welches Element richtig?
Lösung: Das größte Element des betrachteten Bereichs am rechten Rand — Durch die Nachbarvergleiche wandert das größte betrachtete Element bis ganz nach rechts.
Frage 3 von 3SchwerEin Verfahren soll eine fast sortierte Liste bearbeiten und die Reihenfolge gleicher Schlüssel bewahren. Welche begründete Wahl passt unter den drei beschriebenen Varianten am besten?
Lösung: Insertionsort, weil es Vorsortierung nutzt und bei Verschieben nur echt größerer Werte stabil bleibt. — Insertionsort benötigt bei fast sortierten Daten oft wenige Verschiebungen. Die strikte Bedingung „größer“ verhindert, dass gleiche Schlüssel ihre Reihenfolge tauschen.

Passend dazu