ZusammenfĂŒhrungssorten arbeiten nach diesem Prinzip:
- Geordnete Subarrays werden durchsucht (optional - gebildet).
- Geordnete Subarrays werden zu einem gemeinsamen geordneten Subarray verkettet.
Ein geordnetes Subarray innerhalb des Arrays hat fĂŒr sich genommen nicht viel Wert. Wenn wir jedoch in einem Array
zwei geordnete Subarrays finden, ist dies eine völlig andere Sache. Tatsache ist, dass Sie sie sehr schnell und zu minimalen Kosten zusammenfĂŒhren können - um aus einem Paar geordneter Subarrays ein allgemein geordnetes Subarray zu bilden.

Wie Sie sehen können, ist das Kombinieren von zwei geordneten Arrays zu einem nicht einfach, aber sehr einfach. Sie mĂŒssen sich in beiden Arrays gleichzeitig von links nach rechts bewegen und die nĂ€chsten Elementpaare aus beiden Arrays vergleichen. Das kleinere Element wird zum gemeinsamen Kessel geschickt. Wenn die Elemente in einem der Arrays enden, werden die verbleibenden Elemente aus dem anderen Array einfach der Reihe nach in die Hauptliste ĂŒbertragen.
Dies ist das Salz der Algorithmen dieser Klasse. AnfĂ€nglich kann ein zufĂ€lliges Array in viele kleine geordnete Subarrays unterteilt werden. Beim paarweisen ZusammenfĂŒhren nimmt die Anzahl der geordneten Subarrays ab, und die LĂ€nge jedes einzelnen nimmt zu. Im letzten Schritt besteht das Array nur aus zwei geordneten Subarrays, die zu einer einzigen geordneten Struktur zusammengefĂŒhrt werden.

Der Autor dieses Konzepts ist John von Neumann. Manchmal gibt es eine kontroverse Behauptung, dass er wĂ€hrend der Arbeit am Manhattan-Projekt auf das Sortieren gekommen sei, weil er vor der Aufgabe stand, eine groĂe Menge statistischer Daten bei der Entwicklung einer Atombombe effektiv zu berechnen. Es ist schwierig, die GlaubwĂŒrdigkeit dieser Version zu beurteilen, da seine ersten Arbeiten zur Sortierung nach Fusionen aus dem Jahr 1948 stammen und die Erstellung der Bombe drei Jahre zuvor abgeschlossen wurde. Was fĂŒr eine atomare Sortierung gibt es jedoch? Schauen wir uns das an.
NatĂŒrliche Neumann-Fusion

Der Neyman-Algorithmus wurde von den Konstruktionsmerkmalen der Computer der 40er Jahre beeinflusst. Es sah so aus:
- Insgesamt werden drei MagnetbÀnder verwendet - das Hauptband, auf dem unsortierte Daten und zwei Hilfsdaten aufgezeichnet werden.
- Die Daten werden nacheinander vom Hauptband gelesen.
- WÀhrend sequentiell gelesene Daten ein geordnetes Subarray sind, werden sie auf eines der HilfsbÀnder kopiert.
- Sobald das nÀchste sortierte Subarray fertig ist (d. H. Ein Element, das kleiner als das vorherige ist, befindet sich auf dem Hauptband), wird ein Zeiger auf das Hilfsband (Ende des Subarrays) gesetzt und es erfolgt ein Wechsel zu einem anderen Hilfsband.
- Die Punkte 2 bis 4 werden erneut wiederholt, nur die Daten werden auf ein anderes Hilfsband ĂŒbertragen. Am Ende des nĂ€chsten bestellten Subarrays wechselt das Hauptband abwechselnd zu einem Hilfsband und dann zu einem anderen.
- Wenn alle Daten vom Hauptband gelesen wurden, erfolgt die Verarbeitung der HilfsbÀnder.
- Beide HilfsbÀnder lesen nacheinander Daten.
- In diesem Fall werden die nÀchsten Daten von zwei BÀndern miteinander verglichen. Entsprechend den Vergleichsergebnissen wird das kleinste Element des Paares auf dem Hauptband aufgezeichnet.
- Da die Grenzen von Arrays auf HilfsbÀndern mit Zeigern markiert sind, erfolgt das Lesen und Vergleichen nur innerhalb der Grenzen sortierter Subarrays.
- Wenn auf einem der HilfsbĂ€nder die Elemente des nĂ€chsten Subarrays beendet sind, wird der Rest des Subarrays vom verbleibenden Band einfach auf das Hauptband ĂŒbertragen.
- Wir wiederholen den gesamten Vorgang erneut, bis die Daten auf dem Hauptband ein vollstÀndig geordnetes Array sind.
Die Neumann-Sortierung ist ein adaptiver Algorithmus: Sie fixiert nicht nur die sortierten Teile des Arrays, sondern versucht auch zunĂ€chst, sie zu vergröĂern, so dass auf der Basis lĂ€nglicher geordneter Subarrays noch lĂ€nger geordnete Subarrays entstehen. Daher wird es auch als
adaptive ZusammenfĂŒhrungssortierung bezeichnet .
Die KomplexitÀt dieses Algorithmus ist bescheiden - O (
n 2 ), und dennoch war dies fĂŒr die Pioniere des Röhrencomputers ein Durchbruch.
Am Beispiel dieser ersten ZusammenfĂŒhrungssortierung ist bereits ein Nachteil dieser Klasse von Algorithmen sichtbar - die Kosten fĂŒr zusĂ€tzlichen Speicher. In dieser Hinsicht erfordern fast alle ZusammenfĂŒhrungssortierungen zusĂ€tzlich O (
n ), elegante Ausnahmen sind jedoch selten.
Direkte Fusion von Bowes und Nelson
Genau genommen ist der Bowes-Nelson-Algorithmus ein Sortiernetzwerk, keine Sortierung. Dabei werden das Array und alle seine Subarrays in zwei HĂ€lften geteilt, und nichts hindert alle diese HĂ€lften daran, in allen Phasen parallel verarbeitet zu werden. Es kann jedoch auch in Form einer Sortierung dargestellt werden. Und wir kommen auch zum Thema Sortieren von Netzwerken.

- Das Array ist in zwei HĂ€lften unterteilt - in die linke und rechte HĂ€lfte.
- Elemente sind in Gruppen unterteilt.
- Bei der ersten Iteration sind dies die beiden Elemente (das 1. Element der linken HĂ€lfte + das 1. Element der rechten HĂ€lfte, das 2. Element der linken HĂ€lfte + das 2. Element der rechten HĂ€lfte usw.), bei der zweiten Iteration die vier Elemente (1- 2. und 2. Element der linken HĂ€lfte + 1. und 2. Element der rechten HĂ€lfte, 3. und 4. Element der linken HĂ€lfte + 3. und 4. Element der rechten HĂ€lfte usw.), auf der dritten - Acht usw.
- Elemente jeder Gruppe aus der linken HĂ€lfte sind sortierte Subarrays, Elemente jeder Gruppe aus der rechten HĂ€lfte sind ebenfalls sortierte Subarrays.
- FĂŒhren Sie die sortierten Subarrays aus dem vorherigen Absatz zusammen.
- Wir kehren zu Punkt 1 zurĂŒck. Der Zyklus wird fortgesetzt, bis die GröĂen der Gruppen kleiner als die GröĂe des Arrays sind.
Es scheint, dass hier zusĂ€tzlicher Speicher benötigt wird. Aber nein! FĂŒr eine verstĂ€ndlichere Wahrnehmung in der Animation befinden sich die linke und die rechte HĂ€lfte des Arrays aufeinander, so dass die relative Position der verglichenen Subarrays offensichtlicher ist. Aufgrund der strengen Halbierung ist jedoch ein Algorithmus möglich, bei dem alle Vergleiche und Austausche durchgefĂŒhrt werden, ohne dass zusĂ€tzliche Ressourcen aus dem Speicher erforderlich sind. Was fĂŒr die ZusammenfĂŒhrungssortierung sehr ungewöhnlich ist.
def bose_nelson(data): m = 1 while m < len(data): j = 0 while j + m < len(data): bose_nelson_merge(j, m, m) j = j + m + m m = m + m return data def bose_nelson_merge(j, r, m): if j + r < len(data): if m == 1: if data[j] > data[j + r]: data[j], data[j + r] = data[j + r], data[j] else: m = m // 2 bose_nelson_merge(j, r, m) if j + r + m < len(data): bose_nelson_merge(j + m, r, m) bose_nelson_merge(j + m, r - m, m) return data
Es gibt etwas in allen SortierzusammenfĂŒhrungen, das sie der Wasserstoffbombe Ă€hnlich macht. Zuerst erfolgt die Teilung, dann die Synthese.
Referenzen
ZusammenfĂŒhren /
ZusammenfĂŒhrenSerienartikel:
Beide im heutigen Artikel erwĂ€hnten Sortierungen sind jetzt in der AlgoLab-Anwendung verfĂŒgbar (fĂŒr diejenigen, die Algorithmen mit dieser Excel-Anwendung studieren, aktualisieren Sie die Datei). Und in nur wenigen Tagen, mit der Veröffentlichung einer bevorstehenden Fortsetzung von Merge Sortes, werden mehrere weitere Algorithmen dieser Klasse verfĂŒgbar sein.
Es gibt eine EinschrĂ€nkung fĂŒr die Bowes-Nelson-Sortierung - die GröĂe des Arrays muss eine Zweierpotenz sein. Wenn diese Bedingung nicht erfĂŒllt ist, schneidet das Makro das Array auf eine geeignete GröĂe zu.

Dieser Artikel wurde mit UnterstĂŒtzung von EDISON Software verfasst, einem Unternehmen, das 3D-Rekonstruktionssoftware schreibt und hochentwickelte MessgerĂ€te entwickelt .