You are on page 1of 18

Quick-Sort

7 4 9 6 2  2 4 6 7 9

4 2  2 4 7 9  7 9

22 99

Οι διαφάνειες είναι βασισμένες στο βιβλίο "Data Structures and Algorithms in C++" των Michael T. Goodrich, Roberto Tamassia και David M. Mount

Quick-Sort 1
Outline
Quick-sort (§10.3)
 Αλγόριθμος
 Βήμα διαχωρισμού
 Δένδρο Quick-sort
 Παράδειγμα εκτέλεσης
Ανάλυση του quick-sort (§10.3.1)
In-place quick-sort (§10.3.1)
Περίληψη αλγορίθμων ταξινόμησης

Quick-Sort 2
Quick-Sort
Ο Quick-sort είναι ένας
randomized αλγόριθμος
ταξινόμησης βασισμένος x
στο πρότυπο «διαίρει και
βασίλευε»:
 Divide: διάλεξε ένα τυχαίο
στοιχείο x (που καλείται
pivot) και χώρισε το S σε x
 L στοιχεία μικρότερα του x
 E στοιχεία ίσα με x L E G
 G στοιχεία μεγαλύτερα του
x
 Recur: ταξινόμησε τα L και
G
 Conquer: ένωσε τα L, E και x
G

Quick-Sort 3
Διαχωρισμός
Διαχωρίζουμε μια αλγόριθμος partition(S, p)
ακολουθία εισόδου ως εξής: Είσοδος ακολουθία S, θέση p του
 Αφαιρούμε, κατά σειρά,
pivot
κάθε στοιχείο y από το S Έξοδος υποακολουθίες L, E, G των
και
 Εισάγουμε το y στο L, E ή
στοιχείων του S που είναι μικρότερα,
G, ανάλογα με το ίσα, ή μεγαλύτερα από το pivot.
αποτέλεσμα της σύγκρισης L, E, G  κενές ακολουθίες
με το pivot x x  S.remove(p)
Κάθε εισαγωγή και while S.isEmpty()
αφαίρεση γίνεται στην y  S.remove(S.first())
αρχή ή στο τέλος μιας
ακολουθίας, και έτσι if y < x
χρειάζεται χρόνο O(1) L.insertLast(y)
Έτσι, το βήμα διαχωρισμού else if y = x
του quick-sort χρειάζεται E.insertLast(y)
χρόνο O(n) else { y > x }
G.insertLast(y)
Quick-Sort
return L, E, G 4
Δένδρο Quick-Sort
Μια εκτέλεση του quick-sort απεικονίζεται από ένα δυαδικό
δένδρο
 Κάθε κόμβος αναπαριστά μια αναδρομική κλήση του quick-sort και
αποθηκεύει
 Μη ταξινομημένη ακολουθία πριν την εκτέλεση και τον pivot αυτής
 Ταξινομημένη ακολουθία στο τέλος της εκτέλεσης
 Η ρίζα είναι η αρχική κλήση
 Τα φύλλα είναι κλήσεις σε υποακολουθίες μεγέθους 0 ή 1

7 4 9 6 2  2 4 6 7 9

4 2  2 4 7 9  7 9

22 99
Quick-Sort 5
Παράδειγμα εκτέλεσης
Επιλογή Pivot
7 2 9 43 7 6 1  1 2 3 4 6 7 8 9

7 2 9 4  2 4 7 9 3 8 6 1  1 3 8 6

22 9 4  4 9 33 88

99 44

Quick-Sort 6
Παράδειγμα εκτέλεσης (συνέχεια)
Διαχωρισμός, αναδρομική κλήση, επιλογή pivot

7 2 9 4 3 7 6 1 1 2 3 4 6 7 8 9

2 4 3 1 2 4 7 9 3 8 6 1  1 3 8 6

22 9 4  4 9 33 88

99 44

Quick-Sort 7
Παράδειγμα εκτέλεσης (συνέχεια)
Διαχωρισμός, αναδρομική κλήση, βασική περίπτωση

7 2 9 43 7 6 1 1 2 3 4 6 7 8 9

2 4 3 1  2 4 7 3 8 6 1  1 3 8 6

11 9 4  4 9 33 88

99 44

Quick-Sort 8
Παράδειγμα εκτέλεσης (συνέχεια)
Αναδρομική κλήση, …, βασική περίπτωση, συνένωση

7 2 9 43 7 6 1 1 2 3 4 6 7 8 9

2 4 3 1  1 2 3 4 3 8 6 1  1 3 8 6

11 4 3  3 4 33 88

99 44

Quick-Sort 9
Παράδειγμα εκτέλεσης (συνέχεια)
Αναδρομική κλήση, επιλογή pivot
7 2 9 43 7 6 1 1 2 3 4 6 7 8 9

2 4 3 1  1 2 3 4 7 9 7 1  1 3 8 6

11 4 3  3 4 88 99

99 44

Quick-Sort 10
Παράδειγμα εκτέλεσης (συνέχεια)
Διαχωρισμός, …, αναδρομική κλήση, βασική
περίπτωση
7 2 9 43 7 6 1 1 2 3 4 6 7 8 9

2 4 3 1  1 2 3 4 7 9 7 1  1 3 8 6

11 4 3  3 4 88 99

99 44

Quick-Sort 11
Παράδειγμα εκτέλεσης (συνέχεια)
Συνένωση, συνένωση
7 2 9 4 3 7 6 1 1 2 3 4 6 7 7 9

2 4 3 1  1 2 3 4 7 9 7  17 7 9

11 4 3  3 4 88 99

99 44

Quick-Sort 12
Χρόνος Εκτέλεσης Χειρότερης
Περίπτωσης
Η χειρότερη περίπτωση για τον quick-sort συμβαίνει όταν το pivot
είναι το μοναδικό ελάχιστο ή μέγιστο στοιχείο
Ένα από τα L και G έχει μέγεθος n 1 και το άλλο 0
Ο χρόνος εκτέλεσης είναι ανάλογος με το άθροισμα
n  (n  1) …  2 
Έτσι, ο χρόνος εκτέλεσης χειρότερης περίπτωσης είναι O(n2)
βάθος χρόνος
0 n

1 n1

… …

n1 1
Quick-Sort 13
Αναμενόμενος Χρόνος Εκτέλεσης

7 2 9 43 7 6 19 7 2 9 43 7 6 1

2 4 3 1 7 9 7 1  1 1 7294376

Good call Bad call

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Κακοί pivots Καλοί pivots Κακοί pivots

Quick-Sort 14
Αναμενόμενος Χρόνος Εκτέλεσης,
Μέρος 2
Πιθανοτικό γεγονός: ο αναμενόμενος αριθμός ρίψεων νομίσματος
που απαιτείται για να έρθουν k κορώνες είναι 2k
Για έναν κόμβο βάθους i, περιμένουμε ότι
 Οι i2 πρόγονοι είναι καλές κλήσεις
 Το μέγεθος της ακολουθίας εισόδου για την παρούσα κλήση είναι το
πολύ (34)i2n expected height time per level
s(r) O(n)
Άρα έχουμε
 Για έναν κόμβο βάθους 2log43n, το
αναμενόμενο μέγεθος εισόδου είναι s(a) s(b) O(n)
ένα
 Το αναμενόμενο ύψος του δένδρου O(log n)
quick-sort tree είναι O(log n) s(c) s(d) s(e) s(f) O(n)
Το ποσό της εργασίας που γίνεται στους
κόμβους ίδιου βάθους είναι O(n)
Έτσι ο αναμενόμενος χρόνος εκτέλεσης
είναι O(n log n)
total expected time: O(n log n)

Quick-Sort 15
In-Place Quick-Sort
Ο Quick-sort μπορεί να υλοποιηθεί
για να τρέχει in-place
Στο βήμα διαχωρισμού, Αλγόριθμος inPlaceQuickSort(S, l, r)
χρησιμοποιούμε πράξεις
αντικατάστασης για να Είσοδος ακολουθία S, βαθμοί l και r
αναδιατάξουμε τα στοιχεία της Έξοδος ακολουθία S με στοιχεία
ακολουθίας εισόδου έτσι ώστε βαθμού ανάμεσα σε l και r
 Τα στοιχεία μικρότερα του pivot αναδιατεταγμένα σε αύξουσα σειρά
έχουν βαθμό μικρότερο του h
 Τα στοιχεία που είναι ίσα με το
if l  r
pivot έχουν βαθμό ανάμεσα σε h return
και k
i  a rκαιom integer between l και r
 Τα στοιχεία μεγαλύτερα του pivot
έχουν βαθμό μεγαλύτερο από k x  S.elemAtRank(i)
Οι αναδρομικές κλήσεις λαμβάνουν (h, k)  inPlacePartition(x)
υπόψη inPlaceQuickSort(S, l, h  1)
 Στοιχεία με με βαθμό μικρότερο
από h inPlaceQuickSort(S, k  1, r)
 Στοιχεία με βαθμό μεγαλύτερο από
k

Quick-Sort 16
In-Place Διαχωρισμός
Εκτέλεσε το διαχωρισμό με 2 δείκτες για να χωρίσεις το S
σε L και EG (μια παρόμοια μέθοδος μπορεί να χωρίσει το
EG σε
j E και G). k
3 2 5 1 0 7 3 5 9 2 7 9 8 9 7 6 9 (pivot = 6)

Επανάλαβε μέχρι τα j και k να διασταυρωθούν:


 Διάτρεξε το j δεξιά μέχρι να βρεις στοιχείο > x.
 Διάτρεξε το k αριστερά μέχρι να βρεις στοιχείο < x.
 Άλλαξε τις θέσεις των στοιχείων που δείχνουν οι j και k
j k
3 2 5 1 0 7 3 5 9 2 7 9 8 9 7 6 9

Quick-Sort 17
Περίληψη Αλγορίθμων Ταξινόμησης
Αλγόριθμος Χρόνος Παρατηρήσεις
in-place
selection-sort O(n2) αργός (καλός για μικρές
εισόδους)
in-place
insertion-sort O(n2) αργός (καλός για μικρές
εισόδους)
in-place, randomized
O(n log n)
quick-sort ταχύτατος (καλός για μεγάλες
expected εισόδους)
in-place
heap-sort O(n log n) ταχύς (καλός για μεγάλες
εισόδους)
σειριακή πρόσβαση
δεδομένων
merge-sort O(n log n) ταχύς (καλός για πολύ μεγάλες
Quick-Sort εισόδους) 18

You might also like