28.3
Mergesort-Algorithmus 28.3.1 Die Idee des Mergesort-Algorithmus |
|
J. v.
Neumann
mehr zum "von- |
![]() So verlangt die von Neumann - Architektur, dass
Dieses Konzept 'verlang' auch eine entsprechende Architektur auf der Hardwareseite:
|
1945 entwickelte J. v. Neumann das Konzept für den Mergesort-Algoirithmus. Wie der Quicksort-Algorithmus gehört auch der Mergesort-Algorithmus zu der Klasse der 'divide and conquer'-Algorithmen. Er folgt also auch der Strategie: Teile das Problem. Löse dieses und erzeuge aus den Teillösungen die Gesamtlösung. | |
Konkret | Zur Veranschaulichung des Algorithmus' gehen wir von einer 4-elementigen Liste aus, die wir in 2 Teillisten zerlegen (partition). Diese werden jeweils in 1 elementige Listen zerlegt. Diese Zerlegung geschieht bei einem rekursiven Abstieg. Beim rekursiven (Wieder)aufstieg werden die Teillisten wieder zusammengmischt (merge). Bei diesem Mischen geschieht das eigentliche Sortieren. Ganz unten, wir haben 1 elemetige Teillisten, sind diese a priori sortiert. Beim Aufstieg wird das Zusammenfügen so organisiert, dass die neu entstehenden, jetzt größeren Teillisten sortiert sind. |
![]() |
|
Wie wir
gesehen haben, besteht die eigentliche Sortierarbeit im Zusammenfügen
zweier sortierter Listen zu einer neuen, wieder sortierten Liste.
Betrachten wir also das Zusammenfügen genauer Die Situation: Wir sind beim rekursiven Aufstieg und haben unsere Liste a, die zwei sortierte Teillisten enthält. Wir kopieren die Liste in eine Hilfsliste b. Die Position m markiert das am weitesten rechts stehende Element der linken Teilliste. |
|
![]() |
|
Wir beginnen mit dem Zusammenfügen. Ziel ist dabei die sortierte Liste a, in der dabei Schritt für Schritte die alten Elemente überschrieben werden. Wir setzen dazu die 'Zeiger' i und k auf das jeweils ersten Plätze der Teillisten. Der Zeiger k zeigt auf ersten Platz der neuen Liste. Der Vergleich der Werte an den Positionen i u´nd k zeigt, dass am Platz k der kleiner Wert steht, der deshalb an die Stelle k der Liste a kopiert wird. Die Zeiger j und k springen um eine Stelle weiter. | |
![]() |
|
Jetzt sind die Werte an den Platzen j und k gleich. IN diesem Fall wird der Wert vom Platz i an die Stelle k der Liste a kopiert. Jetzt werden i und k um 1 erhöht. | |
![]() |
|
Der Wert 1 wird nach a kopiert | |
![]() |
|
Der Wert 2 wird nach a kopiert. | |
![]() |
|
Dies setzt sich so fort | |
![]() |
|
bis | |
![]() |
|
eine Teilliste leer ist | |
![]() |
|
Da die Teillisten sortiert sind, kann der übrig gebliebene Rest der noch nicht leeren Teilliste auf einen 'Rutsch' in die Liste a kopiert werden | |
![]() |
|
zu | 28.3.2 Implementierung des Mergesort-Algorithmus |
zur Startseite | www.pohlig.de (C) MPohlig 2006 |