Merge-Sort - techfak.uni-bielefeld.de · Merge-Sort Die Funktion Merge-Sort(A,p,r) sortiert das...

16
Merge-Sort

Transcript of Merge-Sort - techfak.uni-bielefeld.de · Merge-Sort Die Funktion Merge-Sort(A,p,r) sortiert das...

Merge-Sort

Divide and Conquer Ansatz

• Divide: Teile das Problem in Unterprobleme

• Conquer: Löse die Unterprobleme rekursiv. Wenn das Unterproblem klein ist, ist die Lösung trivial

• Combine: Kombiniere die Lösungen der Unterprobleme zu einer Lösung für das Ursprungsproblem

Merge-Sort• Divide: Teile die n-elementige Eingabe in zwei

Eingaben der Länge n/2.

• Conquer: Sortiere die beiden Teileingaben rekursiv mit Merge-Sort

• Combine: Füge die beiden sortierten Ergebnisse zu einem vollständigen sortierten Ergebnis zusammen.

Der Basisfall der Rekursion ist erreicht, wenn die zu sortierende Eingabe die Länge 1 hat. Hier ist nichts mehr zu tun, da eine Eingabe der Länge 1 schon sortiert ist.

Merge-SortDie Funktion Merge-Sort(A,p,r) sortiert das Subarray A[p..r]. Wenn p≥r, ist das Array schon sortiert, und es gibt nichts zu tun. Ansonsten wird das Array in die beiden Subarrays A[p..q] und A[q+1..r] aufgeteilt. Diese werden dann rekursiv mit Merge-Sort sortiert. Schließlich werden die beiden sortierten Subarrays mittels Merge zu einem sortierten Ergebnisarray kombiniert.

Merge• Vergleiche mit dem Sortieren von

Spielkarten:

• zwei sortierte Kartenstapel liegen auf dem Tisch.

• Schritt eins: nehme jeweils eine Karte von beiden Kartenstapeln und lege die kleinere Karte auf den Zielstapel

• Wenn ein Stapel komplett aufgebraucht ist, lege den verbleibenden Stapel komplett auf den Zielstapel

Beweis der Korrektheit des Algorithmus

Schleifen-Invariante:Beim Start jeder Iteration der For-Schleife enthält dasArray A[p..k-1] die kleinsten k-p Elemente von L[1..n1+1] und R[1..n2+1], in sortierter Reihenfolge.L[i] und R[j] sind die kleinsten Elemente ihrer Arrays und wurden noch nicht zurück nach A kopiert.

Initialisierung:Vor der ersten Schleifeniteration ist k=p, somit istA[p..k-1] leer. Dieses leere Subarray enthält diek-p=0 kleinsten Elemente von L und R. Da i=j=1,enthalten sowohl L[i] als auch R[j] die kleinsten Elemente ihrer Arrays.

Erhaltung:Annahme: L[i]≤R[j]. Dann ist L[i] das kleinste Element,das noch nicht nach A kopiert wurde. Da A[p..k-1]die k-p kleinsten Elemente enthält, und L[i] nach A[k]kopiert wird, enthält A[p..k] die kleinsten k-p+1 Elemente. In der Schleife werden k und i jeweils um 1erhöht; dieses erhält die Schleifen-Invariante. FürL[i]>R[j] gilt entsprechendes.

Terminierung:Bei Terminierung der Schleife ist k=r+1. Das SubarrayA[p..k-1]=A[p..r] enthält dann die k-p=r-p+1kleinsten Elemente von L[1..n1+1] und R[1..n2+1], insortierter Reihenfolge. L und R zusammen enthaltenn1+n2+2 = r-p+3 Elemente. Alle Elemente ausser denbeiden größten wurden zurück nach A kopiert, diesebeiden sind die beiden unendlichen.

Effizienz

Merge benötigt O(n) Zeit

EffizienzEffizienz eines Divide-and-Conquer Algorithmusallgemein:Wenn das Problem klein ist, kann es in konstanterZeit gelöst werden.Problem wird in a Teilprobleme aufgeteilt, jedeshat die Größe 1/b des Originals. (bei Merge-Sort:a=b=2). Jede rekursive Lösung der Teilproblemebenötigt T(n/b) Zeit.Aufteilung des Problems in Teilprobleme benötigtD(n) Zeit.Kombinieren der Teillösungen zur Gesamtlösung benötigt C(n) Zeit.

Effizienz von Merge-Sort• Hat das zu sortierende Array die Länge 1,

kann es in konstanter Zeit sortiert werden.

• Divide: Hier wird nur die Mitte des Subarrays berechnet. Dies geht in konstanter Zeit. Daher D(n)=ϴ(1).

• Conquer: Die beiden Teiprobleme der Größe n/2 werden rekursiv gelöst. Also: 2T(n/2)

• Combine: Hier wird die Funktion Merge verwendet. Also C(n)=ϴ(n).

Der Baum hat insgesamt lg n + 1Ebenen.Jede Ebene benötigt cn SchritteInsgesamt also cn lg n + cn Schritte. → Laufzeit vonMerge-Sort: O(n lg n)

zum Vergleich: Insertion-Sort:O(n2)