Kurs:Algorithmen und Datenstrukturen/Kapitel 2/MergeSort

Aus Wikiversity
Zur Navigation springen Zur Suche springen

Merge Sort[Bearbeiten]

MergeSort ist ein rekursiver Sortieralgorithmus. Die Strategie sieht wie folgt aus:

Besteht das Array aus nur einem Element, so ist es schon sortiert. Ansonsten teilen wir das Array in zwei Hälften. Jede dieser Hälften wird separat sortiert. Wir füllen das Ursprungsarray elementweise aus den zwei sortierten Hälften wieder auf.

Diese sogenannte divide and conquer Strategie kommt in der Informatik sehr häufig vor. Wenn wir ein Problem nicht direkt anpacken können oder wollen, so teilen wir es in zwei gleiche Teilprobleme auf, lösen diese separat, und basteln uns aus den zwei Teillösungen die Gesamtlösung.

Dieses Zusammenbasteln einer Gesamtlösung aus zwei Teillösungen ist für das Sortieren trivial: Wir setzen am Anfang der beiden Arrays einen Zeiger resp. und auf den Anfang des Zielarrays einen Zeiger . Wir vergleichen nun die zwei Elemente bei und und setzen das kleinere davon an die Position und erhoehen sowohl als auch den Zeiger, von dem das Element kopiert wurde.

MergeSort.001.png

Die Sortieralgorithmen, die wir uns bis jetzt angeschaut haben, sind alle in-place Algorithmen: das sind Algorithmen, die zum Sortieren keinen zusätzlichen Speicherplatz benötigen, d.h. es werden immer nur zwei Elemente vertauscht. Dies ist bei MergeSort nicht mehr der Fall: wir benötigen ein zusätzliches Array, um die zwei sortierten Unterarrays wieder zusammenzufügen.

Programmierbeispiele[Bearbeiten]

aus dem Wikipedia-Artikel Wikipedia Mergesort:

Analyse[Bearbeiten]

Bei der Analyse des asymptotischen Verhaltens können wir nicht mehr die Anzahl Vertauschungen zählen, da keine Elemente mehr vertauscht werden. Wir betrachten stattdessen die Anzahl Kopien, d.h. die Anzahl Male, das ein Element an einer anderen Stelle kopiert wird.

Da der Algorithmus rekursiv funktioniert, berechnen wir auch dessen Kosten rekursiv. Die Anzahl Kopien für ein Unterarray der Länge berechnet sich demzufolge aus der Anzahl Kopien der zwei Unterarrays Plus noch die Kopien, um beide sortierte Hälften ins Zielarray zu kopieren.

Wir verankern die Rekursion für (unterhalb dieser Länge führen wir ja keine Rekursion mehr durch) und führen einige Schritte durch:

(für )

Wir beweisen diese Annahme mit einer vollständigen Induktion. Wir prüfen also zuerst den Fall für , denn den Fall behandeln wir als Ausnahme direkt.

.

Und nach dieser Überprüfung, die Induktion für alle natürlichen Werte i:

.

Oder nach der Substitution: :

.

Die Anzahl Kopiervorgänge für ist somit in .