Insertion-sort: Unterschied zwischen den Versionen

Aus FLBK-Wiki
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(6 dazwischenliegende Versionen von einem anderen Benutzer werden nicht angezeigt)
Zeile 1: Zeile 1:
Einführung
== Einführung ==
Der [[Algorithmus]] dieses [[Sortieren|Sortierverfahrens]] ist relative simpel. Das Prinzip von Insertion Sort ist: Die einzelnen Elemente werden von vorne nach hinten durchlaufen. Von der aktuellen Position aus wird jedes Element von rechts nach links weitergereicht – und das so lange, bis das bewegte Element größer oder gleich dem Element ist, das an der im Augenblick abgefragten Position liegt (http://openbook.galileocomputing.de/c_von_a_bis_z/022_c_algorithmen_003.htm).
Der [[Algorithmus]] dieses [[Sortieren|Sortierverfahrens]] ist relativ simpel. Das Prinzip von Insertion Sort ist folgendes: Die einzelnen Elemente werden von vorne nach hinten durchlaufen. Von der aktuellen Position aus wird jedes Element von rechts nach links verschoben – und zwar so lange, bis das einzufügende Element größer oder gleich dem Element ist, das an der aktuell betrachteten Position steht.


Der Platz für das Element, das verschoben wird, ist frei. Diese Lücke wird mit dem entsprechenden Wert an der richtigen Stelle gefüllt.
Der Platz für das Element, das verschoben wird, ist währenddessen frei. Diese Lücke wird anschließend mit dem entsprechenden Wert an der richtigen Stelle gefüllt.


== Beispiel ==
== Beispiel ==
[[Datei:Animation Insertio-Sort.gif|mini]]
[[Datei:Animation Insertio-Sort.gif|mini]]
Die folgende Tabelle zeigt die Sortier­schritte zum Sortieren der Folge 5 7 0 3 4 2 6 1. Auf der linken Seite grün dargestellt befindet sich jeweils der bereits sortierte Teil der Folge. Die blauen Ziffern repräsentieren den unsortierten Teil der Zahlenfolge. Ganz rechts steht in Klammern die Anzahl der Positionen, um die das eingefügte Element nach links gewandert ist. Das aktuell eingefügte Element ist fett markiert. (http://www.iti.fh-flensburg.de/lang/algorithmen/sortieren/insert/insertion.htm).
Die folgende Tabelle zeigt die Sortierschritte zum Sortieren der Folge 5 7 0 3 4 2 6 1. Auf der linken Seite (grün dargestellt) befindet sich jeweils der bereits sortierte Teil der Folge. Die blauen Ziffern repräsentieren den unsortierten Teil der Zahlenfolge. Ganz rechts steht in Klammern die Anzahl der Positionen, um die das eingefügte Element nach links verschoben wurde. Das aktuell eingefügte Element ist fett markiert.
 
{| class="wikitable" style="text-align:center; font-family:monospace;"
{| class="wikitable" style="text-align:center; font-family:monospace;"
|-
|-
Zeile 25: Zeile 26:
| <span style="color:green;">0</span> || '''''<span style="color:green;">1</span>''''' || <span style="color:green;">2</span> || <span style="color:green;">3</span> || <span style="color:green;">4</span> || <span style="color:green;">5</span> || <span style="color:green;">6</span> || <span style="color:green;">7</span> || (6)
| <span style="color:green;">0</span> || '''''<span style="color:green;">1</span>''''' || <span style="color:green;">2</span> || <span style="color:green;">3</span> || <span style="color:green;">4</span> || <span style="color:green;">5</span> || <span style="color:green;">6</span> || <span style="color:green;">7</span> || (6)
|}
|}
== Pseudo Code ==
 
Der Algorithmus sieht im Pseudocode so aus:
== Pseudocode ==
<syntaxhighlight line>
Der [[Algorithmus]] sieht im Pseudocode so aus:
prozedur INSERTIONSORT(A ist Liste sortierbarer Elemente)
 
  wiederhole bis zur Länge von A und beginne beim 2. Element
<syntaxhighlight lang="text">
  einzusortierender_wert = A an der Stelle i
prozedur insertionSort(A ist Liste sortierbarer Elemente)
  j = i
    n = Länge von A
    wiederhole solange j > 1 und A an der Stelle j-1 > einzusortierender_wert
    für i von 1 bis n - 1 wiederhole
      A an der Stelle j = A an der Stelle j-1
        einzusortierenderWert = A[i]
      j = j 1
        j = i - 1
    ende wiederhole
        solange j ≥ 0 und A[j] > einzusortierenderWert wiederhole
  A an der Stelle j = einzusortierender_wert
            A[j + 1] = A[j]
  ende wiederhole
            j = j - 1
        ende solange
        A[j + 1] = einzusortierenderWert
    ende für
ende prozedur
ende prozedur
</syntaxhighlight >
</syntaxhighlight>


== Komplexität ==
== Komplexität ==
=== Worst Case ===
=== Worst Case ===
Eine sortierte Liste in umgekehrter Reihenfolge ist das Worst Case Szenario für den InsertionSort:
Eine Liste in umgekehrter Reihenfolge stellt das Worst-Case-Szenario für InsertionSort dar:


[11,7,5,3,2,0]
<math>[11,7,5,3,2,0]</math>


Wir betrachten nur die Vergleichsoperationen, die wir mit der Variable c messen. Die Anzahl der zu sortierenden Elemente ist entspricht n.  
Wir betrachten nur die Vergleichsoperationen, die mit der Variablen c gezählt werden. Die Anzahl der zu sortierenden Elemente beträgt n.


Beim ersten äußeren Schleifendurchlauf ist c = 1. Denn wir müssen nur die Zahl 7 mit der Zahl 11 vergleichen. 7 wird einsortiert und es bildet sich der bereits sortierte Teil (siehe oben) der Datenstruktur. Beim zweiten Durchlauf der äußeren Schleife benötigen wir zwei Vergleiche , c = 2. Beim dritte Mal, c = 3 bis zum letzten Mal, wenn c = n-1. Es gilt also:
Beim ersten äußeren Schleifendurchlauf ist c = 1, da nur ein Vergleich durchgeführt wird. Beim zweiten Durchlauf sind es 2 Vergleiche, beim dritten 3 usw., bis zum letzten Durchlauf mit n−1 Vergleichen.


c⋅1+c⋅2+c⋅3+⋯c⋅(n−1)=c⋅(1+2+3+⋯+(n−1))
Die Gesamtanzahl der Vergleiche ergibt sich zu:


Hierbei handelt es sich um eine arithmetische Reihe, mit der Ausnahme, dass sie bis zu n-1 anstatt n ansteigt. Unter Verwendung unserer Formel für arithmetische Reihen, erhalten wir:
<math>1 + 2 + 3 + \dots + (n - 1)</math>


c⋅(n−1+1)*((n−1)/2)=cn​2​​/2 − cn/2
Dies ist eine [[Arithmetische-reihe|arithmetische Reihe]]. Mit der gaußschen Summenformel erhält man:


Für sehr große n können  wir den niederwertigen Term cn/2 und die konstanten Faktoren c und 1/2 verwerfen, so dass gilt:
<math>\frac{n(n-1)}{2}</math>


Der InsertionSort liegt hier in der Komplexitätsklasse O(n​2​​)
Für große n dominiert der quadratische Term, sodass InsertionSort im Worst Case in der Komplexitätsklasse <math>O(n^2)</math> liegt.


=== Best Case ===
=== Best Case ===
Die optimale Eingabe ist ein bereits sortiertes Array. In diesem Fall hat Insertion Sort eine lineare Laufzeit (d. h. O(n)). Während jeder Iteration wird das erste verbleibende Element der Eingabe nur mit dem Element ganz rechts des sortierten Unterabschnitts des Arrays verglichen.
Die optimale Eingabe ist ein bereits sortiertes [[Array]]. In diesem Fall wird pro Iteration lediglich ein Vergleich durchgeführt. Die Gesamtanzahl der Vergleiche ist somit proportional zu n.
 
InsertionSort besitzt im Best Case daher eine lineare Laufzeit von <math>O(n)</math>.
 
[[Kategorie:Programmierung]]
[[Kategorie:AHR_I_Informatik_LK]]
[[Kategorie:FI_I_TP2]]

Aktuelle Version vom 2. März 2026, 12:30 Uhr

Einführung

Der Algorithmus dieses Sortierverfahrens ist relativ simpel. Das Prinzip von Insertion Sort ist folgendes: Die einzelnen Elemente werden von vorne nach hinten durchlaufen. Von der aktuellen Position aus wird jedes Element von rechts nach links verschoben – und zwar so lange, bis das einzufügende Element größer oder gleich dem Element ist, das an der aktuell betrachteten Position steht.

Der Platz für das Element, das verschoben wird, ist währenddessen frei. Diese Lücke wird anschließend mit dem entsprechenden Wert an der richtigen Stelle gefüllt.

Beispiel

Die folgende Tabelle zeigt die Sortierschritte zum Sortieren der Folge 5 7 0 3 4 2 6 1. Auf der linken Seite (grün dargestellt) befindet sich jeweils der bereits sortierte Teil der Folge. Die blauen Ziffern repräsentieren den unsortierten Teil der Zahlenfolge. Ganz rechts steht in Klammern die Anzahl der Positionen, um die das eingefügte Element nach links verschoben wurde. Das aktuell eingefügte Element ist fett markiert.

5 7 0 3 4 2 6 1 (0)
5 7 0 3 4 2 6 1 (0)
0 5 7 3 4 2 6 1 (2)
0 3 5 7 4 2 6 1 (2)
0 3 4 5 7 2 6 1 (2)
0 2 3 4 5 7 6 1 (4)
0 2 3 4 5 6 7 1 (1)
0 1 2 3 4 5 6 7 (6)

Pseudocode

Der Algorithmus sieht im Pseudocode so aus:

prozedur insertionSort(A ist Liste sortierbarer Elemente)
    n = Länge von A
    für i von 1 bis n - 1 wiederhole
        einzusortierenderWert = A[i]
        j = i - 1
        solange j ≥ 0 und A[j] > einzusortierenderWert wiederhole
            A[j + 1] = A[j]
            j = j - 1
        ende solange
        A[j + 1] = einzusortierenderWert
    ende für
ende prozedur

Komplexität

Worst Case

Eine Liste in umgekehrter Reihenfolge stellt das Worst-Case-Szenario für InsertionSort dar:

[math]\displaystyle{ [11,7,5,3,2,0] }[/math]

Wir betrachten nur die Vergleichsoperationen, die mit der Variablen c gezählt werden. Die Anzahl der zu sortierenden Elemente beträgt n.

Beim ersten äußeren Schleifendurchlauf ist c = 1, da nur ein Vergleich durchgeführt wird. Beim zweiten Durchlauf sind es 2 Vergleiche, beim dritten 3 usw., bis zum letzten Durchlauf mit n−1 Vergleichen.

Die Gesamtanzahl der Vergleiche ergibt sich zu:

[math]\displaystyle{ 1 + 2 + 3 + \dots + (n - 1) }[/math]

Dies ist eine arithmetische Reihe. Mit der gaußschen Summenformel erhält man:

[math]\displaystyle{ \frac{n(n-1)}{2} }[/math]

Für große n dominiert der quadratische Term, sodass InsertionSort im Worst Case in der Komplexitätsklasse [math]\displaystyle{ O(n^2) }[/math] liegt.

Best Case

Die optimale Eingabe ist ein bereits sortiertes Array. In diesem Fall wird pro Iteration lediglich ein Vergleich durchgeführt. Die Gesamtanzahl der Vergleiche ist somit proportional zu n.

InsertionSort besitzt im Best Case daher eine lineare Laufzeit von [math]\displaystyle{ O(n) }[/math].