Der Insertion-Sort-Algorithmus ähnelt sehr dem Selection-Sort-Verfahren. Er ist intuitiv aufgebaut, hält den linken Teil des Arrays stets sortiert und iteriert dann Element für Element bis zum Ende des Arrays.
Genauer gesagt beginnt Insertion Sort beim ganz linken Element und bewegt sich schrittweise nach rechts. Sobald wir ein Element finden, das kleiner als die bereits verarbeiteten Elemente zu seiner Linken ist, werden diese nach rechts verschoben, um Platz für das aktuelle Element zu schaffen, das anschließend an seine korrekte Position gesetzt wird. Nehmen wir zum Beispiel das Array [0, 2, 4, 1, 10, 8] und betrachten das Element 1. Zuerst verschieben wir 4, dann 2 nach rechts und platzieren 1 zwischen 0 und 2. Dadurch erhalten wir [0, 1, 2, 4, 10, 8]. Als Nächstes betrachten wir 10. Weil es größer als alle Elemente zu seiner Linken ist, erfolgt keine Aktion. Dann betrachten wir 8 und verschieben 10 nach rechts, damit 8 zwischen 4 und 10 einsortiert werden kann.
a = [...]
for i in range(1, len(a)): # Beginne beim zweiten Element
while i > 0 and a[i] < a[i - 1]: # solange das aktuelle Element kleiner ist
a[i - 1], a[i] = a[i], a[i - 1] # tausche das aktuelle Element mit dem Vorgänger
i -= 1 # behalte den Index des aktuellen Elements im Blick
print(a)
Der Insertion-Sort-Algorithmus setzt also das aktuelle Element an der richtigen Stelle im bereits verarbeiteten Teil des Arrays ein. Im schlimmsten Fall – wenn die Elemente des Arrays in absteigender Reihenfolge angeordnet sind – müssen sämtliche Vorgänger eines Elements verschoben werden, um es richtig einzufügen. Diese Situation führt zu insgesamt Operationen.
Lassen Sie uns den Algorithmus an einigen Arrays durchspielen: