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 Auswahl direktes Einfügen Shellsort Quicksort aus Wirth, Algorithmen und Datenstrukturen, 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

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)

7 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 7 Partitionierung (2) Beispiel n = 9, PivotElement: pos=4, Wert = 5 leftrightpivot leftright 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 > 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

9 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 9 Partitionierung (4) Beispiel – andere Ausgangsdaten 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 MedianVon 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

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)

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) }

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] } 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

15 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 15 Beispiel an der Tafel Elemente insertionSort ab 3 Elementen 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 Rekursionseben: 6 Elemente /2 = 3 nach medianOf3 und partitionIt 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