www.wikidata.de-de.nina.az
Insertionsort auch Sortieren durch Einfugen englisch insertion das Einfugen und englisch sort sortieren ist ein einfaches stabiles Sortierverfahren d h die Reihenfolge von Elementen mit gleichem Schlusselwert bleibt unverandert Es ist leicht zu implementieren effizient bei kleinen oder bereits teilweise sortierten Eingabemengen Ausserdem benotigt Insertionsort keinen zusatzlichen Speicherplatz da der Algorithmus in place arbeitet Ein weiterer Vorteil besteht darin dass Insertionsort als Online Algorithmus eingesetzt werden kann Animation von InsertionsortDer Insertionsort entnimmt der unsortierten Eingabefolge ein beliebiges Element und fugt es an richtiger Stelle in die anfangs leere Ausgabefolge ein Geht man hierbei in der Reihenfolge der ursprunglichen Folge vor so ist das Verfahren stabil Wird auf einem Array gearbeitet so mussen die Elemente hinter dem neu eingefugten Element verschoben werden Dies ist die eigentlich aufwendige Operation des Insertionsorts Das Auffinden der richtigen Einfugeposition kann uber eine binare Suche vergleichsweise effizient erfolgen Grundsatzlich gilt aber dass Insertionsort weit weniger effizient arbeitet als andere anspruchsvollere Sortierverfahren Inhaltsverzeichnis 1 Problembeschreibung 1 1 Eingabe 2 Implementierung 2 1 Pseudocode 2 2 Struktogramm 3 Beispiel 4 Komplexitat 5 Weiterentwicklung 6 Siehe auch 7 WeblinksProblembeschreibung BearbeitenDas Vorgehen ist mit der Sortierung eines Spielkartenblatts vergleichbar Am Anfang liegen die Karten des Blatts verdeckt auf dem Tisch Die Karten werden nacheinander aufgedeckt und an der korrekten Position in das Blatt das in der Hand gehalten wird eingefugt Um die Einfugestelle fur eine neue Karte zu finden wird entweder die Karte sukzessive von links nach rechts mit den bereits einsortierten Karten des Blattes verglichen oder eine binare Suche durchgefuhrt Zu jedem Zeitpunkt sind die Karten in der Hand sortiert und bestehen aus den bereits vom Tisch entnommenen Karten Zum Einfugen der neuen Karte mussen alle auf der Hand nachfolgenden eine Position weiter nach rechts wandern Eingabe Bearbeiten Eine Folge von n displaystyle n nbsp zu sortierenden Zahlen a 1 a 2 a n displaystyle left a 1 a 2 ldots a n right nbsp Die Zahlen werden auch als Schlussel keys bezeichnet diese sind oft nur ein Bestandteil eines Datensatzes Implementierung BearbeitenPseudocode Bearbeiten Der folgende Pseudocode sortiert die Eingabefolge aufsteigend Um eine absteigende Sortierung zu erreichen ist der zweite Vergleich in Zeile 4 entsprechend zu andern Der Parameter A ist ein Feld mit der zu Beginn unsortierten Folge Nach Beendigung des Algorithmus enthalt A mit den Elementen A 0 A 1 A n 1 die sortierte Folge Hierbei ist zu beachten dass die Indizierung des Feldes mit einer 0 beginnt n displaystyle n nbsp Anzahl der Elemente von An 1 displaystyle n 1 nbsp Index des letzten Elementes von A INSERTIONSORT A for i 1 to Lange A 1 do einzusortierender wert A i j i while j gt 0 and A j 1 gt einzusortierender wert do A j A j 1 j j 1 end while A j einzusortierender wert end for Anmerkungen Die Positionsvariable i kann bei 1 beginnen anstatt bei 0 da ein Sortieren erst beginnt wenn wenigstens zwei Werte gegeben sind i 0 und i 1 erst dann kommt es zum ersten Vergleich Davor kann A 0 als bereits sortiert betrachtet werden Die innere j while Schleife verschiebt im bereits sortierten Bereich 0 i 1 alle zu grosse Elemente eine Position nach hinten Dadurch ergibt sich an richtiger Stelle dann der eine Freiraum um den einzusortierenden Wert einzufugen Struktogramm Bearbeiten Im Folgenden ein Nassi Shneiderman Diagramm Struktogramm des Insertionsort Algorithmus Die Bezeichner sind an obigen Pseudocode angelehnt Zahle i von 1 bis n 1einzusortierender wert A i j iSolange j gt 0 und A j 1 gt einzusortierender wertA j A j 1 j j 1A j einzusortierender wertBeispiel BearbeitenAusfuhrung von Insertionsort auf Eingabefeld A 0 5 displaystyle A 0 5 nbsp Die Komponente auf die der Index i displaystyle i nbsp zeigt ist rot eingefarbt Blau eingefarbte Felder liegen im bereits sortierten Teilfeld A 1 i 1 displaystyle A 1 i 1 nbsp 0 1 2 3 4 55 2 4 6 1 3Da ein einzelnes Element keiner Ordnungsrelation unterliegt beginnt der Index bei i 1 displaystyle i 1 nbsp und das zweite Element wird mit dem ersten verglichen 0 1 2 3 4 55 2 4 6 1 30 1 2 3 4 52 5 4 6 1 3Die 5 rutscht in der blauen sortierten Teilliste nach hinten und die 2 wird am Anfang dieser eingefugt Damit sind die ersten beiden Elemente der Folge sortiert und das nachste Element wird uberpruft i 2 displaystyle i 2 nbsp 0 1 2 3 4 52 5 4 6 1 30 1 2 3 4 52 4 5 6 1 3Bei i 3 displaystyle i 3 nbsp ist nichts weiter zu tun da 6 bereits die richtige Position am Ende der sortierten Teilliste hat 0 1 2 3 4 52 4 5 6 1 3Im vorletzten Schritt wird die 1 ausgewahlt und in die sortierte Liste eingefugt Dabei rutschen alle bisherigen sortierten Elemente in der sortierten Liste um eins nach hinten i 4 displaystyle i 4 nbsp 0 1 2 3 4 52 4 5 6 1 30 1 2 3 4 51 2 4 5 6 3Im letzten Schritt wird die 3 an passender Position in die sortierte Teilliste gebracht i 5 displaystyle i 5 nbsp 0 1 2 3 4 51 2 4 5 6 30 1 2 3 4 51 2 3 4 5 6Nach dem Algorithmus sind alle Felder der Folge sortiert 0 1 2 3 4 51 2 3 4 5 6Komplexitat BearbeitenDie Anzahl der Vergleiche und Verschiebungen des Algorithmus ist von der Anordnung der Elemente in der unsortierten Eingangsfolge abhangig Fur den Average Case ist eine genaue Abschatzung der Laufzeit daher schwierig man kann aber zeigen dass der Average Case in O n 2 displaystyle mathcal O n 2 nbsp liegt Im Best Case wenn das Eingabearray bereits sortiert ist ist die Komplexitat linear O n displaystyle mathcal O n nbsp d h sogar besser als bei den komplizierteren Verfahren Quicksort Mergesort Heapsort etc Im Worst Case ist sie quadratisch O n 2 displaystyle mathcal O n 2 nbsp Wenn zur Bestimmung der richtigen Position eines Elementes die binare Suche benutzt wird kann man die Anzahl der Vergleiche im Worst Case durch log n O n log n n log e log n O n log n 0 442 6 n log n displaystyle log n in mathcal O n log n n log e log n mathcal O n log n 0 4426n log n nbsp abschatzen dabei geht aber ggf die Stabilitat des Sortierverfahrens verloren Die Anzahl der Schiebeoperationen im Average Case betragt n n 1 4 O n 2 displaystyle n n 1 4 in mathcal O n 2 nbsp Der Worst Case ist ein absteigend sortiertes Array A displaystyle A nbsp da jedes Element von seiner Ursprungsposition j displaystyle j nbsp bis auf die erste Arrayposition verschoben wird und dabei j 1 displaystyle j 1 nbsp Verschiebeoperationen notig sind Deren Gesamtanzahl betragt somit n n 1 2 O n 2 displaystyle n n 1 2 in mathcal O n 2 nbsp Weiterentwicklung BearbeitenDonald L Shell schlug eine substanzielle Verbesserung dieses Algorithmus vor die heute unter dem Namen Shellsort bekannt ist Statt benachbarter Elemente werden Elemente die durch eine bestimmte Distanz voneinander getrennt sind verglichen Diese Distanz wird bei jedem Durchgang verringert Aufgrund der Sortierung uber Distanz verliert die Sortiermethode ihre Eigenschaft stabil Robert Sedgewick veroffentlichte eine optimierte Implementierung von Insertionsort welche einen Sentinel verwendet und nur die Halfte an Vertauschungen benotigt Nachfolgend wird diese Optimierung durch eine papyrus script function veranschaulicht Float a ist beispielhaft ein Array mit Fliesskommazahlen Die beiden integer Parameter stellen den flexiblen Sortierbereich fur das Array dar Startwert L Endwert R Angenommen das Array hat 100 Elemente und beginnt bei 1 dann muss L 1 und R 100 gesetzt werden um es vollstandig zu sortieren FUNCTION SortByInsert Float a Int L Int R 1 bool bOK 2 float X Comparable v 3 float f 4 5 int k 1 original k 0 counter of exchanges 6 int i R original R 1 7 X a i Sentinel 8 WHILE i gt L TopDown loop 9 f a i 1 10 IF X lt f 11 a i 1 X exchange 12 a i f 13 k i original k k 1 14 ELSE 15 X f no exchange swap update Sentinel only 16 ENDIF 17 i i 1 18 ENDWHILE 19 20 IF k lt 0 21 RETURN STOP short circuit no exchanges made 22 ENDIF 23 insertion sort with half exchanges 24 i L 2 25 WHILE i lt R original i lt R 26 X a i Sentinel 27 k i original j i counter for insertions 28 bOK TRUE 29 WHILE bOK 30 f a k 1 31 IF X lt f 32 a k f 33 k k 1 34 ELSE 35 bOK False 36 ENDIF 37 ENDWHILE 38 IF k lt i 39 a k X original a j v 40 ENDIF 41 i i 1 42 ENDWHILE ENDFUNCTIONSiehe auch BearbeitenListe von AlgorithmenWeblinks BearbeitenBeschreibung des Algorithmus und Simulation Java Applet Optimierter InsertionSort mit Sentinel Abgerufen von https de wikipedia org w index php title Insertionsort amp oldid 238188754