<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Insertionsort</id>
	<title>Insertionsort - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Insertionsort"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Insertionsort&amp;action=history"/>
	<updated>2026-05-28T20:48:04Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Insertionsort&amp;diff=64474&amp;oldid=prev</id>
		<title>~2025-16077-1: /* Pseudocode */</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Insertionsort&amp;diff=64474&amp;oldid=prev"/>
		<updated>2025-07-09T12:04:04Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Pseudocode&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[File:Insertion_sort.gif|mini|Animation von Insertionsort]]&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Insertionsort&amp;#039;&amp;#039;&amp;#039; (auch &amp;#039;&amp;#039;Sortieren durch Einfügen&amp;#039;&amp;#039;, {{enS|insertion|de=das Einfügen}} und {{enS|sort|de=sortieren}}) ist ein einfaches [[Stabilität (Sortierverfahren)|stabiles]] [[Sortierverfahren]] (d.&amp;amp;nbsp;h., die Reihenfolge von Elementen mit gleichem Schlüsselwert bleibt unverändert). Es ist leicht zu implementieren, effizient bei kleinen oder bereits teilweise sortierten Eingabemengen. Außerdem benötigt Insertionsort keinen zusätzlichen Speicherplatz, da der Algorithmus &amp;#039;&amp;#039;[[in-place]]&amp;#039;&amp;#039; arbeitet. Ein weiterer Vorteil besteht darin, dass Insertionsort als [[Online-Algorithmus]] eingesetzt werden kann.&lt;br /&gt;
&lt;br /&gt;
Der Insertionsort entnimmt der unsortierten Eingabefolge ein beliebiges Element und fügt es an richtiger Stelle in die (anfangs leere) Ausgabefolge ein. Geht man hierbei in der Reihenfolge der ursprünglichen Folge vor, so ist das Verfahren stabil. Wird auf einem [[Feld (Datentyp)|Array]] gearbeitet, so müssen die Elemente hinter dem neu eingefügten Element verschoben werden. Dies ist die eigentlich aufwendige Operation des Insertionsorts. Das Auffinden der richtigen Einfügeposition kann über eine [[binäre Suche]] vergleichsweise effizient erfolgen. Grundsätzlich gilt aber, dass Insertionsort weit weniger effizient arbeitet als andere anspruchsvollere Sortierverfahren.&lt;br /&gt;
&lt;br /&gt;
== Problembeschreibung ==&lt;br /&gt;
Das 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, eingefügt. Um die Einfügestelle für eine neue Karte zu finden, wird entweder die Karte sukzessive (von links nach rechts) mit den bereits einsortierten Karten des Blattes verglichen, oder eine binäre Suche durchgeführt. Zu jedem Zeitpunkt sind die Karten in der Hand sortiert und bestehen aus den bereits vom Tisch entnommenen Karten.&lt;br /&gt;
Zum Einfügen der neuen Karte müssen alle auf der Hand nachfolgenden eine Position weiter nach rechts wandern.&lt;br /&gt;
&lt;br /&gt;
=== Eingabe ===&lt;br /&gt;
Eine Folge von &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; zu sortierenden Zahlen &amp;lt;math&amp;gt;\left(a_1,a_2,\ldots,a_n \right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Die Zahlen werden auch als Schlüssel (keys) bezeichnet; diese sind oft nur ein Bestandteil eines Datensatzes.&lt;br /&gt;
&lt;br /&gt;
== Implementierung ==&lt;br /&gt;
&lt;br /&gt;
=== Pseudocode ===&lt;br /&gt;
Der folgende [[Pseudocode]] sortiert die Eingabefolge aufsteigend. Um eine absteigende Sortierung zu erreichen, ist der zweite Vergleich in Zeile 4 entsprechend zu ändern. Der Parameter &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; ist ein [[Feld (Datentyp)|Feld]] mit der zu Beginn unsortierten Folge. Nach Beendigung des Algorithmus enthält &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; mit den Elementen &amp;lt;code&amp;gt;A[0]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;A[1]&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;A[n-1]&amp;lt;/code&amp;gt; die sortierte Folge.&amp;lt;br /&amp;gt;&lt;br /&gt;
Hierbei ist zu beachten, dass die Indizierung des [[Feld (Datentyp)|Feldes]] mit einer 0 beginnt.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;: Anzahl der Elemente von &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;: Index des letzten Elementes von &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 INSERTIONSORT(A)&amp;lt;br /&amp;gt;&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;for&amp;#039;&amp;#039;&amp;#039; i = 1 &amp;#039;&amp;#039;&amp;#039;to&amp;#039;&amp;#039;&amp;#039; Länge(A) &amp;#039;&amp;#039;&amp;#039;do&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
      einzusortierender_wert = A[i]&lt;br /&gt;
      j = i&lt;br /&gt;
      &amp;#039;&amp;#039;&amp;#039;while&amp;#039;&amp;#039;&amp;#039; (j &amp;gt; 0) &amp;#039;&amp;#039;&amp;#039;and&amp;#039;&amp;#039;&amp;#039; (A[j-1] &amp;gt; einzusortierender_wert) &amp;#039;&amp;#039;&amp;#039;do&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
           A[j] = A[j - 1]&lt;br /&gt;
           j = j - 1&lt;br /&gt;
      &amp;#039;&amp;#039;&amp;#039;end while&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
      A[j] = einzusortierender_wert&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;end for&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Anmerkungen:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Die Positionsvariable &amp;#039;&amp;#039;i&amp;#039;&amp;#039; kann bei 1 beginnen anstatt bei 0, da ein Sortieren erst beginnt, wenn wenigstens zwei Werte gegeben sind (&amp;#039;&amp;#039;i&amp;#039;&amp;#039;=0 und &amp;#039;&amp;#039;i&amp;#039;&amp;#039;=1), erst dann kommt es zum ersten Vergleich. Davor kann A[0] als „bereits sortiert“ betrachtet werden.&lt;br /&gt;
* Die innere &amp;#039;&amp;#039;j&amp;#039;&amp;#039;-while-Schleife verschiebt im bereits sortierten Bereich 0..(&amp;#039;&amp;#039;i&amp;#039;&amp;#039;-1) alle „zu große“ Elemente eine Position nach hinten. Dadurch ergibt sich an richtiger Stelle dann der eine Freiraum, um den einzusortierenden Wert einzufügen.&lt;br /&gt;
&lt;br /&gt;
=== Struktogramm ===&lt;br /&gt;
Im Folgenden ein [[Nassi-Shneiderman-Diagramm]] (Struktogramm) des Insertionsort-Algorithmus. Die Bezeichner sind an obigen Pseudocode angelehnt.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;toccolours&amp;quot; style=&amp;quot;margin-left: 2em; border-collapse:collapse; border:2px solid gray;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot; style=&amp;quot;padding:5px;&amp;quot;| &amp;#039;&amp;#039;&amp;#039;Zähle&amp;#039;&amp;#039;&amp;#039; i &amp;#039;&amp;#039;&amp;#039;von&amp;#039;&amp;#039;&amp;#039; 1 &amp;#039;&amp;#039;&amp;#039;bis&amp;#039;&amp;#039;&amp;#039; n-1&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;6&amp;quot; style=&amp;quot;width:1.5em&amp;quot;|&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; style=&amp;quot;border:2px solid grey; padding:5px;&amp;quot;| einzusortierender_wert = A[ i ]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; style=&amp;quot;border:2px solid grey; padding:5px;&amp;quot;| j = i&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; style=&amp;quot;border:2px solid grey; border-bottom:none; padding:5px;&amp;quot;| &amp;#039;&amp;#039;&amp;#039;Solange&amp;#039;&amp;#039;&amp;#039; j &amp;gt; 0 und A[ j-1 ] &amp;gt; einzusortierender_wert&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; style=&amp;quot;border-left: 2px solid gray; width:1.5em;&amp;quot;|&lt;br /&gt;
|style=&amp;quot;border:2px solid grey; padding:5px;&amp;quot;| A[ j ] = A[ j-1 ]&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;border:2px solid grey; padding:5px;&amp;quot;| j = j - 1&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; style=&amp;quot;border:2px solid grey; padding:5px;&amp;quot;| A[ j ] = einzusortierender_wert&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
Ausführung von Insertionsort auf Eingabefeld &amp;lt;math&amp;gt;A[0 .. 5]&amp;lt;/math&amp;gt;. Die Komponente, auf die der Index &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; zeigt, ist rot eingefärbt. Blau eingefärbte Felder liegen im bereits sortierten Teilfeld &amp;lt;math&amp;gt;A[1 .. i-1]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable centered&amp;quot; style=&amp;quot;border:none;&amp;quot;&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 0&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 1&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 2&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 3&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 4&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 5&lt;br /&gt;
|- style=&amp;quot;background:#FFD700; font-size:110%; text-align:center;&amp;quot;&lt;br /&gt;
| 5&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 6&lt;br /&gt;
| 1&lt;br /&gt;
| 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Da ein einzelnes Element keiner Ordnungsrelation unterliegt, beginnt der Index bei &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; und das zweite Element wird mit dem ersten verglichen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable centered&amp;quot; style=&amp;quot;border:none;&amp;quot;&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 0&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 1&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 2&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 3&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 4&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 5&lt;br /&gt;
|- style=&amp;quot;background:#FFD700; font-size:110%; text-align:center;&amp;quot;&lt;br /&gt;
|style=&amp;quot;background:#87CEFF;&amp;quot;| 5&lt;br /&gt;
|style=&amp;quot;background:#FFC1C1;&amp;quot;| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 6&lt;br /&gt;
| 1&lt;br /&gt;
| 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable centered&amp;quot; style=&amp;quot;border:none;&amp;quot;&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 0&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 1&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 2&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 3&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 4&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 5&lt;br /&gt;
|- style=&amp;quot;background:#FFD700; font-size:110%; text-align:center;&amp;quot;&lt;br /&gt;
|style=&amp;quot;background:#87CEFF;&amp;quot;| 2&lt;br /&gt;
|style=&amp;quot;background:#FFC1C1;&amp;quot;| 5&lt;br /&gt;
| 4&lt;br /&gt;
| 6&lt;br /&gt;
| 1&lt;br /&gt;
| 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die 5 rutscht in der blauen sortierten Teilliste nach hinten und die 2 wird am Anfang dieser eingefügt. Damit sind die ersten beiden Elemente der Folge sortiert und das nächste Element wird überprüft (&amp;lt;math&amp;gt;i=2&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable centered&amp;quot; style=&amp;quot;border:none;&amp;quot;&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 0&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 1&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 2&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 3&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 4&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 5&lt;br /&gt;
|- style=&amp;quot;background:#FFD700; font-size:110%; text-align:center;&amp;quot;&lt;br /&gt;
|style=&amp;quot;background:#87CEFF;&amp;quot;| 2&lt;br /&gt;
|style=&amp;quot;background:#87CEFF;&amp;quot;| 5&lt;br /&gt;
|style=&amp;quot;background:#FFC1C1;&amp;quot;| 4&lt;br /&gt;
| 6&lt;br /&gt;
| 1&lt;br /&gt;
| 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable centered&amp;quot; style=&amp;quot;border:none;&amp;quot;&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 0&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 1&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 2&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 3&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 4&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 5&lt;br /&gt;
|- style=&amp;quot;background:#FFD700; font-size:110%; text-align:center;&amp;quot;&lt;br /&gt;
|style=&amp;quot;background:#87CEFF;&amp;quot;| 2&lt;br /&gt;
|style=&amp;quot;background:#87CEFF;&amp;quot;| 4&lt;br /&gt;
|style=&amp;quot;background:#FFC1C1;&amp;quot;| 5&lt;br /&gt;
| 6&lt;br /&gt;
| 1&lt;br /&gt;
| 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Bei &amp;lt;math&amp;gt;i=3&amp;lt;/math&amp;gt; ist nichts weiter zu tun, da 6 bereits die richtige Position am Ende der sortierten Teilliste hat.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable centered&amp;quot; style=&amp;quot;border:none;&amp;quot;&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 0&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 1&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 2&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 3&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 4&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 5&lt;br /&gt;
|- style=&amp;quot;background:#87CEFF;font-size:110%; text-align:center;&amp;quot;&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 5&lt;br /&gt;
|style=&amp;quot;background:#FFC1C1;&amp;quot;| 6&lt;br /&gt;
|style=&amp;quot;background:#FFD700;&amp;quot;| 1&lt;br /&gt;
|style=&amp;quot;background:#FFD700;&amp;quot;| 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Im vorletzten Schritt wird die 1 ausgewählt und in die sortierte Liste eingefügt. Dabei rutschen alle bisherigen sortierten Elemente in der sortierten Liste um eins nach hinten (&amp;lt;math&amp;gt;i=4&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable centered&amp;quot; style=&amp;quot;border:none;&amp;quot;&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 0&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 1&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 2&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 3&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 4&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 5&lt;br /&gt;
|- style=&amp;quot;background:#87CEFF;font-size:110%; text-align:center;&amp;quot;&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 5&lt;br /&gt;
| 6&lt;br /&gt;
|style=&amp;quot;background:#FFC1C1;&amp;quot;| 1&lt;br /&gt;
|style=&amp;quot;background:#FFD700;&amp;quot;| 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable centered&amp;quot; style=&amp;quot;border:none;&amp;quot;&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 0&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 1&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 2&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 3&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 4&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 5&lt;br /&gt;
|- style=&amp;quot;background:#87CEFF;font-size:110%; text-align:center;&amp;quot;&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 5&lt;br /&gt;
|style=&amp;quot;background:#FFC1C1;&amp;quot;| 6&lt;br /&gt;
|style=&amp;quot;background:#FFD700;&amp;quot;| 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Im letzten Schritt wird die 3 an passender Position in die sortierte Teilliste gebracht (&amp;lt;math&amp;gt;i=5&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable centered&amp;quot; style=&amp;quot;border:none;&amp;quot;&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 0&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 1&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 2&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 3&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 4&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 5&lt;br /&gt;
|- style=&amp;quot;background:#87CEFF;font-size:110%; text-align:center;&amp;quot;&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 5&lt;br /&gt;
| 6&lt;br /&gt;
|style=&amp;quot;background:#FFC1C1;&amp;quot;| 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable centered&amp;quot; style=&amp;quot;border:none;&amp;quot;&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 0&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 1&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 2&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 3&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 4&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 5&lt;br /&gt;
|- style=&amp;quot;background:#87CEFF;font-size:110%; text-align:center;&amp;quot;&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 3&lt;br /&gt;
| 4&lt;br /&gt;
| 5&lt;br /&gt;
|style=&amp;quot;background:#FFC1C1;&amp;quot;| 6&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nach dem Algorithmus sind alle Felder der Folge sortiert.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable centered&amp;quot; style=&amp;quot;border:none;&amp;quot;&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 0&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 1&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 2&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 3&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 4&lt;br /&gt;
! style=&amp;quot;border:none; width:20px; height:20px&amp;quot;| 5&lt;br /&gt;
|- style=&amp;quot;background:#87CEFF; font-size:110%; text-align:center;&amp;quot;&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 3&lt;br /&gt;
| 4&lt;br /&gt;
| 5&lt;br /&gt;
| 6&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Komplexität ==&lt;br /&gt;
Die Anzahl der Vergleiche und Verschiebungen des Algorithmus ist von der Anordnung der Elemente in der unsortierten Eingangsfolge abhängig. Für den [[Average Case]] ist eine genaue Abschätzung der Laufzeit daher schwierig, man kann aber zeigen, dass der Average Case in &amp;lt;math&amp;gt;\mathcal{O}(n^2)&amp;lt;/math&amp;gt; liegt. Im [[Best Case]], wenn das Eingabearray bereits sortiert ist, ist die Komplexität linear &amp;lt;math&amp;gt; \mathcal{O}(n)&amp;lt;/math&amp;gt;, d.&amp;amp;nbsp;h. sogar besser als bei den komplizierteren Verfahren ([[Quicksort]], [[Mergesort]], [[Heapsort]] etc.). Im [[Worst Case]] ist sie quadratisch &amp;lt;math&amp;gt;\mathcal{O}(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Wenn zur Bestimmung der richtigen Position eines Elementes die binäre Suche benutzt wird, kann man die Anzahl der Vergleiche im Worst Case durch&lt;br /&gt;
:&amp;lt;math&amp;gt;\log(n!) \in \mathcal{O}(n \log n-n \log e+\log n) = \mathcal{O}(n\log n-0{,}4426n+\log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
abschätzen; dabei geht aber ggf. die Stabilität des Sortierverfahrens verloren.&lt;br /&gt;
&lt;br /&gt;
Die Anzahl der Schiebeoperationen im Average Case beträgt&lt;br /&gt;
:&amp;lt;math&amp;gt;n (n-1)/4 \in \mathcal{O}(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Der Worst Case ist ein absteigend sortiertes Array &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, da jedes Element von seiner Ursprungsposition &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; bis auf die erste Arrayposition verschoben wird und dabei &amp;lt;math&amp;gt;j-1&amp;lt;/math&amp;gt; Verschiebeoperationen nötig sind. Deren Gesamtanzahl beträgt somit&lt;br /&gt;
:&amp;lt;math&amp;gt;n (n-1)/2 \in \mathcal{O}(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Weiterentwicklung ==&lt;br /&gt;
[[Donald 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 über Distanz verliert die Sortiermethode ihre Eigenschaft „stabil“.&lt;br /&gt;
&lt;br /&gt;
[[Robert Sedgewick (Informatiker)|Robert Sedgewick]] veröffentlichte eine optimierte Implementierung von Insertionsort, welche einen [[Sentinel (Programmierung)|Sentinel]] verwendet und nur die Hälfte an Vertauschungen benötigt. Nachfolgend wird diese Optimierung durch eine „papyrus script function“ veranschaulicht. Float[] a ist beispielhaft ein Array mit Fließkommazahlen. Die beiden integer-Parameter stellen den flexiblen Sortierbereich für 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 vollständig zu sortieren.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;FUNCTION&amp;#039;&amp;#039;&amp;#039; SortByInsert(Float[] a, Int L, Int R)&lt;br /&gt;
  1  &amp;#039;&amp;#039;&amp;#039;bool&amp;#039;&amp;#039;&amp;#039; bOK&lt;br /&gt;
  2  &amp;#039;&amp;#039;&amp;#039;float&amp;#039;&amp;#039;&amp;#039; X              ; Comparable v&lt;br /&gt;
  3  &amp;#039;&amp;#039;&amp;#039;float&amp;#039;&amp;#039;&amp;#039; f&lt;br /&gt;
  4&lt;br /&gt;
  5  &amp;#039;&amp;#039;&amp;#039;int&amp;#039;&amp;#039;&amp;#039; k = -1           ; original: k = 0  // counter of exchanges&lt;br /&gt;
  6  &amp;#039;&amp;#039;&amp;#039;int&amp;#039;&amp;#039;&amp;#039; i = R            ; original: R - 1&lt;br /&gt;
  7  X = a[i]             ; Sentinel&lt;br /&gt;
  8  &amp;#039;&amp;#039;&amp;#039;WHILE&amp;#039;&amp;#039;&amp;#039; (i &amp;gt; L)        ; TopDown loop&lt;br /&gt;
  9    f = a[i - 1]&lt;br /&gt;
 10    &amp;#039;&amp;#039;&amp;#039;IF&amp;#039;&amp;#039;&amp;#039; (X &amp;lt; f)&lt;br /&gt;
 11      a[i - 1] = X     ; exchange&lt;br /&gt;
 12      a[i]     = f&lt;br /&gt;
 13      k = i            ; original: k = k + 1&lt;br /&gt;
 14    &amp;#039;&amp;#039;&amp;#039;ELSE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 15      X = f            ; no exchange/swap, update Sentinel only&lt;br /&gt;
 16    &amp;#039;&amp;#039;&amp;#039;ENDIF&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 17    i = i - 1&lt;br /&gt;
 18  &amp;#039;&amp;#039;&amp;#039;ENDWHILE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 19&lt;br /&gt;
 20  &amp;#039;&amp;#039;&amp;#039;IF&amp;#039;&amp;#039;&amp;#039; (k &amp;lt; 0)&lt;br /&gt;
 21    &amp;#039;&amp;#039;&amp;#039;RETURN&amp;#039;&amp;#039;&amp;#039;             ; - STOP -  short circuit, no exchanges made&lt;br /&gt;
 22  &amp;#039;&amp;#039;&amp;#039;ENDIF&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 23  ; -------------------------- &amp;quot;insertion sort with half-exchanges&amp;quot;&lt;br /&gt;
 24  i = L + 2&lt;br /&gt;
 25  &amp;#039;&amp;#039;&amp;#039;WHILE&amp;#039;&amp;#039;&amp;#039; (i &amp;lt;= R)       ; original: (i &amp;lt; R)&lt;br /&gt;
 26    X = a[i]           ; Sentinel&lt;br /&gt;
 27    k = i              ; original: j = i  // counter for insertions&lt;br /&gt;
 28    bOK = &amp;#039;&amp;#039;&amp;#039;TRUE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 29    &amp;#039;&amp;#039;&amp;#039;WHILE&amp;#039;&amp;#039;&amp;#039; (bOK)&lt;br /&gt;
 30      f = a[k - 1]&lt;br /&gt;
 31      &amp;#039;&amp;#039;&amp;#039;IF&amp;#039;&amp;#039;&amp;#039; (X &amp;lt; f)&lt;br /&gt;
 32        a[k] = f&lt;br /&gt;
 33        k = k - 1&lt;br /&gt;
 34      &amp;#039;&amp;#039;&amp;#039;ELSE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 35        bOK = False&lt;br /&gt;
 36      &amp;#039;&amp;#039;&amp;#039;ENDIF&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 37    &amp;#039;&amp;#039;&amp;#039;ENDWHILE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 38    &amp;#039;&amp;#039;&amp;#039;IF&amp;#039;&amp;#039;&amp;#039; (k &amp;lt; i)&lt;br /&gt;
 39      a[k] = X         ; original: a[j] = v&lt;br /&gt;
 40    &amp;#039;&amp;#039;&amp;#039;ENDIF&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 41    i = i + 1&lt;br /&gt;
 42  &amp;#039;&amp;#039;&amp;#039;ENDWHILE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;ENDFUNCTION&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Liste von Algorithmen]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.iti.fh-flensburg.de/lang/algorithmen/sortieren/insert/insertion.htm Beschreibung des Algorithmus und Simulation] ([[Java-Applet]])&lt;br /&gt;
* [http://algs4.cs.princeton.edu/21elementary/InsertionX.java.html Optimierter InsertionSort mit Sentinel]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Sortieralgorithmus]]&lt;/div&gt;</summary>
		<author><name>~2025-16077-1</name></author>
	</entry>
</feed>