Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut für Wirtschaftsinformatik- Software Engineering JKU Linz.

Ähnliche Präsentationen


Präsentation zum Thema: "Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut für Wirtschaftsinformatik- Software Engineering JKU Linz."—  Präsentation transkript:

1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut für Wirtschaftsinformatik- Software Engineering JKU Linz

2 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 2 Inhalt Lösung Übung 8 Quicksort-Verfahren Vorbesprechung Übung 10

3 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 3 Partitionierung - Konzept Bedeutet die Aufteilung eines Feldes in einen unteren Teil (z.B. alle Elemente kleiner 436) und einen oberen Teil (alle Elemente größer gleich 436); die Teile können natürlich verschieden groß sein; Partitionierung wird auch als eigenständige Lösung manchmal eingesetzt. z.B.: Mitarbeiter mit EK>x oder EK<=x Partitionierung führt zu keiner Sortierung, auch wenn nachher die Elemente gewissermaßen weniger unsortiert sind als vorher. Der Wert, der die Trennlinie zw. unten und oben darstellt heißt Pivot-Wert.

4 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 4 Partitionierung - Lösungsidee Zwei Indices leftIndex und rightIndex laufen aufeinander zu; wenn unten ein großes und oben ein kleines Element gefunden wurde werden die beiden getauscht; solange bis leftIndex und rightIndex aneinander vorbei laufen. Aus Gründen, die erst später klar werden, wird nicht immer das gesamte Feld partitioniert, sondern der Teil zwischen leftBound und rightBound. Als Rückgabewert soll der Algorithmus den Index des Pivot-Elements liefern. Analyse: Lineare asymptotische Laufzeitkomplexität O(n)

5 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 5 Partitionierung: Verfahren int partitionIt( double[0:n-1] array, int leftBound, int rightBound, double pivot) { int leftIndex = leftBound int rightIndex = rightBound while (true) { while (leftIndex < rightBound && array[leftIndex] < pivot) { leftIndex++} while (rightIndex > leftBound && array[rightIndex] > pivot) { rightIndex-- } if (leftIndex >= rightIndex) {// finsh return leftIndex } else {// swap double temp = array[leftIndex] array[leftIndex] = array[rightIndex] array[rightIndex] = temp leftIndex++ rightIndex-- }

6 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 6 Quicksort - Idee Quicksort ist das schnellste bekannte und vermutlich auch das theoretisch schnellst mögliche Sortierverfahren. Erfunden von C.A.R. Hoare Die Grundidee des Quicksorts besteht darin, das zu sortierende Feld in zwei kleinere zu teilen, diese lassen sich effizienter sortieren. Aufteilen (Partitioning oder Partitionierung) läßt sich in linearer Zeit bewältigen O(n) und fällt daher wenig ins Gewicht. Zusammenmischen ist überflüssig, da die sortierten Teile ein sortiertes Gesamtfeld bilden. Ein nicht zu vernachlässigendes Problem, stellt das Finden eines gut geeigneten Pivot-Wertes dar. Er soll nach Möglichkeit die Menge der Werte etwa in der Hälfte teilen (Median). Es ist sind aber weder die Maximal- und Minimalwerte noch die Verteilung bekannt. Je unterschiedlicher die Größe der Teile ist, desto schlechter wird die Performance des Quicksorts. Daher wird häufig eine Näherung durch Ermittlung des Medians des ersten, letzten und mittleren Elements gewählt. Weitere Steigerung der Performance ist durch Sortierung dieser drei Elemente möglich, da beim Partitionieren einige Bedingungen nicht mehr geprüft werden müssen. Quicksort funktioniert nicht für sehr kleine Felder, daher wird unterhalb einer festen Schranke (ca. 10 Elemente) auf ein einfaches Einfüge-Sortierverfahren umgestellt.

7 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 7 double medianOf3( double[0:n-1] array, int leftBound, int rightBound) { int center = (leftBound + rightBound) / 2 if (array[leftBound] > array[center]) { swap( array, leftBound, center) } if (array[leftBound] > array[rightBound]) { swap( array, leftBound, rightBound) } if (array[center] > array[rightBound]) { swap( array, center, rightBound) } swap( array, center, rightBound-1) //put pivot on right return array[rightBound-1] } swap( double[0:n-1] array, int first, int second) { double temp = array[first] array[first] = array[second] array[second] = temp } Quicksort - Hilfsalgorithmen

8 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 8 int partitionIt( double[0:n-1] array, int leftBound, int rightBound, double pivot) { // pivot value stored at array[rightBound-1] int leftIndex = leftBound + 1 int rightIndex = rightBound - 2 while (true) { while (array[leftIndex] > pivot) {leftIndex++} while (array[rightIndex] < pivot) {rightIndex--} if (leftIndex >= rightIndex) {// finsh break } else {// swap swap( array, leftIndex, rightIndex) leftIndex++ rightIndex-- } swap( array, leftIndex, rightBound-1)// restore pivot value return leftIndex } Quicksort - Partitionierung

9 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 9 recQuickSort( double[0:n-1] array, int leftBound, int rightBound) { int size = rightBound – leftBound + 1 if (size < 10) { insertionSort( array, leftBound, rightBound) } else { double median = medianOf3( array, leftBound, rightBound) int pivotIndex = partitionIt( array, leftBound, rightBound, median) recQuickSort( array, leftBound, pivotIndex-1) recQuickSort( array, pivotIndex+1, rightBound) } Quicksort - Verfahren

10 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 10 Asymtotische Laufzeitkomplexität O(n * log n) Vergleich SortierverfahrenO() –Wert100 Elemente Elemente Einfüge-Sortierenn Shellsortn * (log n) Quicksortn * log n Wenn Quicksort beispielsweise für Elemente 40 Sekunden benötigt, braucht Einfüge-Sortieren dafür etwa 28 Stunden! Quicksort - Analyse


Herunterladen ppt "Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut für Wirtschaftsinformatik- Software Engineering JKU Linz."

Ähnliche Präsentationen


Google-Anzeigen