Einfügungssorte

Einfügungssorte ist ein einfacher Sortieren-Algorithmus: Eine Vergleich-Sorte, in der die sortierte Reihe (oder Liste) ein Zugang auf einmal gebaut wird. Es ist auf großen Listen viel weniger effizient als fortgeschrittenere Algorithmen wie Schnellsortierung, heapsort, oder Verflechtungssorte. Jedoch stellt Einfügungssorte mehrere Vorteile zur Verfügung:

  • Einfache Durchführung
  • Effizient für (ziemlich) kleine Dateien
  • Anpassungsfähig (d. h., effizient) für Dateien, die bereits wesentlich sortiert werden: Die Zeitkompliziertheit ist O (n + d), wo d die Zahl von Inversionen ist
  • Effizienter in der Praxis als meiste anderes einfaches quadratisches (d. h., O (n)) Algorithmen wie Auswahl-Sorte oder Luftblase-Sorte; der beste Fall (fast sortierter Eingang) ist O (n)
  • Stabil; d. h., ändert die Verhältnisordnung von Elementen mit gleichen Schlüsseln nicht
  • Im Platz; d. h., verlangt nur einen unveränderlichen Betrag O (1) des zusätzlichen Speicherraums
  • Online; d. h., kann eine Liste sortieren, weil sie es erhält

Wenn Menschen manuell etwas (zum Beispiel, ein Deck von Spielkarten), der grösste Teil des Gebrauches eine Methode sortieren, die der Einfügungssorte ähnlich ist.

Algorithmus

Jede Wiederholung der Einfügungssorte entfernt ein Element von den Eingangsdaten, es in die richtige Position in der bereits sortierten Liste einfügend, bis keine Eingangselemente bleiben. Dessen Wahl Element, vom Eingang umzuziehen, willkürlich ist, und mit fast jeden auserlesenen Algorithmus gemacht werden kann.

Das Sortieren wird normalerweise im Platz getan. Die resultierende Reihe danach k Wiederholungen hat das Eigentum, wo die ersten k + 1 Einträge sortiert werden. In jeder Wiederholung wird der erste restliche Zugang des Eingangs entfernt, ins Ergebnis an der richtigen Position eingefügt, so das Ergebnis erweiternd:

wird

mit jedem Element, das größer ist als x, kopiert nach rechts, weil es gegen x verglichen wird.

Die allgemeinste Variante der Einfügungssorte, die auf der Reihe funktioniert, kann wie folgt beschrieben werden:

  1. Denken Sie dort besteht eine Funktion genannt der Einsatz hat vorgehabt, einen Wert in eine sortierte Folge am Anfang einer Reihe einzufügen. Es funktioniert durch den Anfang am Ende der Folge und die Verschiebung jedes Elements ein Platz nach rechts, bis eine passende Position für das neue Element gefunden wird. Die Funktion hat die Nebenwirkung, den Wert versorgt sofort nach der sortierten Folge in der Reihe zu überschreiben.
  2. Um eine Einfügungssorte durchzuführen, beginnen Sie an ganz links Element der Reihe und rufen Sie Einsatz an, um jedes in seine richtige Position gestoßene Element einzufügen. Die bestellte Folge, in die das Element eingefügt wird, wird am Anfang der Reihe im Satz von bereits untersuchten Indizes versorgt. Jede Einfügung überschreibt einen einzelnen Wert: Der Wert, der wird einfügt.

Der Pseudocode des ganzen Algorithmus folgt, wo die Reihe bei Nullpunkteinstellung ist:

weil ich  1 zu mir  Länge (A)-1

{\

//[Ich] wird in der sortierten Folge [0 hinzugefügt.. i-1]

//sparen Sie [ich], um ein Loch am Index iHole zu machen

Artikel  [ich]

iHole  i

//setzen Sie fort, das Loch zum folgenden kleineren Index zu bewegen, bis [iHole - 1] ist

{\

//bewegen Sie Loch zum folgenden kleineren Index

[IHole]  [iHole - 1]

iHole  iHole - 1

}\

//stellen Sie Artikel im Loch

[IHole]  Artikel

}\

</Quelle>

Beste, schlechteste und durchschnittliche Fälle

Der beste Fall-Eingang ist eine Reihe, die bereits sortiert wird. In diesem Fall hat Einfügungssorte eine geradlinige Laufzeit (d. h., Θ (n)). Während jeder Wiederholung ist das erste restliche Element des Eingangs nur im Vergleich zum niedrigstwertigen Element des sortierten Paragraphs der Reihe.

Der einfachste Grenzfall-Eingang ist eine Reihe sortiert in umgekehrter Reihenfolge. Der Satz aller Grenzfall-Eingänge besteht aus der ganzen Reihe, wo jedes Element am kleinsten ist oder zweite am kleinsten der Elemente davor. In diesen Fällen wird jede Wiederholung der inneren Schleife scannen und den kompletten sortierten Paragraph der Reihe vor dem Einfügen des folgenden Elements auswechseln. Das gibt Einfügungssorte eine quadratische Laufzeit (d. h., O (n)).

Der durchschnittliche Fall ist auch quadratisch, der Einfügungssorte unpraktisch macht, um große Reihe zu sortieren. Jedoch ist Einfügungssorte einer der schnellsten Algorithmen, um sehr kleine Reihe noch schneller zu sortieren, als Schnellsortierung; tatsächlich verwenden gute Schnellsortierungsdurchführungen Einfügungssorte für die Reihe, die kleiner ist als eine bestimmte Schwelle, wenn auch sie als Teilprobleme entsteht; die genaue Schwelle muss experimentell bestimmt werden und hängt von der Maschine ab, aber ist allgemein ungefähr zehn.

Beispiel:

Der folgende Tisch zeigt die Schritte, für die Folge {3, 7, 4, 9, 5, 2, 6, 1} zu sortieren. In jedem Schritt wird der Artikel unter der Rücksicht unterstrichen, und der Artikel bewegt (oder hat im Platz gehalten, wenn noch betrachtet am größten war) im vorherigen Schritt, wird im kühnen gezeigt.

7 4 9 5 2 6 1

3 4 9 5 2 6 1

3 7 9 5 2 6 1

3 4 7 5 2 6 1

3 4 7 9 2 6 1

3 4 5 7 9 6 1

2 3 4 5 7 9 1

2 3 4 5 6 7 9

1 2 3 4 5 6 7 9

Vergleiche zu anderen Sortieren-Algorithmen

Einfügungssorte ist der Auswahl-Sorte sehr ähnlich. Als in der Auswahl-Sorte nachdem führt k die Reihe durch, die ersten k Elemente sind in der sortierten Ordnung. Weil Auswahl sortiert, sind das die k kleinsten Elemente, während in der Einfügungssorte sie sind, dass die ersten k Elemente in der unsortierten Reihe waren. Einfügungssorte-Vorteil besteht darin, dass es nur so viele Elemente, wie erforderlich, scannt die richtige Position des k+1st Elements bestimmen, während Auswahl-Sorte alle restlichen Elemente scannen muss, um das absolute kleinste Element zu finden.

Berechnungen zeigen, dass Einfügungssorte gewöhnlich ungefähr halb so viel Vergleiche durchführen wird wie Auswahl-Sorte. Das Annehmen der Reihe des k+1st Elements ist zufällig, Einfügungssorte wird durchschnittlich veränderliche Hälfte der vorherigen k Elemente verlangen, während Auswahl-Sorte immer Abtastung aller nicht platzierten Elemente verlangt. Wenn die Eingangsreihe rücksortiert wird, führt Einfügungssorte so viele Vergleiche durch wie Auswahl-Sorte. Wenn die Eingangsreihe bereits sortiert wird, führt Einfügungssorte nur n-1 Vergleiche durch, so Einfügungssorte effizienter, wenn gegeben, sortierte oder "fast sortierte" Reihe machend.

Während Einfügungssorte normalerweise weniger Vergleiche macht als Auswahl-Sorte, verlangt sie mehr schreibt, weil die innere Schleife veränderliche große Abteilungen des sortierten Teils der Reihe verlangen kann. Im Allgemeinen wird Einfügungssorte der Reihe O (n) Zeiten schreiben, wohingegen Auswahl-Sorte nur O (n) Zeiten schreiben wird. Aus diesem Grund kann Auswahl-Sorte in Fällen vorzuziehend sein, wo das Schreiben zum Gedächtnis bedeutsam teurer ist als das Lesen, solcher als mit EEPROM oder Blitz-Gedächtnis.

Einige teilen-und-überwinden Algorithmen wie Schnellsortierung und mergesort Sorte durch das rekursive Teilen der Liste in kleinere Sublisten, die dann sortiert werden. Eine nützliche Optimierung in der Praxis für diese Algorithmen soll Einfügungssorte verwenden, um kleine Sublisten zu sortieren, wo Einfügungssorte diese komplizierteren Algorithmen überbietet. Die Größe der Liste, für die Einfügungssorte im Vorteil ist, ändert sich durch die Umgebung und Durchführung, aber ist normalerweise zwischen acht und zwanzig Elementen.

Varianten

D.L. Shell hat wesentliche Verbesserungen zum Algorithmus gebildet; die modifizierte Version wird Sorte von Shell genannt.

Der Sortieren-Algorithmus vergleicht Elemente, die durch eine Entfernung getrennt sind, die auf jedem Pass abnimmt. Sorte von Shell hat Laufzeiten in der praktischen Arbeit mit zwei einfachen Varianten ausgesprochen verbessert, die O (n) und O (n) Laufzeit verlangen.

Wenn die Kosten von Vergleichen die Kosten des Tausches überschreiten, wie zum Beispiel mit Schnur-Schlüsseln der Fall ist, die durch die Verweisung oder mit der menschlichen Wechselwirkung versorgt sind (wie Auswahl von einem eines Paares gezeigt nebeneinander), dann kann das Verwenden binärer Einfügungssorte bessere Leistung nachgeben. Binäre Einfügungssorte verwendet eine binäre Suche, um die richtige Position zu bestimmen, um neue Elemente einzufügen, und führt deshalb log (n)  Vergleiche im Grenzfall durch, der O ist (n, loggen n). Der Algorithmus hat als Ganzes noch eine Laufzeit von O (n) durchschnittlich wegen der Reihe des für jede Einfügung erforderlichen Tausches.

Die Anzahl des Tausches kann durch das Rechnen der Position von vielfachen Elementen vor dem Bewegen von ihnen vermindert werden. Zum Beispiel, wenn die Zielposition von zwei Elementen berechnet wird, bevor sie in die richtige Position bewegt werden, kann die Anzahl des Tausches durch ungefähr 25 % für zufällige Daten vermindert werden. Im äußersten Fall arbeitet diese Variante ähnlich, um Sorte zu verschmelzen.

Um zu vermeiden, eine Reihe des Tausches für jede Einfügung machen zu müssen, konnte der Eingang in einer verbundenen Liste versorgt werden, die Elementen erlaubt, in oder aus der Liste im unveränderlich-maligen gesplissen zu werden, wenn die Position in der Liste bekannt ist. Jedoch verlangt die Suche einer verbundenen Liste folgend im Anschluss an die Verbindungen zur gewünschten Position: Eine verbundene Liste hat zufälligen Zugang nicht, so kann es keine schnellere Methode wie binäre Suche verwenden. Deshalb ist die für die Suche erforderliche Laufzeit O (n), und die Zeit für das Sortieren ist O (n). Wenn eine hoch entwickeltere Datenstruktur (z.B, Haufen oder binärer Baum) verwendet wird, kann die Zeit, die für die Suche und Einfügung erforderlich ist, bedeutsam reduziert werden; das ist die Essenz der Haufen-Sorte und binären Baumsorte.

2004 haben Sauferei, Farach-Colton und Mosteiro eine neue Variante der Einfügungssorte genannt Bibliothekssorte oder gapped Einfügungssorte veröffentlicht, die eine kleine Zahl von unbenutzten Räumen (d. h., "Lücken") Ausbreitung überall in der Reihe verlässt. Der Vorteil ist, dass Einfügungen nur Elemente auswechseln müssen, bis eine Lücke erreicht wird. Die Autoren zeigen, dass dieser Sortieren-Algorithmus mit der hohen Wahrscheinlichkeit in O läuft (n, loggen n) Zeit.

Wenn eine Hopser-Liste verwendet wird, wird die Einfügungszeit zu O heruntergebracht (loggen Sie n), und Tausch ist nicht erforderlich, weil die Hopser-Liste auf einer verbundenen Listenstruktur durchgeführt wird. Die Endlaufzeit für die Einfügung würde O sein (n loggen n).

Listeneinfügungssorte ist eine Variante der Einfügungssorte. Es vermindert die Anzahl von Bewegungen.

Listeneinfügungssorte codiert in C

Wenn die Sachen in einer verbundenen Liste versorgt werden, dann kann die Liste mit O (1) zusätzlicher Raum sortiert werden. Der Algorithmus fängt mit am Anfang leer (und deshalb trivial sortiert) Liste an. Die Eingangssachen werden die Liste einer nach dem anderen weggenommen, und dann in den richtigen Platz in der sortierten Liste eingefügt. Wenn die Eingangsliste leer ist, hat die sortierte Liste das gewünschte Ergebnis.

Der Algorithmus verwendet unten einen schleifenden Zeigestock für die Einfügung in die sortierte Liste. Eine einfachere rekursive Methode baut die Liste jedes Mal wieder auf (anstatt zu spleißen) und kann O (n) verwenden schobern Raum auf.

struct VERZEICHNEN

{\

struct HABEN * pNext SCHLAGSEITE;

interne Nummer iValue;

};

struct HABEN * SortList (struct LISTE * pList) SCHLAGSEITE

{\

/* bauen Sie die sortierte Reihe von der leeren Liste * / auf

struct HABEN * pSorted = UNGÜLTIG SCHLAGSEITE;

/* nehmen Sie Sachen von der Eingangsliste eins nach dem anderen bis leer * /

während (pList! = UNGÜLTIG)

{\

/* erinnern Sie sich an den Kopf * /

struct HABEN * pHead = pList SCHLAGSEITE;

/* das Schleppen des Zeigestocks für die effiziente Verbindung * /

struct HABEN ** ppTrail = &pSorted; SCHLAGSEITE

/* Knall verhindert Liste * /

pList = pList-> pNext;

/* spleißen Sie Kopf in die sortierte Liste am richtigen Platz * /

während (WAHR)

,

{\

/* gehört Kopf hier? * /

wenn (*ppTrail == UNGÜLTIG || pHead-> iValue

{\

/* ja * /

pHead-> pNext = *ppTrail;

*ppTrail = pHead;

Brechung;

}\

sonst

{\

/* nein - setzen unten die Liste * / fort

ppTrail = & (*ppTrail)-> pNext;

}\

}\

}\

geben Sie pSorted zurück;

}\</Quelle> http://dl.acm.org/citation.cfm?id=1132705
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest und Clifford Stein. Einführung in Algorithmen, die Zweite Ausgabe. MIT Presse und McGraw-Hügel, 2001. Internationale Standardbuchnummer 0-262-03293-7. Abschnitt 2.1: Einfügungssorte, Seiten 15-21.
  • Donald Knuth. Die Kunst der Computerprogrammierung, Bands 3: Das Sortieren und die Suche, die Zweite Ausgabe. Addison-Wesley, 1998. Internationale Standardbuchnummer 0-201-89685-0. Abschnitt 5.2.1: Durch die Einfügung, Seiten 80-105 sortierend.
  • Kapitel 8, Seiten 95-??

Links


Interdisciplinarity / Ig Nobelpreis
Impressum & Datenschutz