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

Slides:



Advertisements
Ähnliche Präsentationen
Algorithmen und Datenstrukturen
Advertisements

Sortieren I - Bubblesort -
Kapitel 6: Klassifizierung von Sortiertechniken
Kapitel 7. Sortier-Algorithmen
Kapitel 6. Suchverfahren
5. Sortier-Algorithmen Vorbemerkungen:
Sortierverfahren Richard Göbel.
Sortierverfahren Richard Göbel.
Felder sortieren. Aufgabe: Die Zahlen eines Feldes sollen der Größe (zuerst die kleinste Zahl) nach sortiert werden.
WS 03/04 Algorithmentheorie 03 - Randomisierung Prof. Dr. S. Albers Prof. Dr. Th. Ottmann.
Algorithmen und Datenstrukturen
Algorithmen und Datenstrukturen
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (08 - Einfache Sortierverfahren) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (10 - Suchverfahren) T. Lauer.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
Algorithmen und Datenstrukturen
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 9 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 4 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
WS 06/07 Algorithmentheorie 01 - Einleitung Prof. Dr. Th. Ottmann Tobias Lauer.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (09 - Weitere Sortierverfahren) Prof. Th. Ottmann.
Algorithmen und Datenstrukturen
Vortrag: Ingo Gensch, Mathias Reich am:
C++ LEDA SWP SS 08Herresthal & Schepers1 Softwarepraktikum C++ LEDA Parallelisierung - Partitionierung - Zusammenführung
Rekursion mit Listen: Quicksort
4 Sortierverfahren 4.1 Einführung 4.2 Naive Sortierverfahren
Sortieralgorithmen Sortieren von Arrays.
Sortieren und Suchen IFB 2002 Daniel Jonietz.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Geoinformation II Vorlesung 7 SS 2000 Punkt-in-Polygon-Verfahren I (Trapezkarte)
Effiziente Algorithmen
Black Box Algorithmen Hartmut Klauck Universität Frankfurt SS
Einführung in die Programmierung
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut für Wirtschaftsinformatik- Software Engineering JKU Linz.
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
Christian Mansky Design - Fallstudien Christian Mansky
Algorithmen und Datenstrukturen Übungsmodul 10
Algorithmen und Datenstrukturen SS 2005
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen 1 SS 2007 Dr. W. Narzt u. Dr. A. Stritzinger Institut.
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
Algorithmen und Datenstrukturen Übungsmodul 8
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Thomas Hilpold: Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger.
Algorithmen und Datenstrukturen SS 2005
Algorithmen und Datenstrukturen Übungsmodul 1
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen Übungsmodul 2 Dr. W. Narzt u. Dr. A. Stritzinger.
SWE1 / Übung 10 ( ) Rekursion Binärbäume.
Programmieren in C Sortieren, Suchen
Sortieralgorithmen Greedy Sortieren: Sortieren durch Auswahl, Einfügen und Austauschen Divide-and-Conquer-Sortieren: Quicksort und merge sort Foliensatz.
Algorithmen und Datenstrukturen 1 SS 2002
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Programmierpraktikum Java SS 2005 Mag.Thomas Hilpold.
Algorithmen und Datenstrukturen 1 SS 2002
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Algorithmen und Datenstrukturen 1 SS 2002
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Rekursion-
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen 1 SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
M a r c – o l i v e r p a h l Informatik II – Kapitel 12 „Sortier-Algorithmen“ Zusammenfassung des Kapitel 12 Küchlin, Weber, Einführung in die Informatik,
Algorithmen und Datenstrukturen
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Programmierpraktikum Java SS 2005 Mag.Thomas Hilpold.
InsertionSort Einfügen eines Elements an der richtigen Stelle eines bereits sortierten Arrays. Verschiebungen von Elementen statt Vertauschungen Element.
Suchen und Sortieren.
Algorithmen und Datenstrukturen
Algorithmen und Datenstrukturen
Algorithmen und Datenstrukturen
 Präsentation transkript:

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

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

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

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

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

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)

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

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

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

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

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)

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

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...

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

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

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

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

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)