Professional Documents
Culture Documents
4 QuickSort
4 QuickSort
7 4 9 6 2 2 4 6 7 9
4 2 2 4 7 9 7 9
22 99
Οι διαφάνειες είναι βασισμένες στο βιβλίο "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
22 99
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
99 44
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
99 44
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
99 44
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
99 44
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
99 44
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
99 44
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
99 44
Quick-Sort 12
Χρόνος Εκτέλεσης Χειρότερης
Περίπτωσης
Η χειρότερη περίπτωση για τον quick-sort συμβαίνει όταν το pivot
είναι το μοναδικό ελάχιστο ή μέγιστο στοιχείο
Ένα από τα L και G έχει μέγεθος n 1 και το άλλο 0
Ο χρόνος εκτέλεσης είναι ανάλογος με το άθροισμα
n (n 1) … 2
Έτσι, ο χρόνος εκτέλεσης χειρότερης περίπτωσης είναι O(n2)
βάθος χρόνος
0 n
1 n1
…
… …
n1 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Quick-Sort 14
Αναμενόμενος Χρόνος Εκτέλεσης,
Μέρος 2
Πιθανοτικό γεγονός: ο αναμενόμενος αριθμός ρίψεων νομίσματος
που απαιτείται για να έρθουν k κορώνες είναι 2k
Για έναν κόμβο βάθους i, περιμένουμε ότι
Οι i2 πρόγονοι είναι καλές κλήσεις
Το μέγεθος της ακολουθίας εισόδου για την παρούσα κλήση είναι το
πολύ (34)i2n expected height time per level
s(r) O(n)
Άρα έχουμε
Για έναν κόμβο βάθους 2log43n, το
αναμενόμενο μέγεθος εισόδου είναι 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 και EG (μια παρόμοια μέθοδος μπορεί να χωρίσει το
EG σε
j E και G). k
3 2 5 1 0 7 3 5 9 2 7 9 8 9 7 6 9 (pivot = 6)
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