Merge-Sort - techfak.uni-bielefeld.de · Merge-Sort Die Funktion Merge-Sort(A,p,r) sortiert das...
Transcript of Merge-Sort - techfak.uni-bielefeld.de · Merge-Sort Die Funktion Merge-Sort(A,p,r) sortiert das...
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.
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).