Einfügesortierung (englisch: Insertion Sort) funktioniert ähnlich wie viele Menschen instinktiv Spielkarten auf der Hand sortieren: Du nimmst eine Karte und schiebst sie an die richtige Position zwischen die bereits sortierten Karten. So entsteht nach und nach eine vollständig sortierte Reihe.
So funktioniert Einfügesortierung
Stell dir die Liste [5, 2, 8, 3, 9] vor:
- Beginne mit dem zweiten Element. Das erste gilt als "bereits sortiert".
- Nimm
2: Ist es kleiner als5? Ja → verschiebe5nach rechts, füge2ein →[2, 5, 8, 3, 9] - Nimm
8: Ist es kleiner als5? Nein → bleibt →[2, 5, 8, 3, 9] - Nimm
3: Vergleiche rückwärts: kleiner als8? Ja → verschiebe. Kleiner als5? Ja → verschiebe. Kleiner als2? Nein → füge ein →[2, 3, 5, 8, 9] - Nimm
9: Größer als alle → bleibt →[2, 3, 5, 8, 9]
Python-Implementierung
def einfuege_sortierung(elemente):
for i in range(1, len(elemente)):
schluessel = elemente[i] # aktuelles Element zum Einsetzen
j = i - 1
# Verschiebe größere Elemente nach rechts
while j >= 0 and elemente[j] > schluessel:
elemente[j + 1] = elemente[j]
j -= 1
# Schlüssel an der richtigen Stelle einfügen
elemente[j + 1] = schluessel
return elemente
zahlen = [5, 2, 8, 3, 9]
print(einfuege_sortierung(zahlen)) # [2, 3, 5, 8, 9]
Der Schlüsselschritt ist elemente[j + 1] = elemente[j]: Elemente werden nach rechts "verschoben", um Platz für das einzufügende Element zu schaffen. Am Ende wird das Element in die freigemachte Lücke gesetzt.
Schritt-für-Schritt-Visualisierung
Für [5, 2, 8, 3, 9]:
| Schritt | Schlüssel | Liste |
|---|---|---|
| Start | — | [5, 2, 8, 3, 9] |
| i=1 | 2 | [2, 5, 8, 3, 9] |
| i=2 | 8 | [2, 5, 8, 3, 9] |
| i=3 | 3 | [2, 3, 5, 8, 9] |
| i=4 | 9 | [2, 3, 5, 8, 9] |
Stärken von Einfügesortierung
Einfügesortierung hat gegenüber Bubble-Sort und Auswahlsortierung einen wichtigen Vorteil: Bei fast sortierten Listen ist sie sehr schnell:
# Fast sortierte Liste — Einfügesortierung ist hier sehr effizient
fast_sortiert = [1, 2, 4, 3, 5] # nur ein Tausch nötig
Im besten Fall (bereits sortierte Liste) macht Einfügesortierung nur n - 1 Vergleiche — das ist O(n), viel besser als O(n²)!
Einfügesortierung ist der bevorzugte Algorithmus für kleine Listen und für fast sortierte Daten. Viele professionelle Sortierimplementierungen, wie Pythons sorted(), wechseln intern zu Einfügesortierung, wenn die zu sortierende Teilmenge klein genug ist.
Vergleich der drei einfachen Algorithmen
| Algorithmus | Bester Fall | Schlechtester Fall | Stabil |
|---|---|---|---|
| Bubble-Sort | O(n) optimiert | O(n²) | Ja |
| Auswahlsortierung | O(n²) | O(n²) | Nein |
| Einfügesortierung | O(n) | O(n²) | Ja |
Alle drei Algorithmen sind für sehr große Listen (tausende Elemente) zu langsam. Für große Datenmengen verwendet man schnellere Verfahren wie Mergesort (O(n log n)). Dennoch sind diese einfachen Algorithmen wichtig, um grundlegende Konzepte zu verstehen.
Übungsaufgaben
Was passiert in Einfügesortierung mit dem Element an Position i=2, wenn die Liste [1, 3, 2, 5, 4] ist?
Antwort anzeigen
Warum ist Einfügesortierung besonders gut für fast sortierte Listen geeignet?