Menu
Coddy logo textTech

Insertionsort

Zuletzt aktualisiert

Insertionsort baut das sortierte Array Element für Element auf. Es nimmt das nächste unsortierte Element (den „Schlüssel") und verschiebt jedes größere Element im sortierten Bereich um eine Position nach rechts, dann setzt es den Schlüssel in die Lücke. Genau so sortieren die meisten Menschen ein Blatt Spielkarten. Drücke oben auf Abspielen, um zu sehen, wie jeder Schlüssel eingefügt wird, oder gehe die Verschiebungen einzeln durch.

Insertionsort ist bei kleinen oder fast sortierten Eingaben sehr schnell - es läuft in O(n), wenn die Daten bereits sortiert sind - weshalb viele hybride Sortierverfahren für kleine Teilarrays darauf zurückgreifen.

Zeit- und Platzkomplexität

FallKomplexitätAnmerkungen
Bester FallO(n)Bereits sortiert
Durchschnittlicher FallO(n²)Zufällige Reihenfolge
Schlechtester FallO(n²)Umgekehrt sortiert
PlatzO(1)In-place
StabilJaGleiche Elemente behalten ihre relative Reihenfolge

Schritt für Schritt

SchrittWas passiert
1Behandle das erste Element als sortierten Bereich der Größe eins.
2Nimm das nächste Element als Schlüssel.
3Verschiebe jedes sortierte Element, das größer als der Schlüssel ist, um eine Position nach rechts.
4Füge den Schlüssel in die geöffnete Lücke ein.
5Wiederhole, bis jedes Element eingefügt wurde.

Durchgerechnetes Beispiel

Sortieren von [5, 2, 4, 1]:

DurchlaufArrayAktion
Start[5, 2, 4, 1]5 ist der anfängliche sortierte Bereich der Größe eins.
1[2, 5, 4, 1]Schlüssel 2: 5 nach rechts verschieben, 2 am Anfang einfügen.
2[2, 4, 5, 1]Schlüssel 4: 5 nach rechts verschieben, 2 ist kleiner, also stoppen, 4 einfügen.
3[1, 2, 4, 5]Schlüssel 1: 5, 4, 2 nach rechts verschieben, 1 am Anfang einfügen.
Fertig[1, 2, 4, 5]Alle Elemente eingefügt; das Array ist sortiert.

Wann Insertionsort verwenden

Verwenden, wennVermeiden, wenn
Das Array klein ist (etwa n < 20).Das Array groß und zufällig angeordnet ist.
Die Daten bereits fast sortiert sind, was den besten Fall O(n) ergibt.Du einen garantierten schlechtesten Fall von O(n log n) brauchst.
Du eine stabile, in-place-Sortierung mit O(1) zusätzlichem Speicher brauchst.Das Verschieben von Elementen teuer ist, da es viele Verschiebungen durchführt.
Daten inkrementell eintreffen und online sortiert bleiben müssen.Die Eingabe umgekehrt sortiert ist, ihr schlechtester Fall O(n²).

Insertion Sort-Code

Eine saubere, lauffähige Insertion Sort-Implementierung in Python, JavaScript, Java, C++, C. Wähle eine Sprache, kopiere den Code oder öffne ihn vorgeladen im Coddy-Playground.

Insertion Sort-Code in Python

Python
1def insertion_sort(a):2    for i in range(1, len(a)):3        key = a[i]4        j = i - 15        # Shift larger elements one slot to the right6        while j >= 0 and a[j] > key:7            a[j + 1] = a[j]8            j -= 19        a[j + 1] = key10    return a11
12
13nums = [7, 3, 9, 1, 5, 8, 2]14print("Before:", nums)15insertion_sort(nums)16print("After: ", nums)
Führe diesen Code im Python-Playground aus

Insertionsort-FAQ

Wie ist die Zeitkomplexität von Insertionsort?
Insertionsort ist im Durchschnitt und im schlechtesten Fall O(n²), aber O(n) bei einem bereits sortierten oder fast sortierten Array. Es verwendet O(1) zusätzlichen Speicher.
Ist Insertionsort stabil?
Ja. Insertionsort verschiebt nur Elemente, die streng größer als der Schlüssel sind, sodass gleiche Elemente sich niemals überholen und ihre relative Reihenfolge erhalten bleibt.
Wann sollte ich Insertionsort verwenden?
Verwende es für kleine Arrays oder Daten, die bereits fast sortiert sind. Wegen seines geringen Overheads und seines adaptiven besten Falls nutzen hybride Algorithmen wie Timsort es für kleine Läufe.
Was ist der Unterschied zwischen Insertionsort und Bubblesort?
Beide sind O(n²)-Vergleichssortierungen, aber Insertionsort verschiebt Elemente, um eine Lücke für den Schlüssel zu öffnen, während Bubblesort wiederholt benachbarte, falsch geordnete Paare vertauscht. Insertionsort führt in der Regel weniger Schreibvorgänge durch und schneidet in der Praxis besser ab, besonders bei fast sortierten Daten, wo es seinen besten Fall O(n) erreicht.
Warum ist Insertionsort bei kleinen Arrays schneller als Mergesort?
Insertionsort hat einen sehr geringen konstanten Overhead und keine Rekursion oder zusätzliche Speicherzuweisung, sodass es bei kleinen Eingaben trotz seiner schlechteren asymptotischen Komplexität die O(n log n)-Sortierungen schlägt. Genau deshalb wechseln hybride Sortierverfahren wie Timsort und Introsort für kleine Teilarrays zu Insertionsort.
Funktioniert Insertionsort besser mit einer verketteten Liste oder einem Array?
Insertionsort wird normalerweise für Arrays geschrieben, wo das Verschieben von Elementen die Hauptkosten ausmacht. Bei einer verketteten Liste vermeidest du das Verschieben, indem du den Knoten an seine Stelle einfügst, aber du verlierst den schnellen wahlfreien Zugriff, sodass das Finden der Einfügestelle pro Element weiterhin lineare Zeit kostet und die Gesamtkosten O(n²) bleiben.
Coddy programming languages illustration

Meistere Algorithmen mit Coddy

LOS GEHT'S