Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Ähnliche Präsentationen


Präsentation zum Thema: "Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas."—  Präsentation transkript:

1 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas Hilpold Institut für Wirtschaftsinformatik Software Engineering JKU Linz Termin 10 – Sortierung

2 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 2 Lösung Übung 8 - Tafel Thema: Sortierung Übersicht Quicksort Grundidee Partitionierung Quicksort rekursiv Analyse Übungsbesprechung Übung 10 Übersicht

3 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 3 Lösung Ü8

4 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 4 Übersicht Sortierverfahren gemessene Werte (512 Elemente in ms) geordnetzufälligumgekehrt direkte Auswahl190719562675 direktes Einfügen2314442036 Shellsort116349492 Quicksort6914679 aus Wirth, Algorithmen und Datenstrukturen, 1995. S 106

5 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 5 Quicksort Grundidee Algorithmus quicksort(...) 0. Falls mehr als ein Element zu sortieren Zerlege Feld in eine rechte und eine linke Partition, sodaß alle linken Elemente kleiner sind als ein Pivotelement (z.B. 5) und alle rechten größer. -Ergebnis: 2 Teile, wobei alle Elemente rechts größer sind als alle links. 3. quicksort (linker Teil) 4. quicksort (rechter Teil) -> Wichtig: Partitionierung 732958610

6 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 6 Paritionierung (1) Ziel und Vorgangsweise Ziel: Feld in zwei Partitionen links und rechts teilen Ideal: Partitionen gleich groß. (Extremfall: eine Partition nur ein Element, andere Rest) Vorgangsweise: 0. Wähle ein Pivotelement (z.B. das mittlere des Array -> data[n/2]-5) 1. Laufe von links (0) in Richtung Pivotelement solange alle kleiner sind (Merke Index left) 2. Laufe von rechts (n-1) in Richtung Pivotelement solange alle größer sind (Merke Index right) 3. Vertausche Elemente der Positionen links und rechts, left++, right-- 4. weiter mit 1, solange sich left und right nicht treffen (left <=right) 732958610

7 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 7 Partitionierung (2) Beispiel 732958610 732958610 012345678 n = 9, PivotElement: pos=4, Wert = 5 leftrightpivot 0 1 732958610 012345678 leftright 2 032958617 leftright überspringe v.r. und v.l. tausche, indices +1/-1 wichtig: O(N) !!

8 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 8 Partitionierung (3) Wahl des Pivotelements Ergebnis: 2 Partitionen, die –zufällig- genau in der Mitte geteilt und somit gleich groß sind. -> Idealfall Entscheidend ist die Wahl des Pivotelements. In unserem Beispiel verwendeten wir das Element in der Mitte (n/2 -> 4). Optimal wäre der Median der Elementwerte. Median = Wert, der bei einer sortierten Liste in der Mitte steht. 0-1-2-3- 5 -6-7-8-9 -> 5 (hier zufällig, vertausche z.B: 0 und 5) Diesen können wir natürlich nicht bestimmen. Kompromiß: Median der drei Werte. [0]=7, [n/2]=5, [n-1]=0. Aus diesen dreien können wir rel. rasch den Median bestimmen und unsere Methode zur Wahl eines Pivot-Elements verbessert sich etwas. 732958610

9 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 9 Partitionierung (4) Beispiel – andere Ausgangsdaten 732958610 732908615 012345678 Bei Methode: n/2 -> 0 Pivot - > extreme Teilung Bei Methode Median von drei -> 5 Analyse -> O(n) !! leftrightpivot 0

10 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 10 Partitionierung (5) Bestimmung des MedianVon3 732908615 012345678 1.Falls array[leftBound] > array[center] swap (leftbound, center) 2.Falls nun array[leftBound] > array[rightBound] swap (leftbound,rightbound) 3.Falls array[center] > array[rightBound] swap (center, rightbound) 4.return array[center] nach 1 gilt: l 231 nach 2 gilt: l 132 nach 3 gilt: l <= c <=r c <= r 123 0 7 0 5 0 7 5 0 5 7 5 032958617

11 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 11 Quicksort Grundidee Algorithmus quicksort(...) 0. Falls mehr als ein Element zu sortieren 1. Pivotelement wählen 2. Parititionieren-> O(N) 3. quicksort (linker Teil)-> Problem wurde um ½ verkleinert ! 4. quicksort (rechter Teil) -> Wichtig: Partitionierung Analyse: O(N log N) 732958610

12 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 12 Quicksort Grundidee + Median3 Algorithmus recQuicksort( ↑↓ double[0:n-1] data, ↓ int leftBound, ↓ int rightBound) if (weniger als X Elemente zu sortieren) { insertionSort(data, leftbound, rightbound) } else { double median = medianOf3( ↑↓ data, ↓ leftBound, ↓ rightBound) int pivotIndex = partitionIt( ↑↓ data, ↓ leftBound, ↓ rightBound, ↓ median) quicksort ( ↑↓ data, ↓ leftBound, ↓ pivotIndex - 1) quicksort ( ↑↓ data, ↓ pivotIndex + 1, ↓ rightBound) } 732958610

13 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 13 Quicksort Median von 3 (Sortiert min, max, Median) medianOf3( ↑↓ double[0:n-1] data, ↓ int leftBound, ↓ int rightBound) { int center = (leftBound + rightBound) / 2 // (0) if (data[leftBound] > data[center]) swap( ↑↓ data, ↓ leftBound, ↓ center) if (data[leftBound] > data[rightBound]) swap( ↑↓ data, ↓ leftBound, ↓ rightBound) if (data[center] > data[rightBound]) swap ( ↑↓ data, ↓ center, ↓ rightBound) // (1) put pivot to right, because not needed for partitioning swap ( ↑↓ data, ↓ center, ↓ rightBound-1) //(2) return data[rightBound-1] } 532978610 032958617 0 1 032918657 2 nach Median3: data[rightBound] = max von 3 data[rightBound-1] = median data[leftbound] = min von 3...

14 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 14 Quicksort Partitionierung int partitionIt( ↑↓ double[0:n-1] data, ↓ int leftBound, ↓ int rightBound, ↓ double pivot) { int leftIdx = leftBound +1 ; int rightIdx = rightBound – 2 boolean finished = false while(!finished) { while(data[leftIdx] pivot) rightIdx - - finished = (leftIdx >= rightIdx) if (!finished) { swap( ↑↓ data, ↓ leftIdx, ↓ rightIdx) leftIdx++ rightIdx— } } swap( ↑↓ data, ↓ leftIdx, ↓ rightBound – 1) // data at leftIdx is part of right partition return leftIdx } // leftIdx separated left and right partition 032918657 0

15 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 15 Beispiel an der Tafel 032401865741397 13 Elemente insertionSort ab 3 Elementen 032401895741367 032401895741367 032418957401367 032415987401367 032415687401397 leftIndex = index pivot

16 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 16 1.median3 2.partitionIt(data, 0, n-1, pivot) int partitionIt(double[0:n-1] data, int leftBound,int rightBound,double pivot) { int leftIdx = leftBound +1 int rightIdx = rightBound – 2 boolean finished = false while(!finished) { while(data[leftIdx] pivot) rightIdx - - finished = (leftIdx >= rightIdx) if (!finished) { swap( ↑↓ data, ↓ leftIdx, ↓ rightIdx) leftIdx++ rightIdx— } } swap( ↑↓ data, ↓ leftIdx, ↓ rightBound – 1) return leftIdx } // leftIdx separated left and right partition

17 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 17 Beispiel an der Tafel 13 Elemente 032415687401397 032415687401397 032415 032145 1 Rekursionseben: 6 Elemente /2 = 3 nach medianOf3 und partitionIt 032145 0321 Hier nur linke Partitionen exemplarisch berechnet; entspricht auch der tatsächlichen Ausführung 2. Rekursionsebene: 4 Elemente /2 = 2 nach medianOf3 0312

18 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 18 Übung 10 ad 1) Shellsort ad 2) Vergleich von Zeichenketten (char[] str1, char[] str2) ad 3) Quicksort mit Median3 für Zeichenketten anpassen; X = 10; also unter 10 insertionSort (keine Rekursion)


Herunterladen ppt "Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas."

Ähnliche Präsentationen


Google-Anzeigen