23.05.2010 Algorithmen und Programmieren II Sortieralgorithmen imperativ Prof. Dr. Margarita Esponda Freie Universität Berlin Prof. Dr. Margarita Esponda 1 23.05.2010 Sortieralgorithmen Bubble-Sort Insert-Sort Selection-Sort Vergleichsalgorithmen Shell-Sort Quicksort Mergesort Heap-Sort Counting-Sort Radix-Sort Bucket-Sort Prof. Dr. Margarita Esponda 2 23.05.2010 Bubble-Sort Einfachster und ältester Sortieralgorithmus • In-Place minimaler zusätzlicher konstanter Speicherplatz O(1) • Stabil die Reihenfolge von gleichen Daten bleibt unverändert • zu naiv und ineffizient für das Sortieren von im Speicher zusammenhängenden Informationen • jedoch eignet er sich für das Sortieren innerhalb verketteter Listen. • quadratischer Aufwand O(n2) Prof. Dr. Margarita Esponda 3 23.05.2010 Bubble-Sort def bubblesort (A): swap = True stop = len(A)-1 while swap: swap = False Hilfsvariable für einen linearen Aufwand, wenn die Daten sortiert sind. for i in range(stop): if A[i]>A[i+1]: A[i], A[i+1] = A[i+1], A[i] swap = True stop = stop-1 Hier wird die Stabilitätseigenschaft des Algorithmus garantiert Prof. Dr. Margarita Esponda 4 23.05.2010 Insertion-Sort Prof. Dr. Margarita Esponda 5 23.05.2010 Insertion-Sort Prof. Dr. Margarita Esponda 6 23.05.2010 Insertion-Sort Prof. Dr. Margarita Esponda 7 23.05.2010 Insertion-Sort <? Prof. Dr. Margarita Esponda 8 23.05.2010 Insertion-Sort Prof. Dr. Margarita Esponda 9 23.05.2010 Insertion-Sort Prof. Dr. Margarita Esponda 10 23.05.2010 Insertion-Sort Prof. Dr. Margarita Esponda 11 23.05.2010 Insertion-Sort Prof. Dr. Margarita Esponda 12 23.05.2010 Insertion-Sort <? Prof. Dr. Margarita Esponda 13 23.05.2010 Insertion-Sort <? Prof. Dr. Margarita Esponda 14 23.05.2010 Insertion-Sort <? Prof. Dr. Margarita Esponda 15 23.05.2010 Insertion-Sort Prof. Dr. Margarita Esponda 16 23.05.2010 Insertion-Sort Prof. Dr. Margarita Esponda 17 23.05.2010 Insertion-Sort <? Prof. Dr. Margarita Esponda 18 23.05.2010 Insertion-Sort <? Prof. Dr. Margarita Esponda 19 23.05.2010 Insertion-Sort Prof. Dr. Margarita Esponda 20 23.05.2010 Insertion-Sort Prof. Dr. Margarita Esponda 21 23.05.2010 Insertion-Sort <? Prof. Dr. Margarita Esponda 22 23.05.2010 Insertion-Sort <? Prof. Dr. Margarita Esponda 23 23.05.2010 Insertion-Sort <? Prof. Dr. Margarita Esponda 24 23.05.2010 Insertion-Sort <? Prof. Dr. Margarita Esponda 25 23.05.2010 Insertion-Sort Prof. Dr. Margarita Esponda 26 23.05.2010 Insertion-Sort Sortierter Bereich Prof. Dr. Margarita Esponda 27 23.05.2010 Insertion-Sort Sortierter Bereich Prof. Dr. Margarita Esponda 28 23.05.2010 Insertion-Sort verschoben Prof. Dr. Margarita Esponda 29 23.05.2010 Insertion-Sort Größer als alle Elemente auf der linken Seite Bester Fall Es ist kein weiterer Vergleich notwendig Prof. Dr. Margarita Esponda 30 23.05.2010 Insertion-Sort Kleiner als alle Elemente der linken Seite Prof. Dr. Margarita Esponda Schlimmster Fall 31 23.05.2010 Insertion-Sort Alle Elemente müssen verschoben werden Prof. Dr. Margarita Esponda 32 23.05.2010 Insertion-Sort Prof. Dr. Margarita Esponda 33 23.05.2010 Insertion-Sort Prof. Dr. Margarita Esponda 34 23.05.2010 Insertion-Sort isort :: [ Integer ] -> [ Integer ] isort [] = [] isort (a:x) = ins a (isort x) ins :: Integer -> [Integer] -> [Integer] ins a [] = [a] ins a (b:y) | a<= b = a:(b:y) | otherwise = b: (ins a y) Das Problem in Haskell ist vor allem der Speicherverbrauch Prof. Dr. Margarita Esponda 35 23.05.2010 Insertion-Sort (imperativ) Einfacher Sortieralgorithmus • In-Place und kein zusätzlicher Speicherbedarf O(1) • Stabil • gut für kleine Mengen oder leicht unsortierte Informationen def insertsort(seq): for j in range(1,len(seq)): key = seq[j] k = j-1; Eine geeignete Position wird gesucht und die Elemente des sortierten Bereichs verschoben while k>=0 and seq[k]>key: seq[k+1] = seq[k] k = k-1 seq[k+1] = key Prof. Dr. Margarita Esponda Die einzusortierende Zahl wird in den gefundenen Platz kopiert 36 23.05.2010 Insertion-Sort Eingabe: n Zahlen n 3 7 9 2 0 1 4 5 6 0 8 2 3 7 5 Berechnungsschritt: Vergleichsoperation Im schlimmsten Fall: T(n) = 1+2+3+...+(n-1) = (n-1)n 2 = ½n2 – ½n 2 = c1⋅n + c2⋅n Prof. Dr. Margarita Esponda 37 23.05.2010 Shellsort Shellsort ist eines der am längsten (1959) bekannten Sortierverfahren. Der Urheber ist Donald .L. Shell. Die Idee des Verfahrens ist es, die Daten als zweidimensionales Feld zu arrangieren und spaltenweise zu sortieren. Nach dieser Grobsortierung werden die Daten als schmaleres zweidimensionales Feld wieder angeordnet und wiederum spaltenweise sortiert. Das Ganze wiederholt sich, bis zum Schluss das Feld nur noch aus einer Spalte besteht. Die Spalten werden alle parallel mit Hilfe des InsertsortAlgorithmus sortiert. Prof. Dr. Margarita Esponda 38 23.05.2010 Shellsort Sei 9 0 2 2 6 3 7 1 9 0 2 6 3 7 4 8 5 6 3 7 die zu sortierende Datenfolge Prof. Dr. Margarita Esponda 39 23.05.2010 Shellsort 9 0 2 2 6 3 7 1 9 0 2 6 3 7 4 8 5 6 3 7 Prof. Dr. Margarita Esponda 40 23.05.2010 Shellsort 9 0 2 2 6 3 7 1 9 0 2 6 3 7 4 8 5 6 3 7 Die Spalten werden sortiert Prof. Dr. Margarita Esponda 41 23.05.2010 Shellsort 9 0 2 2 6 3 7 1 0 0 2 3 3 7 1 9 0 2 6 3 7 4 8 2 2 6 3 7 4 8 5 6 3 7 9 9 5 6 6 7 Prof. Dr. Margarita Esponda 42 23.05.2010 Shellsort 1 0 0 2 3 3 7 4 8 2 2 6 3 7 9 9 5 6 6 7 Prof. Dr. Margarita Esponda 43 23.05.2010 Shellsort 1 0 0 2 3 3 7 4 8 2 2 6 3 7 9 9 5 6 6 7 Die Spalten werden sortiert Prof. Dr. Margarita Esponda 44 23.05.2010 Shellsort 1 0 0 1 0 0 2 3 3 2 2 3 7 4 8 2 3 6 2 2 6 3 4 6 3 7 9 6 5 8 9 5 6 7 7 9 6 7 6 7 Prof. Dr. Margarita Esponda 45 23.05.2010 Shellsort magic = [1391376, 463792, 198768, 86961, 33936, 13776, 4592, 1968, 861, 336, 112, 48, 21, 7, 3, 1] def shellsort (A): SIZE = len(A) for k in range(len(magic)): Aus Erfahrung entwickelte Folge für die PseudoSegmentierung h = magic[k] for i in range(h, SIZE): Hier wird das Prinzip des InsertionsortAlgorithmus verwendet j=i temp = A[j] while j>=h and A[j-h]>temp: A[j] = A[j-h] j = j-h A[j] = temp Prof. Dr. Margarita Esponda 46 23.05.2010 Shellsort Wenn die Feldbreiten geschickt gewählt werden, reichen jedes mal wenige Sortierschritte aus, um die Daten spaltenweise zu sortieren. Es gibt noch kein mathematisches Modell, um für beliebige Datenmengen zu entscheiden, welche die optimale Segmentierungssequenz ist. Eigenschaften: • nicht stabil • die Komplexität hängt von der Segmentierung ab • Mersenne-Zahlen Prof. Dr. Margarita Esponda 1, 3, 15,…,2k-1 O(n1,5) 47 23.05.2010 Teile und Herrsche "Divide und Conquer" Viele Probleme lassen sich nicht mit trivialen Schleifen lösen und haben gleichzeitig den Vorteil, dass eine rekursive Lösung keine überflüssigen Berechnungen verursacht. Solche Probleme lassen sich in Teilprobleme zerlegen, deren Lösung keine überlappenden Berechnungen beinhalten. Lösungsschema: Divide: Teile ein Problem in zwei oder mehrere kleinere ähnliche Teilprobleme, die (rekursiv) isoliert behandelt werden können. Conquer: Löse die Teilprobleme auf dieselbe Art (rekursiv). Merge: Füge die Teillösung zur Gesamtlösung zusammen. Prof. Dr. Margarita Esponda 48 23.05.2010 Mergesort-Algorithmus 3 7 0 4 9 8 1 6 5 7 0 7 0 4 9 8 3 7 0 4 9 8 1 6 3 7 0 4 3 7 3 7 3 7 4 0 4 9 8 1 6 9 1 8 8 9 0 3 4 7 0 1 5 7 0 7 9 8 1 6 0 4 0 5 7 0 7 0 4 9 8 3 4 0 Prof. Dr. Margarita Esponda 6 7 8 9 0 0 1 6 1 6 1 6 8 9 3 4 5 7 5 0 4 9 8 0 7 7 0 5 7 0 4 7 0 7 0 5 7 0 0 4 0 4 7 0 4 5 7 4 5 6 7 7 9 8 9 8 8 9 0 4 8 9 7 8 9 7 8 8 9 9 49 23.05.2010 Merge-Algorithmus n 0 1 3 4 6 7 8 9 ≥ 0 0 4 5 7 7 8 9 Prof. Dr. Margarita Esponda 50 23.05.2010 Merge-Algorithmus 0 1 3 4 6 7 8 ≥ 0 0 4 5 7 9 7 8 9 Prof. Dr. Margarita Esponda 51 23.05.2010 Merge-Algorithmus 0 1 3 4 6 7 8 ≥ 0 0 4 5 7 Prof. Dr. Margarita Esponda 9 9 7 8 52 23.05.2010 Merge-Algorithmus 0 1 3 4 6 7 ≥ 0 0 4 5 7 Prof. Dr. Margarita Esponda 8 9 9 7 8 53 23.05.2010 Merge-Algorithmus 0 ≥ 1 3 4 4 5 6 7 7 7 8 8 9 9 0 0 Prof. Dr. Margarita Esponda 54 23.05.2010 Merge-Algorithmus 0 1 3 4 4 5 6 7 7 7 8 8 9 9 0 0 Wir hatten ursprünglich zwei sortierte Mengen mit Länge n. Nach jedem Vergleich wird eine Zahl sortiert, d.h. im schlimmsten Fall haben wir 2n Vergleiche. T(n) = 2n = Prof. Dr. Margarita Esponda O(n) 55 23.05.2010 Merge-Sort-Algorithmus teile 3 7 0 4 9 8 1 6 5 7 0 7 0 4 9 8 teile 3 7 0 4 9 8 1 6 3 7 0 4 teile teile teile merge merge 3 7 3 7 9 8 1 6 0 4 0 3 7 4 0 4 0 1 merge 1 6 9 1 8 0 1 6 6 7 8 9 0 0 1 5 7 6 1 6 8 9 3 4 5 7 0 7 9 8 8 9 0 3 4 7 merge 5 7 0 7 0 4 9 8 3 4 5 0 7 7 0 5 7 7 0 4 9 8 0 9 0 7 0 5 7 0 7 0 4 5 7 4 5 6 7 7 lg n 0 4 9 8 4 0 4 8 8 9 0 4 8 9 lg n 7 8 9 7 8 8 9 9 n Vergleiche Prof. Dr. Margarita Esponda 56 23.05.2010 Mergesort-Algorithmus Eine Teilung kostet c1 Ein Vergleich kostet c2 T(n) = c1(n-1) + c2n⋅log(n) Teiloperationen T(n) = Prof. Dr. Margarita Esponda Vergleiche O( n⋅log(n) ) 57 23.05.2010 Merge-Sort-Algorithmus merge [Int] -> [Int] -> [Int] merge [] ys = ys merge xs [] = xs merge (x:xs) (y:ys) = if x <= y then x: (merge xs (y:ys)) else Prof. Dr. Margarita Esponda y: (merge (x:xs) ys) 58 23.05.2010 Merge-Sort-Algorithmus mergesortStart [ ] = mergesort 0 [ ] mergesortStart xs = mergesort (length xs) xs mergesort _ [] = [] mergesort _ [x] = [x] mergesort _ [x,y] = if x <= y then [x,y] else [y,x] mergesort len xs=merge(mergesort h (take h xs)) (mergesort (len-h) (drop h xs)) where h = len `div` 2 Prof. Dr. Margarita Esponda 59 23.05.2010 Merge-Algorithmus def mergesort(A): if len(A) < 2: return A else: m = len(A) // 2 return merge( mergesort(A[:m]), mergesort(A[m:]) ) def merge(low, high): res = [] i, j = 0, 0 while i<len(low) and j<len(high): if low[i] <= high[j]: res.append(low[i]) i = i+1 else: res.append(high[j]) j = j+1 res = res + low[i:] res = res + high[j:] return res Prof. Dr. Margarita Esponda 60 23.05.2010 Merge-Algorithmus Eigenschaften: • stabiler Algorithmus • 1945 von John von Neumann entwickelt • Komplexität O(n.log(n)) • das Verfahren arbeitet bei Arrays nicht in-place. Speicherverbrauch O(n) • sehr einfache Implementierung mit verketteten Listen. Prof. Dr. Margarita Esponda 61 23.05.2010 Quick-Sort-Algorithmus Der Quicksort-Algorithmus (1962 von Hoare entwickelt) ist einer der beliebtesten Sortieralgorithmen, weil er sehr effizient und einfach zu implementieren ist. Grundidee: 1) Ein Element (Pivot) aus dem Array wird gewählt 2) Alle Zahlen des Arrays werden mit dem Pivot-Element verglichen und während des Vergleichsdurchlaufs in zwei Bereiche umorganisiert (Partitionierung). Der erste Bereich beinhaltet die Zahlen, die kleiner als das Pivot-Element sind und der zweite alle, die größer oder gleich sind. Am Ende des Durchlaufs wird das Pivot-Element in der Mitte beider Bereiche positioniert. 3) Nach jeder Partitionierung wird der Quicksort-Algorithmus rekursiv mit beiden Teilbereichen ausgeführt (solange die Teilbereiche mehr als ein Element beinhalten). Prof. Dr. Margarita Esponda 62 23.05.2010 Quick-Sort-Algorithmus Vergleiche n 5 7 3 4 9 1 6 5 9 2 0 4 8 3 6 < ≥ 3 4 1 2 0 4 3 < 0 3 ≥ 1 2 3 5 ≥ < 3 < 4 4 3 4 4 5 Der Quicksort-Algorithmus funktioniert am besten, wenn die Teilbereiche fast gleichgroß sind. Prof. Dr. Margarita Esponda 7 ≥ 6 log n ≥ 6 6 5 < 5 n 7 9 6 5 9 8 6 ≥ 1 2 0 < 5 6 ≥ < 7 n 9 9 8 8 9 9 n im besten Fall! T(n) = n⋅⋅log n 63 23.05.2010 Quicksort-Algorithmus 0 1 2 3 4 5 6 7 8 "worst case" 0 1 2 3 4 5 6 7 8 1 Im schlimmsten Fall! sind alle Elemente bereits sortiert. 2 3 4 5 6 7 8 2 3 4 5 6 7 8 O( n2 ) 3 4 5 6 7 8 Anzahl der Vergleiche 4 5 6 7 8 T( n ) = 1 + 2 + . . . + n 5 6 7 8 2 T( n ) = c1n + c2n 6 T(n) ist eine quadratische Funktion Prof. Dr. Margarita Esponda 7 8 7 8 64 23.05.2010 Quicksort-Algorithmus Haskell quicksort :: [Integer] -> [Integer] quicksort [] = [] quicksort (x:xs) = quicksort [ y | y <- xs, y <= x ] ++ [x] ++ quicksort [ y | y <- xs, y > x ] Das Problem in Haskell ist der Speicherverbrauch und die Komplexität der Verkettungsfunktion (++). Prof. Dr. Margarita Esponda 65 23.05.2010 Quicksort-Algorithmus imperativ Rekursive Implementierung def quicksort (A, low, high ): if low<high: m = partition(A, low, high ) quicksort ( A, low, m-1 ) quicksort ( A, m+1, high ) Prof. Dr. Margarita Esponda 66 23.05.2010 Quicksort -Algorithmus Sortieren am Ort low A 5 high 7 3 4 9 1 6 5 9 2 0 4 8 3 6 def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 67 23.05.2010 Quicksort -Algorithmus low A high 5 7 3 4 9 1 6 5 9 2 0 4 8 3 6 pivot def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 68 23.05.2010 Quicksort -Algorithmus i high low 5 7 3 4 9 1 6 5 9 2 0 4 8 3 6 pivot def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 69 23.05.2010 Quicksort -Algorithmus i j high low 5 7 3 4 9 1 6 5 9 2 0 4 8 3 6 pivot def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 70 23.05.2010 Quicksort -Algorithmus i j high low 5 7 3 4 9 1 6 5 9 2 0 4 8 3 6 < def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 71 23.05.2010 Quicksort -Algorithmus i j high low 5 7 3 4 9 1 6 5 9 2 0 4 8 3 6 def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 72 23.05.2010 Quicksort -Algorithmus i j high low 5 7 3 4 9 1 6 5 9 2 0 4 8 3 6 < def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 73 23.05.2010 Quicksort -Algorithmus i j high low 5 7 3 4 9 1 6 5 9 2 0 4 8 3 6 def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 74 23.05.2010 Quicksort -Algorithmus i j high 5 3 7 4 9 1 6 5 9 2 0 4 8 3 6 low vertauscht def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 75 23.05.2010 Quicksort -Algorithmus i j high low 5 3 7 4 9 1 6 5 9 2 0 4 8 3 6 < def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 76 23.05.2010 Quicksort -Algorithmus i j high low 5 3 7 4 9 1 6 5 9 2 0 4 8 3 6 def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 77 23.05.2010 Quicksort -Algorithmus i j high low 5 3 4 7 9 1 6 5 9 2 0 4 8 3 6 vertauscht def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 78 23.05.2010 Quicksort -Algorithmus i j high low 5 3 4 7 9 1 6 5 9 2 0 4 8 3 6 < def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 79 23.05.2010 Quicksort -Algorithmus i j high low 5 3 4 7 9 1 6 5 9 2 0 4 8 3 6 < def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 80 23.05.2010 Quicksort -Algorithmus i j high low 5 3 4 7 9 1 6 5 9 2 0 4 8 3 6 def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 81 23.05.2010 Quicksort -Algorithmus i j high low 5 3 4 1 9 7 6 5 9 2 0 4 8 3 6 def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 82 23.05.2010 Quicksort -Algorithmus i j high low 5 3 4 1 9 7 6 5 9 2 0 4 8 3 6 < def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 83 23.05.2010 Quicksort -Algorithmus i j high low 5 3 4 1 9 7 6 5 9 2 0 4 8 3 6 < def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 84 23.05.2010 Quicksort -Algorithmus i j high low 5 3 4 1 9 7 6 5 9 2 0 4 8 3 6 < def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 85 23.05.2010 Quicksort -Algorithmus i j high low 5 3 4 1 9 7 6 5 9 2 0 4 8 3 6 < def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 86 23.05.2010 Quicksort -Algorithmus i j high low 5 3 4 1 9 7 6 5 9 2 0 4 8 3 6 def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 87 23.05.2010 Quicksort -Algorithmus i j high low 5 3 4 1 2 7 6 5 9 9 0 4 8 3 6 def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 88 23.05.2010 Quicksort -Algorithmus i j high low 5 3 4 1 2 7 6 5 9 9 0 4 8 3 6 < def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 89 23.05.2010 Quicksort -Algorithmus i j high low 5 3 4 1 2 7 6 5 9 9 0 4 8 3 6 def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 90 23.05.2010 Quicksort -Algorithmus i j high low 5 3 4 1 2 0 6 5 9 9 7 4 8 3 6 def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 91 23.05.2010 Quicksort -Algorithmus i j high low 5 3 4 1 2 0 6 5 9 9 7 4 8 3 6 < def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 92 23.05.2010 Quicksort -Algorithmus i j high low 5 3 4 1 2 0 6 5 9 9 7 4 8 3 6 def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 93 23.05.2010 Quicksort -Algorithmus i j high low 5 3 4 1 2 0 4 5 9 9 7 6 8 3 6 def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 94 23.05.2010 Quicksort -Algorithmus i j high low 5 3 4 1 2 0 4 5 9 9 7 6 8 3 6 < def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 95 23.05.2010 Quicksort -Algorithmus i j high low 5 3 4 1 2 0 4 5 9 9 7 6 8 3 6 < def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 96 23.05.2010 Quicksort -Algorithmus i j high low 5 3 4 1 2 0 4 5 9 9 7 6 8 3 6 def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 97 23.05.2010 Quicksort -Algorithmus i j high low 5 3 4 1 2 0 4 3 9 9 7 6 8 5 6 def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 98 23.05.2010 Quicksort -Algorithmus i j high low 5 3 4 1 2 0 4 3 9 9 7 6 8 5 6 def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 99 23.05.2010 Quicksort -Algorithmus i j high low 5 3 4 1 2 0 4 3 9 9 7 6 8 5 6 def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 100 23.05.2010 Quicksort -Algorithmus i j high low 3 3 4 1 2 0 4 5 9 9 7 6 8 5 6 def partition( A, low, high ): pivot = A[low] i = low for j in range(low+1,high+1): if ( A[j] < pivot ): i=i+1 A[i], A[j] = A[j], A[i] A[i], A[low] = A[low], A[i] return i Prof. Dr. Margarita Esponda 101 23.05.2010 Quicksort -Algorithmus i low high 3 3 4 1 2 0 4 5 9 9 7 6 8 5 6 <5 Prof. Dr. Margarita Esponda >= 5 102 23.05.2010 Quicksort -Algorithmus m m-1 low m+1 high 3 3 4 1 2 0 4 5 9 9 7 6 8 5 6 quicksort quicksort Dann wird quicksort zweimal rekursiv aufgerufen. def quicksort (A, low, high ): if low<high: m = partition(A, low, high ) quicksort ( A, low, m-1 ) quicksort ( A, m+1, high ) Prof. Dr. Margarita Esponda 103 23.05.2010 Sortieralgorithmen Bubblesort O(n2) Insertsort O(n2) quadratisch VergleichsAlgorithmen n log n linear Prof. Dr. Margarita Esponda Mergesort O( n⋅log(n) ) Quicksort O( n⋅log(n) ) Heapsort O( n⋅log(n) ) Countingsort O(n) Radixsort O(n) Bucketsort O(n) Durchschnittsfall am nächsten Dienstag!! 104