Δομές Δεδομένων και Αλγόριθμοι

Σχετικά έγγραφα
Quicksort. Πρόβλημα Ταξινόμησης. Μέθοδοι Ταξινόμησης. Συγκριτικοί Αλγόριθμοι

Quicksort [Hoare, 62] Αλγόριθµοι & Πολυπλοκότητα (Χειµώνας 2011) Quicksort 1

Quicksort. Επιμέλεια διαφανειών: Δ. Φωτάκης Μικροαλλαγές: Α. Παγουρτζής. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

Επιλογή. Επιμέλεια διαφανειών: Δ. Φωτάκης. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών. Εθνικό Μετσόβιο Πολυτεχνείο

Quicksort. ημήτρης Φωτάκης. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών. Εθνικό Μετσόβιο Πολυτεχνείο

Quicksort. ιδάσκοντες: Σ. Ζάχος,. Φωτάκης Επιμέλεια διαφανειών:. Φωτάκης. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

Δομές Δεδομένων & Αλγόριθμοι

Δομές Δεδομένων & Αλγόριθμοι

Διδάσκων: Παναγιώτης Ανδρέου

Ερώτημα Α 1. Να γράψετε τις εντολές που πραγματοποιούν τα ακόλουθα:

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ταξινόµηση Quicksort Κεφάλαιο 7. Ε. Μαρκάκης Επίκουρος Καθηγητής

Δομές Δεδομένων και Αλγόριθμοι

Πρόβληµα Επιλογής. Αλγόριθµοι & Πολυπλοκότητα (Χειµώνας 2011) Επιλογή 1

Επιλογή. ημήτρης Φωτάκης. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών. Εθνικό Μετσόβιο Πολυτεχνείο

Δομές Δεδομένων και Αλγόριθμοι

Αλγόριθμοι Ταξινόμησης Μέρος 2

ιαίρει-και-βασίλευε ημήτρης Φωτάκης Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο

Επιλογή. Πρόβλημα Επιλογής. Μέγιστο / Ελάχιστο. Εφαρμογές

Προχωρημένες έννοιες προγραμματισμού σε C

Επιλογή. ιδάσκοντες: Σ. Ζάχος,. Φωτάκης Επιμέλεια διαφανειών:. Φωτάκης. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

Σχεδίαση & Ανάλυση Αλγορίθμων

Αλγόριθμοι ταξινόμησης

Δομές Δεδομένων & Αλγόριθμοι

#2. Templates, η βιβλιοθήκη STL, μέτρηση χρόνου εκτέλεσης κώδικα, αλγόριθμοι ταξινόμησης, αλγόριθμοι αναζήτησης

Δοµές Δεδοµένων. 11η Διάλεξη Ταξινόµηση Quicksort και Ιδιότητες Δέντρων. Ε. Μαρκάκης

Αλγόριθµοι και Πολυπλοκότητα

8. Σωροί (Heaps)-Αναδρομή- Προχωρημένη Ταξινόμηση

Διάλεξη 10: Αλγόριθμοι Ταξινόμησης II

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Ταξινόμηση. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Ταξινόμηση. Παύλος Εφραιμίδης. Δομές Δεδομένων Ταξινόμηση 1

Αλγόριθμοι Ταξινόμησης Μέρος 1

Διαίρει-και-Βασίλευε. Αλγόριθµοι & Πολυπλοκότητα (Χειµώνας 2011) Διαίρει-και-Βασίλευε 2

Ταξινόμηση κάδου και ταξινόμηση Ρίζας Bucket-Sort και Radix-Sort

Merge Sort (Ταξινόμηση με συγχώνευση) 6/14/2007 3:04 AM Merge Sort 1

Δομές Δεδομένων και Αλγόριθμοι

auth Αλγόριθμοι - Τμήμα Πληροφορικής ΑΠΘ - Εξάμηνο 4ο

Πληροφορική 2. Αλγόριθμοι

ΠΛΗ111. Ανοιξη Μάθηµα 9 ο. Ταξινόµηση. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Σχεδίαση και Ανάλυση Αλγορίθμων

Σχεδίαση Αλγορίθμων -Τμήμα Πληροφορικής ΑΠΘ - Εξάμηνο 4ο

Δομές Δεδομένων και Αλγόριθμοι

Διαίρει-και-Βασίλευε. Διαίρει-και-Βασίλευε. MergeSort. MergeSort. Πρόβλημα Ταξινόμησης: Είσοδος : ακολουθία n αριθμών (α 1

Ταξινόμηση με συγχώνευση Merge Sort

Επιμέλεια διαφανειών: Δ. Φωτάκης Τροποποιήσεις-προσθήκες: Α. Παγουρτζής. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

Ταξινόμηση. 1. Στατιστικά Διάταξης 2. Στατιστικά σε Μέσο Γραμμικό Χρόνο. Εισαγωγή στην Ανάλυση Αλγορίθμων Μάγια Σατρατζέμη

Ταχεία Ταξινόμηση Quick-Sort

Διάλεξη 17η: Ταξινόμηση και Αναζήτηση

Ο αλγόριθμος Quick-Sort. 6/14/2007 3:42 AM Quick-Sort 1

Δομές δεδομένων (2) Αλγόριθμοι

Εργαστηριακή Άσκηση 1

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

Ελληνική Δημοκρατία Τεχνολογικό Εκπαιδευτικό Ίδρυμα Ηπείρου. Πληροφορική II. Ενότητα 2 : Αλγόριθμοι. Δρ. Γκόγκος Χρήστος

Αλγόριθµοι και Πολυπλοκότητα

Δομές Δεδομένων και Αλγόριθμοι (Γ εξάμηνο) Τμήμα Μηχανικών Πληροφορικής ΤΕ, ΤΕΙ Ηπείρου. Άσκηση εργαστηρίου #6 (Υλοποίηση δυαδικού δένδρου αναζήτησης)

Heapsort Using Multiple Heaps

p

#4. Heaps (σωροί), η ταξινόμηση HeapSort, η δομή std::priority_queue της STL

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές Δεδομένων. Ιωάννης Γ. Τόλλης Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης

Διδάσκων: Παναγιώτης Ανδρέου

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Αλγόριθµοι Ταξινόµησης

Εργαστήριο 2: Πίνακες

Αλγόριθµοι Ταξινόµησης

Αλγόριθμοι και πολυπλοκότητα Ταχυταξινόμηση (Quick-Sort)

Εργαστήριο 5 Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ με αλφαβητική σειρά

Ενώσεις δεδομένων Απαριθμητές Ψηφιακοί τελεστές Αναδρομικές συναρτήσεις

Αναδρομικές Σχέσεις «ιαίρει-και-βασίλευε»

Εργαστήριο 8: Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ

Διάλεξη 15η: Αναδρομή, μέρος 1ο

Ουρές Προτεραιότητας: Υπενθύμιση. Σωροί / Αναδρομή / Ταξινόμηση. Υλοποίηση Σωρού. Σωρός (Εισαγωγή) Ορέστης Τελέλης

242 -ΕισαγωγήστουςΗ/Υ

Συµβολοσειρές - Strings

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Α' Περιόδου Θέµα 1. (α') 2 - ii 3 - iii 4 - iv

Αλγόριθμοι Ταξινόμησης Bubble Sort Quick Sort. Αντρέας Δημοσθένους Καθηγητής Πληροφορικής Ολυμπιάδα 2012

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΦΡΟΝΤΙΣΤΗΡΙΟ ΑΛΓΟΡΙΘΜΩΝ ΒΟΗΘΟΣ: ΒΑΓΓΕΛΗΣ ΔΟΥΡΟΣ

Σχεδίαση και Ανάλυση Αλγορίθμων

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές Δεδομένων. Ιωάννης Γ. Τόλλης Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

add $t0,$zero, $zero I_LOOP: beq $t0,$s3, END add $t1, $zero,$zero J_LOOP: sub $t2, $s3, $t0 add $t2, $t2, $s1 int i, j, tmp; int *arr, n;

Προγραμματισμός Υπολογιστών με C++

Διάλεξη 09: Αλγόριθμοι Ταξινόμησης I

Προγραμματιστικές Τεχνικές

Κατανεμημένα και Παράλληλα Συστήματα (εργαστήριο) Παραδείγματα με openmp

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

ΣΧΕΔΙΑΣΗ ΚΑΙ ΥΛΟΠΟΙΗΣΗ ΛΟΓΙΣΜΙΚΟΥ

Σχεδίαση και Ανάλυση Αλγορίθμων

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. Δοµές Δεδοµένων

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

Ταξινόµηση. Παύλος Εφραιµίδης. οµές εδοµένων και

Ουρά Προτεραιότητας: Heap

Φροντιςτήριο. Linked-List

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ταξινόµηση Mergesort Κεφάλαιο 8. Ε. Μαρκάκης Επίκουρος Καθηγητής

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Αναδρομικοί Αλγόριθμοι

Τίτλος Μαθήματος: Ηλεκτρονικοί Υπολογιστές IΙΙ. Διδάσκων: Επίκουρος Καθηγητής Αθανάσιος Σταυρακούδης

Προγραμματιστικές Τεχνικές

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Διάλεξη 19: Αλγόριθμοι ΤαξινόμησηςII. Διδάσκων: Παναγιώτης Ανδρέου

19. ΠΡΟΤΥΠΑ (TEMPLATES)

Transcript:

Δομές Δεδομένων και Αλγόριθμοι Χρήστος Γκόγκος ΤΕΙ Ηπείρου Χειμερινό Εξάμηνο 2014-2015 Παρουσίαση 8 Quick Sort 1 / 11

Ο αλγόριθμος QuickSort 1 Προτάθηκε από τον CAR (Tony) Hoare το 1961 2 Ο αλγόριθμος QuickSort επιλέγει ένα στοιχείο (το pivot) και χωρίζει με βάση αυτό το στοιχείο την ακολουθία σε 2 υποακολουθίες, την αριστερή που περιέχει τιμές μικρότερες του pivot και τη δεξιά που περιέχει τιμές μεγαλύτερες του pivot Στη συνέχεια κάθε υποακολουθία ταξινομείται με αναδρομική κλήση του ίδιου αλγορίθμου 3 Η επιλογή του pivot γίνεται χρησιμοποιώντας κάποια στρατηγική (πρώτο στοιχείο από αριστερά, το μεσαίο στοιχείο, τυχαία κα) 2 / 11

Ο αλγόριθμος QuickSort QuickSort(A) 1 // Η ακολουθία A έχει n στοιχεία 2 if n = 1 3 return 4 else 5 Επιλογή στοιχείου pivot p 6 Partition(A, p) // Διαμερισμός του A σε σχέση με το p 7 QuickSort(A l ) // A l = τμήμα του A αριστερά του p 8 QuickSort(A r ) // A r = τμήμα του A δεξιά του p 3 / 11

Διαμερισμός ακολουθίας με βάση το στοιχείο pivot χρησιμοποιώντας βοηθητικό πίνακα Ο διαμερισμός των στοιχείων θα πρέπει να γίνει σε χρόνο O(n) p <p >p pivot Η διαμέριση των στοιχείων μπορεί να γίνει εύκολα αν χρησιμοποιηθεί ένας βοηθητικός πίνακας 4 / 11

Partition (not in place) #include <iostream> using namespace std; template<class T> void partition_not_in_place(t a [], int n, int p_index) { T temp[n] = { 0 ; T pivot = a[p_index]; int left = 0, right = n 1; for ( int i = 0; i < n; i++) if (a[ i ] < pivot ) { temp[left ] = a[ i ]; left ++; else if (a[ i ] > pivot ) { temp[right] = a[ i ]; right ; for ( int i = left ; i <= right ; i++) temp[i] = pivot ; for ( int i = 0; i < n; i++) a[ i ] = temp[i ]; int main(int argc, char **argv) { int n = 6; for ( int p_index = 0; p_index < n; p_index++) { int a[n] = { 16, 5, 14, 18, 11, 10 ; int pivot = a[p_index]; partition_not_in_place(a, n, p_index); printf ( Pivot=%d \t==> Array=, pivot); for ( int i = 0; i < n; i++) printf ( %d, a[ i ]) ; printf ( \n ) ; έξοδος Pivot=16 ==>Array=5 14 11 10 16 18 Pivot=5 ==>Array=5 10 11 18 14 16 Pivot=14 ==>Array=5 11 10 14 18 16 Pivot=18 ==>Array=16 5 14 11 10 18 Pivot=11 ==>Array=5 10 11 18 14 16 Pivot=10 ==>Array=5 10 11 18 14 16 5 / 11

Partition (in place) Υποθέτουμε ότι το pivot βρίσκεται στην πρώτη θέση της ακολουθίας Αν το pivot δεν είναι στην πρώτη θέση της ακολουθίας τότε θα πρέπει αρχικά να γίνει αντιμετάθεσή του με το στοιχείο το οποίο βρίσκεται στην πρώτη θέση Καθώς λειτουργεί ο αλγόριθμος και μέχρι τη θέση στην οποία έχει διανυθεί η ακολουθία τα στοιχεία είναι διαμερισμένα διαμερισμένα p <p >p μη διαμερισμένα pivot i j 6 / 11

Partition (in place) Υποθέτουμε ότι το pivot βρίσκεται στην πρώτη θέση της ακολουθίας Αν το pivot δεν είναι στην πρώτη θέση της ακολουθίας τότε θα πρέπει αρχικά να γίνει αντιμετάθεσή του με το στοιχείο το οποίο βρίσκεται στην πρώτη θέση Καθώς λειτουργεί ο αλγόριθμος και μέχρι τη θέση στην οποία έχει διανυθεί η ακολουθία τα στοιχεία είναι διαμερισμένα διαμερισμένα p <p >p pivot i j μη διαμερισμένα #include <iostream> using namespace std; template<class T> int partition (T a [], int l, int r) { int p = l ; int i = l + 1; for ( int j = l + 1; j <= r; j++) if (a[ j ] < a[p]) { swap(a[j], a[ i ]) ; i++; swap(a[p], a[ i 1]); return i 1; int main(int argc, char **argv) { int n = 6; for ( int p_index = 0; p_index < n; p_index++) { int a[n] = { 16, 5, 14, 18, 11, 10 ; int pivot = a[p_index]; printf ( Pivot=%d \t==> Array=, pivot); swap(a[0], a[p_index]); partition (a, 0, n); for ( int i = 0; i < n; i++) { printf ( %d, a[ i ]) ; printf ( \n ) ; 6 / 11

Ο πλήρης αλγόριθμος QuickSort #include <iostream> using namespace std; template<class T> int partition (T a [], int l, int r) { int p = l, int i = l + 1; for ( int j = l + 1; j <= r; j++) if (a[ j ] < a[p]) { swap(a[j], a[ i ]) ; i++; swap(a[p], a[ i 1]); return i 1; template<class T> void quick_sort(t a [], int l, int r) { if ( l >= r) return ; else { // insert code here if you want a different strategy // for pivot selection ( finally pivot should be swapped // with item at index l ) int p = partition (a, l, r) ; quick_sort(a, l, p 1); quick_sort(a, p + 1, r) ; template<class T> void quick_sort(t a [], int N) { quick_sort(a, 0, N 1); int main(int argc, char **argv) { int n = 6; int a[n] = { 16, 5, 14, 18, 11, 10 ; quick_sort(a, n); for ( int i = 0; i < n; i++) printf ( %d, a[ i ]) ; 7 / 11

Η απόδοση του QuickSort Η μέση απόδοση του αλγορίθμου είναι O(n log n) ενώ η χειρότερη απόδοση του αλγορίθμου είναι O(n 2 ) H O(n 2 ) συμπεριφορά του QuickSort παρατηρείται όταν η διαμέριση σε κάθε αναδρομικό βήμα χωρίζει τα n στοιχεία σε ένα άδειο σύνολο και σε ένα σύνολο με όλα τα υπόλοιπα στοιχεία πλην του pivot (δλδ n 1 στοιχεία) Η επιλογή του pivot με τυχαίο τρόπο επιτρέπει στον QuickSort συχνά να είναι γρηγορότερος από ανταγωνιστικούς αλγορίθμους 8 / 11

Ανάλυση του QuickSort Στην ιδανική περίπτωση η συνάρτηση διαμέρισης (partition) χωρίζει την ακολουθία τιμών στη μέση Αν αυτό μπορούσε να συμβεί σε κάθε αναδρομή τότε ο χρόνος εκτέλεσης της QuickSort θα ήταν: t(n) = 2t( n 2 ) + O(n) όπου O(n) είναι ο χρόνος που απαιτεί η διαμέριση Πραγματοποιώντας αντικαταστάσεις προκύπτει: 2 [ 2(t( n 4 ) + O( n 2 )] + O(n) 2 k t( n ) + O(k n) Λόγω 2 k του ότι το ανωτέρω ανάπτυγμα τελειώνει όταν 2 k = n (k = log(n)) και επειδή ο χρόνος επίλυσης με μέγεθος προβλήματος 1 μπορεί να θεωρηθεί σταθερός c προκύπτει ότι t(n) = n c + O(n log(n)) και καθώς το O(n log(n)) είναι ασυμπτωτικά μεγαλύτερο από το cn προκύπτει ότι ο χρόνος εκτέλεσης μπορεί να γραφεί ως O(n log n) 9 / 11

Παραλλαγές του QuickSort Χρήση της ταξινόμησης με εισαγωγή όταν το μέγεθος μιας διαμέρισης είναι μικρό (πχ 10) Επιλογή του pivot χρησιμοποιώντας την διάμεσο των τριών (δλδ τη διάμεσο ανάμεσα στο πρώτο, στο τελευταίο και στο μεσαίο στοιχείο της ακολουθίας) Κλήση της αναδρομικής συνάρτησης με την μικρότερη ακολουθία τιμών από τις 2 πρώτα (μείωση μεγέθους που απαιτείται στο stack) 10 / 11

IntroSort Introspective Sort Πρόκειται για τον αλγόριθμο που χρησιμοποιείται από την STL της C++ από το 2000 Εκτιμά το πλήθος αναδρομών που θα απαιτηθεί από την QuickSort και αν ξεπερνά ένα όριο τότε η ταξινόμηση γίνεται με την HeapSort Αλλιώς ενεργοποιείται η QuickSort με επιλογή pivot με την μέθοδο της διαμέσου των τριών (median of three) και εφαρμόζοντας την ταξινόμηση με εισαγωγή όταν προκύπτουν μικρές ακολουθίες τιμών Προτάθηκε από τον D Musser το 1997 11 / 11