Privacy Policy Cookie Policy Terms and Conditions Insertionsort - Wikipedia

Insertionsort

aus Wikipedia, der freien Enzyklopädie

Insertionsort (engl. insertion - Einfügen) ist ein einfaches stabiles Sortierverfahren. Es ist weit weniger effizient als andere anspruchsvollere Sortierverfahren. Dafür hat es jedoch folgende Vorteile:

  • einfach zu implementieren
  • effizient bei (ziemlich) kleinen Eingabemengen
  • effizient bei Eingabemengen, die schon vorsortiert sind
  • stabil (d.h., die Reihenfolge von schon sortierten Elementen ändert sich nicht)
  • minimaler Speicherverbrauch, da er ortsfest arbeitet

Inhaltsverzeichnis

[Bearbeiten] Prinzip

Der Algorithmus entnimmt der unsortierten Eingabemenge ein beliebiges (z. B. das Erste) Element und fügt es an richtiger Stelle in die (anfangs leere) Ausgabemenge ein. Geht man in der Reihenfolge der ursprünglichen Menge vor, so ist es außerdem stabil. Wird auf einem Array gearbeitet, so müssen die Elemente nach dem neu eingefügten Element verschoben werden. Dies ist die eigentlich teure Operation von Insertionsort, da das Finden der richtigen Einfügeposition über eine binäre Suche vergleichsweise effizient erfolgen kann.

[Bearbeiten] Pseudocode

Der folgende Pseudocode sortiert die Eingabemenge aufsteigend. Um eine absteigende Sortierung zu erreichen, ist der zweite Vergleich in Zeile 4 entsprechend zu ändern.

a: Liste (Array) mit der unsortierten Eingabemenge

insertion_sort(a)
1  von j \leftarrow 2 bis länge[a]
2      führe aus aktueller_wert \leftarrow a[j]
3          i \leftarrow j - 1
4          solange i > 0 und a[i] > aktueller_wert
5              führe aus a[i + 1] \leftarrow a[i]
6                  i \leftarrow i - 1
7          a[i + 1] \leftarrow aktueller_wert

[Bearbeiten] Struktogramm

Im folgenden ein Nassi-Shneiderman-Diagramm (Struktogramm) des Insertionsort-Algorithmus:

Bild:Insertionsort-Struktogramm.png

[Bearbeiten] Beispiel

Hier ein Beispiel anhand einer zu sortierenden Menge aus 5 Integer-Werten:

 unsortierte Eingabemenge: [ 3 2 5 1 4 ]

 -------------------------------------------------------------------------------

 [| 3 2 5 1 4]             Das erste Element wird der Eingabemenge entnommen und
    ^                      zwischengespeichert.

 [_ | 2 5 1 4]             Alle in der Ausgabemenge vorhandenen größeren
                           Elemente werden, vom Ende der Ausgabemenge beginnend,
                           um jeweils eine Stelle nach rechts verschoben.
                           Dabei wird das zwischengespeicherte Element in der
                           Eingabemenge überschrieben.

 [3 | 2 5 1 4]             Das zwischengespeicherte Element wird in das durch
                           die Verschiebung der Elemente in der Ausgabemenge
                           freigewordene Feld geschrieben.

 -------------------------------------------------------------------------------

 [3 | 2 5 1 4]             Das nächste Element wird der Eingabemenge entnommen
      ^                    und zwischengespeichert.

 [_ 3 | 5 1 4]             Alle in der Ausgabemenge vorhandenen größeren
                           Elemente werden, vom Ende der Ausgabemenge beginnend,
                           um jeweils eine Stelle nach rechts verschoben.
                           Dabei wird das zwischengespeicherte Element in der
                           Eingabemenge überschrieben.

 [2 3 | 5 1 4]             Das zwischengespeicherte Element wird in das durch
                           die Verschiebung der Elemente in der Ausgabemenge
                           freigewordene Feld geschrieben.

 -------------------------------------------------------------------------------

 [2 3 | 5 1 4]             Das nächste Element wird der Eingabemenge entnommen
        ^                  und zwischengespeichert.

 [2 3 _ | 1 4]             Alle in der Ausgabemenge vorhandenen größeren
                           Elemente werden, vom Ende der Ausgabemenge beginnend,
                           um jeweils eine Stelle nach rechts verschoben.
                           Dabei wird das zwischengespeicherte Element in der
                           Eingabemenge überschrieben.

 [2 3 5 | 1 4]             Das zwischengespeicherte Element wird in das durch
                           die Verschiebung der Elemente in der Ausgabemenge
                           freigewordene Feld geschrieben.

 -------------------------------------------------------------------------------

 [2 3 5 | 1 4]             Das nächste Element wird der Eingabemenge entnommen
          ^                und zwischengespeichert.

 [_ 2 3 5 | 4]             Alle in der Ausgabemenge vorhandenen größeren
                           Elemente werden, vom Ende der Ausgabemenge beginnend,
                           um jeweils eine Stelle nach rechts verschoben.
                           Dabei wird das zwischengespeicherte Element in der
                           Eingabemenge überschrieben.

 [1 2 3 5 | 4]             Das zwischengespeicherte Element wird in das durch
                           die Verschiebung der Elemente in der Ausgabemenge
                           freigewordene Feld geschrieben.

 -------------------------------------------------------------------------------

 [1 2 3 5 | 4]             Das nächste Element wird der Eingabemenge entnommen
            ^              und zwischengespeichert.

 [1 2 3 _ 5 |]             Alle in der Ausgabemenge vorhandenen größeren
                           Elemente werden, vom Ende der Ausgabemenge beginnend,
                           um jeweils eine Stelle nach rechts verschoben.
                           Dabei wird das zwischengespeicherte Element in der
                           Eingabemenge überschrieben.

 [1 2 3 4 5 |]             Das zwischengespeicherte Element wird in das durch
                           die Verschiebung der Elemente in der Ausgabemenge
                           freigewordene Feld geschrieben.

 -------------------------------------------------------------------------------

 sortierte Ausgabemenge: [ 1 2 3 4 5 ]

[Bearbeiten] Komplexität

Die Anzahl der Vergleiche und Verschiebungen des Algorithmus ist von der Anordnung der Elemente in der unsortierten Eingangsmenge abhängig. Für den Average-Case ist eine Abschätzung der Laufzeit daher nicht so einfach möglich. Im Best Case ist die Komplexität jedoch linear (O(n)), d.h. sogar besser als bei den komplizierten Verfahren (QuickSort, MergeSort, HeapSort etc.). Im Worst Case dagegen quadratisch (O(n2)).

Wenn zur Bestimmung der richtigen Position eines Elementes die binäre Suche benutzt wird, kann man die Anzahl der Vergleiche, im Worst Case, durch log(n!) = nlognnloge + O(logn) = nlogn − 0,4426n + O(logn) abschätzen. Die Anzahl der Schiebeoperationen sind im Average-Case (n * (n − 1)) / 4 = O(n2).

Der Worst Case wäre ein absteigend sortiertes Array a, da wir bei jedem Element i die Methode move(i,0,a) aufrufen müssen. Die Anzahl der Schiebeoperationen beträgt in diesem Fall ((n * (n + 1)) / 2) − n = O(n2).

[Bearbeiten] Verwandter Sortieralgorithmus

D.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.

[Bearbeiten] Weblinks


Siehe auch: Liste von Algorithmen

Static Wikipedia 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -