Bei der Standardversion des Sortierverfahrens Mergesort wird in der Funktion merge die vordere Hälfte der Datenfolge in ein Hilfsarray ausgelagert. Anschließend werden die Datenelemente der ausgelagerten Hälfte und die der hinteren Hälfte ihrer Größe nach zurückkopiert.
Es ist naheliegend, das Auslagern mit dem vorausgehenden Rekursionsschritt zu kombinieren, indem das Hilfsarray zum Zielarray der Funktion merge gemacht wird.
Die folgende Implementation [Kloe 08] verwendet zwei Funktionen sortInPlace und sortInto.
In der Funktion sortInPlace wird zunächst die hintere Hälfte des Arrays a rekursiv mit sortInPlace an Ort und Stelle sortiert, unter Benutzung des Hilfsarrays b. Anschließend wird die vordere Hälfte mit sortInto ins Hilfsarray sortiert. Dies ist die Situation wie nach dem Auslagern der vorderen Hälfte in der Standardversion von Mergesort. Zum Schluss werden mit merge die Datenelemente der ausgelagerten Hälfte und die der hinteren Hälfte ihrer Größe nach ins Array a zurückkopiert (Bild 1).
Bild 1: Funktion sortInPlace
In der Funktion sortInto wird die vordere Hälfte des Arrays a mit sortInPlace an Ort und Stelle sortiert, unter Benutzung des Hilfsarrays b. Dann wird rekursiv mit sortInto die hintere Hälfte ins Hilfsarray sortiert. Dies ist die Situation wie nach dem Auslagern der vorderen Hälfte in der Standardversion, jedoch mit vertauschten Rollen von Array a und Hilfsarray b. Zum Schluss werden mit merge die Datenelemente ihrer Größe nach ins Hilfsarray b kopiert (Bild 2).
Bild 2: Funktion sortInto
Die folgende Implementierung in C++ wird erleichtert durch die C-typische Adressierung von Arrays wie z.B. im Aufruf sortInto(a+m, b+m, n-m).
[Kloe 08] T. Kloecker: (Persönliche Korrespondenz). Thomas Kloecker (2008)
Zurück zu Mergesort oder [up]