Verflechtungssorte

Verflechtungssorte ist ein O (n loggen n) Vergleich-basierter Sortieren-Algorithmus. Die meisten Durchführungen erzeugen eine stabile Sorte, was bedeutet, dass die Durchführung die Eingangsordnung von gleichen Elementen in der sortierten Produktion bewahrt. Verflechtungssorte ist ein Teilen, und überwinden Sie Algorithmus, der von John von Neumann 1945 erfunden wurde. Ein Detaillieren und Analyse von unten nach oben mergesort sind in einem Bericht von Goldstine und Neumann schon in 1948 erschienen.

Algorithmus

Begrifflich arbeitet eine Verflechtungssorte wie folgt

  1. Teilen Sie die unsortierte Liste in N-Sublisten, jeder, 1 Element enthaltend (wird eine Liste von 1 Element sortiert betrachtet).
  2. Wiederholt Verflechtungssublisten, um neue Sublisten bis zu erzeugen, gibt es nur 1 restliche Subliste. (Das wird die sortierte Liste sein.)

Verfeinernde Durchführung

Der Beispiel-Pseudocode für die Spitze verschmilzt unten Sorte-Algorithmus, der recursion verwendet, um die Liste in Sublisten zu teilen, sich dann verschmilzt, unterstützen Sublisten während des Umsatzes die Anruf-Kette.

fungieren Sie merge_sort (Liste M)

//wenn Listengröße 1 ist, denken Sie, dass sie sortiert hat und geben Sie sie zurück

wenn Länge (m)

Var-Liste, ist Recht abgereist

Var-Mitte der ganzen Zahl = Länge (m) / 2

für jeden x in der M vor der Mitte

fügen Sie x zu linkem hinzu

für jeden x in der M danach oder gleiche Mitte

fügen Sie x zum Recht hinzu

//nennen Sie rekursiv merge_sort , um weiter jede Subliste zu spalten

//bis Sublistengröße 1 ist

verlassen = hat merge_sort (verlassen)

Recht = merge_sort (Recht)

//verschmelzen Sie sich die Sublisten sind von vorherigen Anrufen merge_sort zurückgekehrt

//und geben Sie die resultierende verschmolzene Subliste zurück

geben Sie Verflechtung (verlassen, Recht) zurück

In diesem Beispiel verschmilzt die Funktion den verlassenen und die richtigen Sublisten.

fungieren Sie Verflechtung (verlassen, Recht)

var verzeichnen Ergebnis

während Länge (verlassen) > 0 oder Länge (Recht) > 0

wenn Länge (verlassen) > 0 und Länge (Recht) > 0

wenn zuerst (link)

/* ordnen Sie [] hat die Sachen zur Sorte; ordnen Sie B [] ist eine Arbeitsreihe * /

BottomUpSort (interne Nummer n, ordnen Sie [n], ordnen Sie B [n])

{\

int Breite;

/* jedes in A geführte 1 Element wird bereits "sortiert". * /

/* Machen Sie nacheinander längere sortierte Läufe der Länge 2, 4, 8, 16..., bis ganze Reihe * / sortiert wird

für (Breite = 1; Breite

BottomUpMerge (A, ich, Minute (i+width, n), Minute (i+2*width, n), B);

}\

/* jetzt ist Arbeitsreihe-B mit Läufen der Länge 2*width * / voll

/* kopieren Sie ordnen B, Um für die folgende Wiederholung * / zu ordnen

/* eine effizientere Durchführung würde die Rollen von A und B * / tauschen

CopyArray (A, B, n);

/* jetzt ist Reihe A mit Läufen der Länge 2*width * / voll

}\

}\

BottomUpMerge (ordnen [], interne Nummer iLeft, interne Nummer iRight, interne Nummer iEnd, ordnen B [])

{\

interne Nummer i0 = iLeft;

interne Nummer i1 = iRight;

interne Nummer j;

/* während es Elemente im verlassenen oder den richtigen Listen * / gibt

für (j = iLeft; j

Hybride Verflechtungssorte

Eine hybride Verflechtungssorte wird einen anderen Sorte-Algorithmus verwenden, um relativ kleine Sublisten zu sortieren:

  1. Teilen Sie die unsortierte Liste in eine Zahl von relativ kleinen Sublisten und sortieren Sie sie, einen Sortieren-Algorithmus verwendend.
Wiederholt Verflechtungssublisten, um neue Sublisten bis zu erzeugen, gibt es nur 1 restliche Subliste. (Das wird die sortierte Liste sein.)

Natürliche Verflechtungssorte

Eine natürliche Verflechtungssorte ist von unten nach oben Verflechtungssorte ähnlich, außer dass irgendwelche natürlich vorkommenden Läufe (sortierte Folgen) im Eingang ausgenutzt werden. In von unten nach oben Verflechtungssorte nimmt der Startpunkt an, dass jeder Lauf ein Artikel lange ist. In der Praxis werden zufällige Eingangsdaten viele kurze Läufe haben, die gerade zufällig sortiert werden. Im typischen Fall kann die natürliche Verflechtungssorte nicht als viele Pässe brauchen, weil es weniger Läufe gibt, um sich zu verschmelzen. Zum Beispiel, im besten Fall, wird der Eingang bereits sortiert (d. h., ist derjenige geführt), so muss die natürliche Verflechtungssorte nur machen, führt man die Daten durch.

Analyse

Im Sortieren n Gegenstände hat Verflechtungssorte einen Durchschnitt, und Grenzfall-Leistung von O (n loggen n). Wenn die Laufzeit der Verflechtungssorte für eine Liste der Länge n T (n) ist, dann folgt das Wiederauftreten T (n) = 2T (n/2) + n aus der Definition des Algorithmus (wenden Sie den Algorithmus auf zwei Listen der Hälfte der Größe der ursprünglichen Liste an, und fügen Sie die N-Schritte hinzu, die gebracht sind, um die resultierenden zwei Listen zu verschmelzen). Die geschlossene Form folgt aus dem Master-Lehrsatz.

Im Grenzfall verschmilzt sich die Zahl von Vergleichen Sorte macht ist dem gleich oder ein bisschen kleiner als (n lg n  - 2 + 1), der zwischen (n lg n - n + 1) und (n lg n + n + O (lg n)) ist.

Für großen n und eine zufällig bestellte Eingangsliste hat Verflechtungssorte erwartet, dass sich (die durchschnittliche) Zahl von Vergleichen α\nähert · n weniger als der Grenzfall wo

Im Grenzfall tut Verflechtungssorte ungefähr 39 % weniger Vergleiche, als Schnellsortierung im durchschnittlichen Fall tut; Verflechtungssorte macht immer weniger Vergleiche als Schnellsortierung, außer in äußerst seltenen Fällen, wenn sie punktgleich sind, wo Verflechtungssorte-Grenzfall gleichzeitig mit dem besten Fall der Schnellsortierung gefunden wird. In Bezug auf Bewegungen ist Verflechtungssorte-Grenzfall-Kompliziertheit O (n loggen n) — dieselbe Kompliziertheit wie der beste Fall der Schnellsortierung, und verschmelzen Sie sich der beste Fall der Sorte nimmt ungefähr halb so viel Wiederholungen wie der Grenzfall.

Rekursive Durchführungen der Verflechtungssorte machen 2n  1 Methode ruft den Grenzfall im Vergleich zum n der Schnellsortierung herbei, verschmelzen Sie sich so Sorte hat grob doppelt so viel rekursiv oben als Schnellsortierung. Jedoch sind wiederholende, nichtrekursive Durchführungen der Verflechtungssorte, Methode Anruf oben vermeidend, nicht schwierig zu codieren. Verschmelzen Sie sich die allgemeinste Durchführung der Sorte sortiert im Platz nicht; deshalb muss die Speichergröße des Eingangs für die sortierte Produktion zugeteilt werden, die darin zu versorgen ist (sieh unten für Versionen, die nur n/2 Extraräume brauchen).

Das stabile Sortieren ist im Platz möglich, aber, ist und gewöhnlich ein bisschen langsamer mehr kompliziert, selbst wenn der Algorithmus auch in O läuft (n, loggen n) Zeit. Eine Weise, im Platz zu sortieren, ist, die Blöcke rekursiv zu verschmelzen. Wie die Standardverflechtungssorte, verschmelzen Sie sich im Platz Sorte ist auch eine stabile Sorte. Das stabile Sortieren von verbundenen Listen ist einfacher. In diesem Fall verwendet der Algorithmus mehr Raum nicht, als der bereits verwendet durch die Listendarstellung, aber den O (Klotz (k)) verwendet für den recursion verfolgen.

Verflechtungssorte ist effizienter als schnelle Sorte für einige Typen von Listen, wenn auf die zu sortierenden Daten nur folgend effizient zugegriffen werden kann, und so auf Sprachen wie Lispeln populär ist, wo folgend zugegriffene Datenstrukturen sehr üblich sind. Verschieden von einigen (effizienten) Durchführungen der Schnellsortierung ist Verflechtungssorte eine stabile Sorte, so lange die Verflechtungsoperation richtig durchgeführt wird.

Verflechtungssorte hat auch einige Fehler. Man ist sein Gebrauch 2n Positionen; die zusätzlichen n Positionen werden allgemein verwendet, weil das Mischen von zwei sortierten Sätzen im Platz mehr kompliziert ist und mehr Vergleiche und Bewegungsoperationen brauchen würde. Aber trotz des Gebrauches dieses Raums tut der Algorithmus noch viel Arbeit: Der Inhalt der M wird zuerst in den linken und das richtige und das spätere ins Listenergebnis auf jeder Beschwörung von merge_sort (Variablennamen gemäß dem Pseudocode oben) kopiert. Eine Alternative zu diesem Kopieren soll ein neues Feld der Information mit jedem Schlüssel vereinigen (die Elemente in der M werden Schlüssel genannt). Dieses Feld wird verwendet, um die Schlüssel und jede verbundene Information zusammen in einer sortierten Liste zu verbinden (ein Schlüssel, und seine zusammenhängende Information wird eine Aufzeichnung genannt). Dann geht das Mischen der sortierten Listen durch das Ändern der Verbindungswerte weiter; keine Aufzeichnungen müssen überhaupt bewegt werden. Ein Feld, das nur eine Verbindung enthält, wird allgemein kleiner sein als eine komplette Aufzeichnung, so wird weniger Raum auch verwendet.

Eine andere Alternative, für den Raum oben auf n/2 zu reduzieren, soll verlassen und Recht als eine vereinigte Struktur, Kopie nur der linke Teil der M in den vorläufigen Raum aufrechterhalten, und die Verflechtungsroutine zu leiten, um die verschmolzene Produktion in die M zu legen. Mit dieser Version ist es besser, den vorläufigen Raum außerhalb der Verflechtungsroutine zuzuteilen, so dass nur eine Zuteilung erforderlich ist. Das übermäßige im vorherigen Paragrafen erwähnte Kopieren wird auch gelindert, seit dem letzten Paar von Linien vor der Rückergebnis-Behauptung (Funktionsverflechtung im Pseudocode oben) werden überflüssig.

Verflechtungssorte kann auch mit dem Mischen von mehr als zwei Sublisten auf einmal mit dem N-Way-Verflechtungsalgorithmus getan werden. Jedoch ist die Zahl von Operationen ungefähr dasselbe. Denken Sie, K-Sublisten auf einmal zu verschmelzen, wo für die Einfachheit k eine Macht 2 ist. Die Wiederauftreten-Beziehung wird T (n) = k T (n/k) + O (n loggen k). (Der letzte Teil kommt aus dem Verflechtungsalgorithmus, der, wenn durchgeführt, optimal mit einem Haufen oder binären Suchbaum selbsterwägend, O nimmt (loggen Sie k) die Zeit pro Element.), Wenn Sie die Wiederauftreten-Beziehung für die regelmäßige Verflechtungssorte (T (n) = 2T (n/2) + O (n)) nehmen und es logk Zeiten ausbreiten, bekommen Sie dieselbe Wiederauftreten-Beziehung. Das ist wahr, selbst wenn k nicht eine Konstante ist.

Verwenden Sie mit Band-Laufwerken

Eine Außenverflechtungssorte ist praktisch, um Verwenden-Platten- oder Band-Laufwerke zu führen, wenn die zu sortierenden Daten zu groß sind, um das Gedächtnis einzubauen. Das Außensortieren erklärt, wie Verflechtungssorte mit Laufwerken durchgeführt wird. Eine typische Band-Laufwerk-Sorte verwendet vier Band-Laufwerke. Die ganze Eingabe/Ausgabe ist (abgesehen von der Zurückspulung am Ende jedes Passes) folgend. Eine minimale Durchführung kann mit gerade 2 Rekordpuffern und einigen Programm-Variablen vorbeigehen.

Die vier Band-Laufwerke als A, B, C, D, mit den ursprünglichen Daten auf A, und mit nur 2 Rekordpuffern nennend, ist der Algorithmus #Bottom-up_implementation mit Paaren von Band-Laufwerken statt der Reihe im Gedächtnis ähnlich. Der grundlegende Algorithmus kann wie folgt beschrieben werden:

  1. Verschmelzen Sie Paare von Aufzeichnungen von A; das Schreiben von Zwei-Aufzeichnungen-Sublisten abwechselnd zu C und D.
  2. Verschmelzen Sie Zwei-Aufzeichnungen-Sublisten von C und D in Vier-Aufzeichnungen-Sublisten; das Schreiben von diesen abwechselnd zu A und B.
  3. Verschmelzen Sie Vier-Aufzeichnungen-Sublisten von A und B in Acht-Aufzeichnungen-Sublisten; das Schreiben von diesen abwechselnd zu C und D
  4. Wiederholen Sie sich, bis Sie eine Liste haben, die alle Daten enthält, hat---in log2 (n) Pässe sortiert.

Anstatt mit sehr kurzen Läufen anzufangen, wird der anfängliche Pass viele Aufzeichnungen ins Gedächtnis lesen, eine innere Sorte tun, um einen langen Lauf zu schaffen, und dann jene langen Läufe auf den Produktionssatz zu verteilen. Der Schritt vermeidet viele frühe Pässe. Zum Beispiel wird eine innere Sorte von 1024 Aufzeichnungen 9 Pässe sparen. Die innere Sorte ist häufig groß, weil sie solch einen Vorteil hat. Tatsächlich gibt es Techniken, die die anfänglichen Läufe länger machen können als das verfügbare innere Gedächtnis.

Eine hoch entwickeltere Verflechtungssorte, die Band (und Platte) Laufwerk-Gebrauch optimiert, ist die Polyphase-Verflechtungssorte.

Optimierung der Verflechtungssorte

Auf modernen Computern kann die Gegend der Verweisung von der höchsten Bedeutung in der Softwareoptimierung sein, weil Mehrniveau-Speicherhierarchien verwendet werden. Des geheimen Lagers bewusste Versionen des Verflechtungssorte-Algorithmus, dessen Operationen spezifisch gewählt worden sind, um die Bewegung von Seiten in und aus einem geheimen Speicherlager einer Maschine zu minimieren, sind vorgeschlagen worden. Zum Beispiel hört der mit Ziegeln gedeckte Verflechtungssorte-Algorithmus auf, Subreihe zu verteilen, wenn die Subreihe der Größe S erreicht wird, wo S die Zahl von eines geheimen Lagers einer Zentraleinheit einbauenden Datensachen ist. Jede dieser Subreihe wird mit einem Sortieren-Algorithmus im Platz sortiert, um Speichertausch zu entmutigen, und normale Verflechtungssorte wird dann auf die rekursive Standardmode vollendet. Dieser Algorithmus hat bessere Leistung auf Maschinen dieser Vorteil der Optimierung des geheimen Lagers demonstriert.

angedeutet eine alternative Version der Verflechtungssorte, die unveränderlichen zusätzlichen Raum verwendet. Dieser Algorithmus wurde später raffiniert..

Außerdem verwenden viele Anwendungen des Außensortierens eine Form des Verflechtungssortierens, wo der Eingang bis zu einer höheren Zahl von Sublisten ideal zu einer Zahl gespalten wird, für die das Mischen von ihnen noch den zurzeit bearbeiteten Satz von Seiten das Hauptgedächtnis einbauen lässt.

Parallele Verarbeitung

Verflechtungssorte parallelizes gut wegen des Gebrauches der teilen-und-überwinden Methode. Eine parallele Durchführung wird im Pseudocode in der dritten Ausgabe von Cormen, Leiserson und der Einführung des Bierkrugs in Algorithmen gezeigt. Dieser Algorithmus verwendet parallelen Verflechtungsalgorithmus an nicht nur parallelize die rekursive Abteilung der Reihe, sondern auch die Verflechtungsoperation. Es, bringt in der Praxis wenn verbunden, mit einer schnellen stabilen folgenden Sorte, wie Einfügungssorte, und einer schnellen folgenden Verflechtung als ein Grundfall eine gute Leistung, um kleine Reihe zu verschmelzen. Verflechtungssorte war einer der ersten Sortieren-Algorithmen, wo optimale Geschwindigkeit mit Richard Cole erreicht wurde, der einen klugen Probenteilungsalgorithmus verwendet, um O (1) Verflechtung zu sichern. Andere hoch entwickelte parallele Sortieren-Algorithmen können dieselben oder besseren Zeitgrenzen mit einer niedrigeren Konstante erreichen. Zum Beispiel 1991 hat David Powers eine parallelized Schnellsortierung beschrieben (und eine zusammenhängende Basis-Sorte), der in O funktionieren kann (loggen Sie n) die Zeit auf einem CRCW PRAHM mit n Verarbeitern durch das Durchführen verteilend implizit.

Vergleich mit anderen Sorte-Algorithmen

Obwohl heapsort dieselben Zeitgrenzen wie Verflechtungssorte hat, verlangt er nur Θ (1) Hilfsraum statt Verflechtungssorte-Θ (n), und ist häufig in praktischen Durchführungen schneller. Auf typischen modernen Architekturen überbieten effiziente Schnellsortierungsdurchführungen allgemein mergesort, um RAM-basierte Reihe zu sortieren. Andererseits ist Verflechtungssorte eine stabile Sorte, parallelizes besser, und ist beim Berühren zum Zugang langsamer folgender Medien effizienter. Verflechtungssorte ist häufig die beste Wahl, für eine verbundene Liste zu sortieren: In dieser Situation ist es relativ leicht, eine Verflechtungssorte auf solche Art und Weise durchzuführen, dass es nur Θ (1) Extraraum verlangt, und das langsame zufällige Zugriffsverhalten einer verbundenen Liste einige andere Algorithmen macht (wie Schnellsortierung), leisten schlecht, und andere (wie heapsort) völlig unmöglich.

Bezüglich Perl 5.8 ist Verflechtungssorte sein Verzug-Sortieren-Algorithmus (es war Schnellsortierung in vorherigen Versionen von Perl). In Java der Arrays.sort schalten Methode-Gebrauch-Verflechtungssorte oder eine abgestimmte Schnellsortierung abhängig vom datatypes und für die Durchführungsleistungsfähigkeit auf die Einfügungssorte um, wenn weniger als sieben Reihe-Elemente sortiert werden. Pythonschlange verwendet timsort, eine andere abgestimmte Hybride der Verflechtungssorte und Einfügungssorte, die auch der Standardsorte-Algorithmus für Java SE 7 werden wird.

Dienstprogramm im Online-Sortieren

Verschmelzen Sie sich die Verflechtungsoperation der Sorte ist im Online-Sortieren nützlich, wo die zu sortierende Liste ein Stück auf einmal, statt aller am Anfang erhalten wird. In dieser Anwendung sortieren wir jedes neue Stück, das mit jedem Sortieren-Algorithmus erhalten wird, und dann verschmelzen Sie es in unsere sortierte Liste so weit das Verwenden der Verflechtungsoperation. Jedoch kann diese Annäherung rechtzeitig und Raum teuer sein, wenn die erhaltenen Stücke im Vergleich zur sortierten Liste klein sind - soll eine bessere Annäherung in diesem Fall Elemente in einen binären Suchbaum einfügen, weil sie erhalten werden.

Referenzen

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.22.8523

Links


Variable von Metasyntactic / Maule Luft
Impressum & Datenschutz