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

Σχετικά έγγραφα
Αλγόριθμοι ταξινόμησης

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

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

Ταξινόμηση. Σαλτογιάννη Αθανασία

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Δοµές Δεδοµένων. 9η Διάλεξη Ταξινόµηση - Στοιχειώδεις µέθοδοι. Ε. Μαρκάκης

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

ιαφάνειες παρουσίασης #4

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

Δοµές Δεδοµένων. 10η Διάλεξη Ταξινόµηση. E. Μαρκάκης

Προγραµµατισµός 1 Ταξινόµηση - Αναζήτηση

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

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

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

Εισ. Στην ΠΛΗΡΟΦΟΡΙΚΗ. Διάλεξη 7 η. Βασίλης Στεφανής

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

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

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

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ.

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

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

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Φ Ρ Ο Ν Τ Ι Σ Τ Η Ρ Ι Ο 1 : ΤΑΞΙΝΟΜΗΣΗ Δ Ρ Ι Τ Σ Α Σ Η Λ Ι Α Σ Υ Π Ο Ψ Η Φ Ι Ο Σ Δ Ι Δ Α Κ Τ Ο Ρ Α Σ

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

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

Κατ οίκον Εργασία 2 Σκελετοί Λύσεων

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

Προγραμματισμός Ι (ΗΥ120)

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

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

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

5. Απλή Ταξινόμηση. ομές εδομένων. Χρήστος ουλκερίδης. Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων

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

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

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

a 1 a 2 a n. 3. i = j 1 5. A[i + 1] = A[i] 6. i = i 1

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

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

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

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

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

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

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

p

i : 0<=i<N-1 => data[i] <= data[i+1] 25/10/2009

int Α[] = {4, 16, 22, 12, 9, 15, 10}; { 4, 9, 10, 12, 15, 16, 22 } Α[0]=4, Α[1]=9, Α[2]=10 { 4, 16,22, 12, 9, 15, 10} { 4, 12, 16, 22, 9, 15,16, 22 }

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

3 ΑΝΑ ΡΟΜΗ ΑΝΑΖΗΤΗΣΗ - ΤΑΞΙΝΟΜΗΣΗ. n! = 1*2*3*..(n-1)*n. n! = 1 αν n = 0, = n*(n-1)! αν n > ΑΝΑ ΡΟΜΗ Εισαγωγή

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

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

Στόχοι και αντικείμενο ενότητας. Πέρασμα Πίνακα σε Συνάρτηση (συν.) Πέρασμα Πίνακα σε Συνάρτηση. #8.. Ειδικά Θέματα Αλγορίθμων

ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΔΙΟΙΚΗΣΗΣ ΕΠΙΧΕΙΡΗΣΕΩΝ (ΠΑΤΡΑ) ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

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

ΗΥ-150. Ταξινόµηση και Αναζήτηση

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

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

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

ΗΥ240 - Παναγιώτα Φατούρου 2

Εισαγωγή στους Αλγορίθμους

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

Ταξινόμηση: Εισαγωγικά. Ταξινόμηση (Sor ng) Αλγόριθμοι Απλής Ταξινόμησης. Βασικά Βήματα των Αλγορίθμων

ΜΥΥ105: Εισαγωγή στον Προγραµµατισµό. Αναζήτηση και Ταξινόµηση Χειµερινό Εξάµηνο 2014

ΑΛΓΟΡΙΘΜΟΙ. Ενότητα 4: Διαίρει και Βασίλευε. Ιωάννης Μανωλόπουλος, Καθηγητής Αναστάσιος Γούναρης, Επίκουρος Καθηγητής Τμήμα Πληροφορικής ΑΠΘ

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

Επιµέλεια Θοδωρής Πιερράτος

Κεφάλαιο 4. Διαίρει και Βασίλευε (Divide and Conquer) Χρησιµοποιήθηκε υλικό από τις αγγλικές διαφάνειες του Kevin Wayne.

ΑΛΓΟΡΙΘΜΟΙ Άνοιξη I. ΜΗΛΗΣ

Εισαγωγή στον Προγραμματισμό

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

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

Προγραμματισμός Η/Υ (ΤΛ2007 )

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

Εισαγωγή. Γενική Εικόνα του Μαθήµατος. Το εσωτερικό ενός Σ Β. Εισαγωγή. Εισαγωγή Σ Β Σ Β. Αρχεία ευρετηρίου Κατάλογος συστήµατος Αρχεία δεδοµένων

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

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

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

ΜΥΥ105: Εισαγωγή στον Προγραμματισμό. Αναζήτηση και Ταξινόμηση Χειμερινό Εξάμηνο 2016

Το εσωτερικό ενός Σ Β

Εισαγωγή στην Ανάλυση Αλγορίθμων (1) Διαφάνειες του Γ. Χ. Στεφανίδη

Transcript:

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

Ταξινόµηση Εισαγωγή Selection sort Insertion sort Bubble sort Quick sort Merge sort Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 2

Ορισµός Αρχείο µεγέθους n είναι µια ακολουθία από n αντικείµενα r[0], r[1],, r[n-1] εγγραφή κλειδί 4 άλλα πεδία ΑΑΑ Κάθε αντικείµενο r[i] του αρχείου ονοµάζεται εγγραφή και έχει ένα κλειδί k[i] αρχείο 2 1 ΓΓΓ Το αρχείο είναι ταξινοµηµένο µε βάση το κλειδί k, εφόσον το k[i] προηγείται του k[j] για κάθε i < j 5 3 ΒΒΒ ΕΕΕ Παράδειγµα Ο τηλεφωνικός κατάλογος είναι ένα αρχείο από εγγραφές ταξινοµηµένες µε βάση το όνοµα των συνδροµητών κλειδί άλλα πεδία Η διαδικασία της ταξινόµησης διακρίνεται σε 1 ΓΓΓ Εσωτερική αν όλες οι εγγραφές βρίσκονται στην κύρια µνήµη 2 3 ΕΕΕ Εξωτερική αν κάποιες από τις εγγραφές βρίσκονται στη δευτερεύουσα µνήµη 4 5 ΑΑΑ ΒΒΒ Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 3

Χρόνος εκτέλεσης Μέτρα Απόδοσης Πλήθος συγκρίσεων στοιχείων Πλήθος ανταλλαγών στοιχείων Μνήµη εκτέλεσης Επιπλέον µνήµη µόνο για τη στοίβα (in place) Επιπλέον µνήµη για αποθήκευση αντιγράφων του πίνακα Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 4

Selection Sort Στο ταξινοµηµένο αρχείο Το µικρότερο κλειδί πρέπει να βρίσκεται στη θέση 0 Το δεύτερο µικρότερο κλειδί πρέπει να βρίσκεται στη θέση 1... Ταξινόµηση σε πίνακα Αναζητούµε το µικρότερο κλειδί του πίνακα a[0...n-1] Το ανταλλάσουµε µε αυτό που βρίσκεται στην πρώτη θέση a[0] Αναζητούµε το δεύτερο µικρότερο κλειδί του πίνακα a[1...n-1] Το ανταλλάσουµε µε αυτό που βρίσκεται στη δεύτερη θέση a[1] Επαναλαµβάνουµε µέχρι να ταξινοµηθεί ολόκληρο το αρχείο Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 5

Παράδειγµα Selection Sort 25 57 48 37 12 92 86 33 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 6

Λύση Selection Sort 25 57 48 37 12 92 86 33 βήµα 1 12 57 48 37 25 92 86 33 βήµα 2 12 25 48 37 57 92 86 33 βήµα 3 12 25 33 37 57 92 86 48 βήµα 4 12 25 33 37 57 92 86 48 βήµα 5 12 25 33 37 48 92 86 57 βήµα 6 12 25 33 37 48 57 86 92 12 25 33 37 48 57 86 92 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 7

Υλοποίηση void selectionsort(int a[], int n) { int i, j, min, t; } for (i = 0; i < n-1; i++) { /* find smallest in a[i..n-1] */ min = i; for (j = i + 1; j < n; j++) if (a[j] < a[min]) min = j; /* swap a[min] with a[i] */ t = a[min]; a[min] = a[i]; a[i] = t; } Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 8

Ανάλυση Selection Sort Για κάθε στοιχείο i του a[0..n-2] έχουµε 1 ανταλλαγή n-i-1 συγκρίσεις Συνολικά έχουµε n-1 ανταλλαγές n(n-1)/2 συγκρίσεις n 2 n 1 i= 0 j= i+ 1 1 = n 2 i= 0 ( n 1 i) = n 1+... + 1 = n( n 1) 2 Πολυπλοκότητα Ο(n 2 ) Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 9

Insertion Sort Θεωρούµε στοιχεία αποθηκευµένα σε πίνακα Αρχικά όλα τα στοιχεία είναι µη ταξινοµηµένα Ταξινοµούµε τα στοιχεία ένα κάθε φορά Παίρνουµε ένα στοιχείο από αυτά που δεν έχουν ταξινοµηθεί Βρίσκουµε την κατάλληλη θέση του µεταξύ των ταξινοµηµένων Μετακινούµε τα µεγαλύτερα στοιχεία του µια θέση δεξιά Εισάγουµε το στοιχείο στη θέση που απελευθερώθηκε Επαναλαµβάνουµε µέχρι να ταξινοµήσουµε όλα τα στοιχεία Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 10

Παράδειγµα Insertion Sort 25 57 48 37 12 92 86 33 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 11

Λύση Insertion Sort 25 57 48 37 12 92 86 33 βήµα 1 25 57 48 37 12 92 86 33 βήµα 2 25 48 57 37 12 92 86 33 βήµα 3 25 37 48 57 12 92 86 33 βήµα 4 12 25 37 48 57 92 86 33 βήµα 5 12 25 37 48 57 92 86 33 βήµα 6 12 25 37 48 57 86 92 33 βήµα 7 12 25 33 37 48 57 86 92 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 12

Υλοποίηση void insertionsort(int a[], int n) { int i, j, temp; for (i = 1; i < n; i++) { temp = a[i]; /* a[0..i-1] > temp move to the right */ for (j = i; j > 0 && a[j-1] > temp; j--) a[j] = a[j-1]; } } /* temp moves to vacant slot a[j] */ a[j] = temp; Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 13

Χειρότερη περίπτωση Ανάλυση Insertion Sort Αντίστροφα ταξινοµηµένος πίνακας Κάθε στοιχείο µετακινείται στο αριστερό άκρο του πίνακα Συνολικό πλήθος συγκρίσεων και µετακινήσεων n 1 i n 1 i= 1 j= 1 i= 1 Καλύτερη περίπτωση 1 = i Ταξινοµηµένος πίνακας Κανένα στοιχείο δε µετακινείται Συνολικό πλήθος συγκρίσεων n 1 1 i= 1 n( n 1) = 2 = n 1 = O( n) = O( n Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 14 2 )

Bubble Sort Περνάµε από τα στοιχεία του αρχείου πολλαπλές φορές Σε κάθε πέρασµα Συγκρίνουµε το κλειδί κάθε στοιχείου µε το επόµενό του Εάν τα στοιχεία δεν είναι στη σωστή διάταξη τα ανταλλάσουµε Μετά το i-στό πέρασµα Το στοιχείο a[n-i] βρίσκεται στη σωστή θέση ε χρειάζεται να εξετάσουµε ξανά τα στοιχεία a[n-i..n-1] Όταν δε γίνονται ανταλλαγές στοιχείων σε ένα πέρασµα Τα στοιχεία είναι πλήρως ταξινοµηµένα Ο αλγόριθµος τερµατίζει Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 15

Παράδειγµα Bubble Sort πέρασµα 1 25 57 48 37 12 92 86 33 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 16

Λύση Bubble Sort πέρασµα 1 25 57 48 37 12 92 86 33 25 48 57 37 12 92 86 33 25 48 37 57 12 92 86 33 25 48 37 12 57 92 86 33 25 48 37 12 57 86 92 33 25 48 37 12 57 86 33 92 πέρασµα 2 25 48 37 12 57 86 33 92 25 37 48 12 57 86 33 92 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 17

void bubblesort(int a[], int n) { int i,j,t; int sorted = 0; Υλοποίηση } for (i = n-1; i>= 0 &&!sorted; i--) { sorted = 1; for (j = 1; j <= i; j++) if (a[j-1] > a[j]) { /* swap */ t = a[j-1]; a[j-1] = a[j]; a[j] = t; sorted = 0; } } Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 18

Χειρότερη περίπτωση Ανάλυση Bubble Sort Αντίστροφα ταξινοµηµένος πίνακας Στο πέρασµα i χρειάζονται n-i συγκρίσεις και ανταλλαγές Συνολικό πλήθος συγκρίσεων και ανταλλαγών n 1 i n 1 i= 1 j= 1 i= 1 Καλύτερη περίπτωση 1 = i Ταξινοµηµένος πίνακας Κανένα στοιχείο δε µετακινείται Συνολικό πλήθος συγκρίσεων n 1 1 j= 1 = n 1 = n( n 1) = 2 O( n) = O( n Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 19 2 )

Quick Sort Divide and Conquer (διαίρει και βασίλευε) ιαίρεσε το αρχείο σε δύο µέρη Ταξινόµησε το κάθε µέρος ανεξάρτητα quicksort(int a[], int l, int r) if (r>l) { int i = partition(a, l, r); /* διαίρεση */ quicksort(a, l, i-1); quicksort(a, i+1, r); } Η βασική ιδέα του αλγόριθµου βρίσκεται στη διαδικασία διαίρεσης Ένα στοιχείο a[i] τοποθετείται στην τελική θέση ταξινόµησης Όλα τα στοιχεία a[0..i-1] είναι µικρότερα ή ίσα του a[i] Όλα τα στοιχεία a[i+1..n-1] είναι µεγαλύτερα ή ίσα του a[i] Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 20

Quick Sort Υλοποίηση διαίρεσης Επιλέγουµε οποιοδήποτε στοιχείο a[i] για τελική τοποθέτηση Ξεκινώντας από το a[0] αναζητούµε στοιχείο > a[i] Ξεκινώντας από το a[n-1] αναζητούµε στοιχείο < a[i] Ανταλλάσουµε τα δύο στοιχεία που βρήκαµε παραπάνω Συνεχίζουµε τη διαδικασία αναζήτησης και ανταλλαγής Όταν οι δύο αναζητήσεις συναντηθούν, ανταλλάσουµε το a[i] µε το δεξιότερο στοιχείο του αριστερού υποπίνακα Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 21

Παράδειγµα Quick Sort 25 57 48 37 12 92 86 33 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 22

Λύση Quick Sort 25 57 48 37 12 92 86 33 25 12 48 37 57 92 86 33 33 48 25 12 12 25 37 57 92 86 48 48 57 92 86 57 57 92 86 92 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 23

Υλοποίηση void quicksort(int a[], int l, int r) { int v, i, j, t; if (r > l) { /* partitioning */ v = a[r]; i = l-1; j = r; /* pivot a[r] */ for (;;) { while (a[++i] < v); while (a[--j] > v && j > l); if (i >= j) break; t = a[i]; a[i] = a[j]; a[j] = t; /* swap */ } t = a[i]; a[i] = a[r]; a[r] = t; /* swap */ quicksort(a, l, i-1); quicksort(a, i+1, r); } } Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 24

Ανάλυση Quick Sort Εάν υποδιαιρούµε τον πίνακα σε ισοµεγέθη µέρη κάθε φορά, τότε έχουµε χρόνο εκτέλεσης T(1) = 1, Τ(n) = n+2t(n/2), n>1 οπότε T(n) = n + 2 n/2 + 4 n/4 + + n n/n = O(n log 2 n) Εάν επιλέγουµε το στοιχείο υποδιαίρεσης (pivot) έτσι ώστε ο ένας υποπίνακας να είναι πάντα άδειος, έχουµε T(1) = 1, T(n) = n+t(n-1), n>1 οπότε Τ(n) = n + n-1 + + 1 = O(n 2 ) Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 25

Merge Sort Θεωρούµε διαδικασία συγχώνευσης δύο πινάκων a[1..m] και b[1..n] i = 1; j = 1; a[m+1] = INT_MAX; b[n+1] = INT_MAX; for (k = 1; k <= m+n; k++) c[k] = (a[i] < b[j])? a[i++] : b[j++]; Για να ταξινοµήσουµε έναν πίνακα ιαιρούµε τον πίνακα σε δύο ίσα µέρη ( divide and conquer ) Ταξινοµούµε αναδροµικά κάθε µέρος του πίνακα Συγχωνεύουµε τα δύο µέρη Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 26

Παράδειγµα Merge Sort 25 57 48 37 12 92 86 33 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 27

Λύση Merge Sort 25 57 48 37 12 92 86 33 25 57 37 48 25 37 48 57 12 92 33 86 12 33 86 92 12 25 33 37 48 57 86 92 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 28

Υλοποίηση void mergesort(int a[], int l, int r) { int i, j, k, m; if (r > l) { m = (r+l)/2; mergesort(a, l, m); mergesort(a, m+1, r); /* αντιγραφή του a[l..m] στο b[l..m] */ for (i = m; i >= l; i--) b[i] = a[i]; /* αντιστροφή του a[m+1..r] στο b[m+1..r] */ for (j = m; j < r; j++) b[r+m-j] = a[j+1]; /* συγχώνευση b[l..m] και b[m+1..r] στο a[l..r]*/ for (k = l; k <= r; k++) a[k] = (b[i] < b[j])? b[i++] : b[j--]; } } Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 29

Ανάλυση Merge Sort Από την αναδροµή έχουµε πλήθος συγκρίσεων T(1) = 0 T(n) = n + 2 T(n/2), n>1 οπότε T(n) = n + 2 n/2 + 4 n/4 + + n n/n = O(n log 2 n) Επίσης λόγω του βοηθητικού πίνακα χρησιµοποιούµε επιπλέον µνήµη O(n) Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 30