Sortieralgorithmen - Userpage

Werbung
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
Herunterladen