Kurs:Algorithmen und Datenstrukturen/Kapitel 2/MergeSort

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.

 

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   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  .