Sortiere die vordere Hälfte der Folge;Die Hilfsroutine zum Mischen lautet: Source: Merge.java JavaDoc: Merge.html
Sortiere die hintere Hälfte der Folge;
Mische die beiden sortierten Folgen zu einer sortierten Folge
Analyse von Mergesort (und ähnlich gelagerten Rekursionen)
f (n)
| Beh.: |
f |
| Zeige: |
f (n) |
Verankerung:
|
n = 1 |
f (1) |
|
f (1) |
Induktionsschluss
Sei bis n - 1 bewiesen
| f (n) |
|
| |
|
| Rek. | |
|
|
|
| |
|
| Induktionsannahme | |
|
= 2 · [(c1 + c2) · |
|
| = (c1 + c2)n · logn - (c1 + c2) · n + 2c1 + c2 · n | |
| = [(c1 + c2)n · logn + c1] + [c1 - c1 · n] | |
|
|
Aber: Mergesort benötigt O(n) zusätzlichen Platz!
Iterative Version von Mergesort (für n = 2k)
l = 1; /* Länge der sortierten Teilfolgen */
k = n; /* Anzahl der sortierten Teilfolgen */
while (k > 1) {
/* alle Teilfolgen der Länge l sind sortiert */
/* Sie beginnen bei l · i für
i = 0,1,...,k - 1 */
Mische je zwei benachbarte Teilfolgen der Länge l
zu einer Teilfolge der Länge 2 * l;
l *= 2; k /= 2;
/* Alle Teilfolgen der Länge l sind sortiert */
/* Sie beginnen bei l · i für
i = 0,1,...,k - 1 */
}
Es ergeben sich log n Phasen mit jeweils linearem Aufwand.
O(n · log n)
Source:
SortTest.java
JavaDoc:
SortTest.html
Applet: