Διάλεξη 09: Αλγόριθμοι Ταξινόμησης I Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Οι αλγόριθμοι ταξινόμησης: Α. SelectoSort Ταξινόμηση με Επιλογή Β. IsertoSort Ταξινόμηση με Εισαγωγή Γ. MergeSort Ταξινόμηση με Συγχώνευση ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 1
Αλγόριθμοι ταξινόμησης Δοθέντων μιας συνάρτησης f (orderg fucto) και ενός συνόλου στοιχείων η ταξινόμηση συνίσταται στη μετάθεση των στοιχείων ώστε να μπουν σε μια σειρά η οποία να ικανοποιεί ή f ( x k 1 ) f ( xk ) f ( xk ) 2 f x ( k x x,..., 1, 2 1 x, x k 2 k ) 2,...,... x... f ( x 1 x αύξουσα σειρά φθίνουσα σειρά Ταξινόμηση Ονομάτων: f( Mara ) < f( Mchals ), δηλαδή η συνάρτηση f συγκρίνει τις δυο λέξεις αλφαριθμητικά. k f Θα εξετάσουμε αλγόριθμους ταξινόμησης με κύριο γνώμονα την αποδοτικότητά τους (χρόνος εκτέλεσης, χρήση μνήμης). ( x k k ) ) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 2
A. Ταξινόμηση με Επιλογή Selecto Sort Η Ταξινόμηση με Επιλογή (Selecto Sort) βασίζεται στα ακόλουθα τρία βήματα: 1. επιλογή του ελάχιστου στοιχείου 2. ανταλλαγή με το οστό στοιχείο ( είναι μια μεταβλητή που αυξάνεται κατά ένα). 3. επανάληψη των βημάτων 1 και 2 για τα υπόλοιπα στοιχεία. Το ελάχιστο μεταξύ στοιχείων μπορεί να βρεθεί με τη χρήση ενός whle loop, σε χρόνο Ο(). Άρα ο χρόνος εκτέλεσης του Selecto Sort είναι: 1 1 O( 2 ) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 3
Ταξινόμηση με επιλογή: SelectoSort SelectoSort: ο αλγόριθμος αυτός ταξινομεί μία λίστα με στοιχεία. Σε κάθε βήμα βρίσκει το οστό πιο μικρό στοιχείο και το τοποθετεί στην θέση. Παράδειγμα: t x = {4, 8, 2, 1, 3, 5; swap Βήμα 1 0 1 2 3 4 5 4 8 2 1 3 5 Βήμα 2 Βήμα 3 Βήμα 4 Βήμα 5 Βήμα 6 1 8 2 4 3 5 1 2 8 4 3 5 1 2 3 4 8 5 1 2 3 4 8 5 1 2 3 4 5 8 ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 4
Ταξινόμηση με επιλογή: SelectoSort (συν.) Πρότυπο Συνάρτησης vod selectosort(t x[], //ο πίνακας t legth) //το μέγεθος του x Αλγόριθμος Αρχικοποίησε μία μεταβλητή m_dex η οποία θα αποθηκεύει τη θέση του ελάχιστου αριθμού Με ένα βρόγχο for που θα ελέγχει ένα ένα τα στοιχεία του πίνακα (<legth) κάνε τα εξής: Θέσε σαν m_dex το Ψάξε ένα ένα τα στοιχεία με ένα δεύτερο εσωτερικό βρόγχο αρχίζοντας από j= Αν το στοιχείο που βρίσκεται στη θέση j είναι μικρότερο από το στοιχείο που βρίσκεται στη θέση m_dex τότε θέσε m_dex = j Με την έξοδο από το βρόγχο, αντάλλαξε τα στοιχεία που βρίσκονται στη θέση με το στοιχείο που βρίσκεται στη θέση m_dex ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5
SelectoSort: Παράδειγμα Εκτέλεσης Θέση 0 1 2 3 4 5 Αρχικός Πίνακας 34 8 64 51 32 33 Με =0 8 34 64 51 32 33 m_dex Στοιχείο που θα εισαχθεί στην θέση Με =1 8 32 64 51 34 33 Με =2 8 32 33 51 34 64 Με =3 8 32 33 34 51 64 Με =4 8 32 33 34 51 64 ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 6
SelectoSort: Υλοποίηση vod SelectoSort(t A[]) { t = A.legth; t m_dex; t tmp; for(t =0; < 1; ++){ m_dex = ; for(t j=+1; j<; j++){ f(a[j]<a[m_dex]) m_dex=j; Αρχικοποίηση θέσης μικρότερου στοιχείου Βρες το μικρότερο στοιχείο tmp = A[]; A[] = A[m_dex]; A[m_dex]=tmp; Αντάλλαξε το μικρότερο στοιχείο με το τρέχον στοιχείο στη θέση [] ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 7
SelectoSort: Ανάλυση Χρόνου Εκτέλεσης vod SelectoSort(){ for (=0; < 1; ++){ for (j=+1; j<; j++){ sum++; Εξωτερικός Βρόγχος Εσωτερικός Βρόγχος Εσωτερικός Βρόγχος: Εξωτερικός Βρόγχος: IL j 1 1) ( 1 1 1 0 IL OL 2 0 ) ( 2 1 1 2 0 0 ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 8
B. Ταξινόμηση με Εισαγωγή Iserto Sort Η Ταξινόμηση με Εισαγωγή (IsertoSort) εισάγει έναένα τα στοιχεία του συνόλου που εξετάζεται, στη σωστή τους θέση. Στη φάση : 1. υποθέτουμε πως ο πίνακας A[0..( 1)] είναι ταξινομημένος, 2. εισάγουμε το στοιχείο Α[] στην ακολουθία Α[0..( 1)] στη σωστή θέση. Αυτό επιτυγχάνεται μετακινώντας όλα τα στοιχεία που είναι μεγαλύτερα του Α[] μια θέση δεξιά. ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 9
B. Ταξινόμηση με Εισαγωγή Iserto Sort (συν.) Στη φάση : 1. υποθέτουμε πως ο πίνακας A[0..( 1)] είναι ταξινομημένος, 2. εισάγουμε το στοιχείο Α[] στην ακολουθία Α[0..( 1)] στη σωστή θέση. Αυτό επιτυγχάνεται μετακινώντας όλα τα στοιχεία που είναι μεγαλύτερα του Α[] μια θέση δεξιά. 1 sorted { A[] 7 17 9 25 otsorted 7 11 sorted 9 2 3 7 17 25 7 11 { A[] otsorted A[] 9 7 17 sorted 25 otsorted 7 11 ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 10
IsertoSort: Παράδειγμα Εκτέλεσης Θέση 0 1 2 3 4 5 Αρχικός Πίνακας 34 8 64 51 32 21 Με =1 8 34 64 51 32 21 m_dex Στοιχείο που θα εισαχθεί στην θέση Με =2 8 34 64 51 32 21 Με =3 8 34 51 64 32 21 Με =4 8 32 34 51 64 21 Με =5 8 21 32 34 51 64 ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 11
IsertoSort: Υλοποίηση vod IsertoSort(t A[]){ t = x.legth; t dex,, j; for (=1; < ; ++) { dex = A[]; for (j=; j>0; j ){ Τρέχον στοιχείο εισαγωγής μετακίνηση στοιχείων προς δεξιά f (A[j 1] <= dex) { break; A[j] = A[j 1]; θέλουμε να μετακινήσουμε μόνο τα A[j 1] > dex A[j] = dex; τοποθέτηση στοιχείου dex=9 A[j 1] j= ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 12
Iserto Sort: Παράδειγμα Εκτέλεσης 2 BEFORE:[8,4,8,43,3,5,2,] (Το κόκκινο δείχνει τα ταξινομημένα στοιχεία) :1(dex:4) >8 ( > Δείχνει τις μετακινήσεις) [4,8,8,43,3,5,2,] (Νέος Πίνακας) :2(dex:8) (Τίποτα δεν μετακινείται) [4,8,8,43,3,5,2,] :3(dex:43) (Τίποτα δεν μετακινείται) [4,8,8,43,3,5,2,] :4(dex:3) >43>8>8>4 [3,4,8,8,43,5,2,] :5(dex:5) >43>8>8 [3,4,5,8,8,43,2,] :6(dex:2) >43>8>8>5>4>3 [2,3,4,5,8,8,43,] AFTER:[2,3,4,5,8,8,43,] ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 13
IsertoSort: Ανάλυση Χρόνου Εκτέλεσης vod IsertoSort(){ for (=1; <; ++){ for (j=; j>0; j ){ sum++; Εσωτερικός Βρόγχος Εξωτερικός Βρόγχος Εσωτερικός Βρόγχος: Εξωτερικός Βρόγχος: IL OL j 0 1 1 IL 1 2 1 2 ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 14
Σύγκριση IsertoSort και SelectoSort Υπάρχουν δυο κριτήρια: Βήματα (μέχρι να βρω ένα στοιχείο) και Μετακινήσεις (όταν το βρω, πόσα swap κάνω). Ο αλγόριθμος Selecto sort απαιτεί πάντα Ο(²) βήματα (δεν είναι δυνατή η γρήγορη έξοδος από τους βρόχους), έτσι η βέλτιστη περίπτωση είναι η ίδια με τη χείριστη περίπτωση. Στον αλγόριθμο Iserto Sort, είναι δυνατό να βγούμε από το δεύτερο βρόχο γρήγορα. Στη βέλτιστη περίπτωση (ο πίνακας είναι ήδη ταξινομημένος), ο χρόνος εκτέλεσης είναι της τάξης Ω() βήματα. Παρά τούτου, το Selecto Sort είναι πιο αποδοτικός αν κρίνουμε τους αλγόριθμους με βάση τον αριθμό των μετακινήσεων (swaps) που απαιτούν: το selecto sort απαιτεί Ο() μετακινήσεις, το serto sort, απαιτεί Ο(²) μετακινήσεις (στη χείριστη περίπτωση όπου ο αρχικός πίνακας είναι ταξινομημένος σε φθίνουσα σειρά). ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 15
Γ. Ταξινόμηση με Συγχώνευση (Merge sort) Η ταξινόμηση με συγχώνευση είναι διαδικασία διαίρει και βασίλευε ( Dvde ad Coquer: αναδρομική διαδικασία όπου το πρόβλημα μοιράζεται σε μέρη τα οποία λύνονται ξεχωριστά, και μετά οι λύσεις συνδυάζονται. ) Περιγραφή του Mergesort 1.Διαίρεση: Αναδρομικά μοιράζουμε τον πίνακα στα δύο μέχρι να φτάσουμε σε πίνακες μεγέθους ένα (DIVIDE) 2.Συγχώνευση: Ταξινομούμε αναδρομικά τους πίνακες αυτούς με την συγχώνευση γειτονικών πινάκων (χρησιμοποιώντας βοηθητικό πίνακα). (CONQUER) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 16
MergeSort: Βασική Ιδέα (#στοιχείων αριστερά) =7 (#στοιχείων δεξιά) 7 7 4 3 2 2 2 2 Dvde (splt) Coquer (merge) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 17
Συγχώνευση 2 Λιστών Υποθέστε ότι θέλετε να συγχωνεύσετε 2 ταξινομημένες λίστες L1, L2 και να δημιουργήσετε μια νέα ταξινομημένη λίστα TEMP Διαδικασία 1. Τοποθέτησε τους δείκτες, j στην κεφαλή κάθε λίστας. 2. Διάλεξε το μικρότερο από την λίστα L1 και L2 και τοποθέτησε τον στον πίνακα TEMP στην θέση κ 3. Προχώρησε τον δείκτη (αν το μικρότερο στοιχείο ήταν από την λίστα L1) ή τον δείκτη j στην αντίθετη περίπτωση. 4. Επανέλαβε τα βήματα 2 4 μέχρι να εισαχθούν όλα τα στοιχεία στον TEMP Μέτα από 6 εκτελέσεις: κ (Το,j ξεκινάνε από την αρχή της κάθε λίστας) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 18
MergeSort: Υλοποίηση vod MergeSort(t A[], t temp[], t l, t r){ // η συνθήκη τερματισμού της ανάδρομης f (l==r) retur; t md = (l+r)/2; // για ελαχιστοποίηση overflow(για μεγάλα l,r) // t md = l + ((r l) / 2); // μοιράζουμε αναδρομικά τον πίνακα MergeSort(A, temp, l, md); MergeSort(A, temp, md+1, r); DIVIDE // συνεχίζεται ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 19
MergeSort: Υλοποίηση (συν.) // Τώρα οι πίνακες [l..md] και [md+1..r] είναι // ταξινομημένοι Η διαδικασία συγχώνευσης t k=l, =l, j=md+1; // συγχώνευση στον temp μέχρι μια από // τις λίστες αδειάσει whle ((<=md) && (j<=r)) { f (A[]<A[j]){ temp[k] = A[]; ++; else { temp[k] = A[j]; j++; k++; // συνεχίζεται MERGE ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 20
MergeSort: Υλοποίηση (συν.) // copy όλων των υπόλοιπων στοιχείων λίστας L1 whle (<=md) { temp[k] = A[]; k++;++; // copy όλων των υπόλοιπων στοιχείων λίστας L2 whle (j<=r) { temp[k] = A[j]; k++;j++; // αντιγραφή όλων των στοιχείων από TEMP > A for (=l; <=r; ++) { A[] = temp[]; ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 21
Παράδειγμα Εκτέλεσης Merge Sort BEFORE:[8,4,8,43,3,5,2,1,10] Idex: 0 1 2 3 4 5 6 7 8 0,8: [8,4,8,43,3, 5,2,1,10] 0,4: [8,4,8,43,3] 0,2: [8,4,8] 0,1: [8,4] 0,0: [8] 1,1: [4] Mergg: [A0,A0] [A1,A1] => [4,8,] 2,2: [8] Mergg: [A0,A1] [A2,A2] => [4,8,8,] 3,4: [43,3] 3,3: [43] 4,4: [3] dvde dvde dvde Mergg: [A3,A3] [A4,A4] => [3,43] Mergg: [A0,A2] [A3,A4] => [3,4,8,8,43] 5,8: [5,2,1,10] 5,6: [5,2] 5,5: [5] 6,6: [2] dvde Mergg: [A5,A5] [A6,A6] => [2,5] 7,8: [1,10] dvde 7,7: [1] 8,8: [10] Mergg: [A7,A7] [A8,A8] => [1,10] Mergg: [A5,A6] [A7,A8] => [1,2,5,10] Mergg: [A0,A4] [A5,A8] => [1,2,3,4,5,8,8,10,43] AFTER:[1,2,3,4,5,8,8,10,43] ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 22
MergeSort: Ανάλυση Χρ. Εκτέλ. Αναδρομή Το πρόβλημα μοιράζει αναδρομικά σε δυο μέρη την λίστα που θέλουμε να ταξινομήσουμε. Όταν φτάσουμε στην λίστα που έχει μέγεθος 1 τότε σταματά η αναδρομή και το πρόγραμμα αρχίζει να συνδυάζει (merge) τις επιμέρους λίστες. Παρατηρούμε ότι πάνω σε μια λίστα μεγέθους Ν η αναδρομή εκτελείται 2log 2 φορές. Δηλαδή ο πίνακας μοιράζεται ως εξής:, /2, /4,, 2, 1 vod MergeSort(t A[], t temp[], t l, t r){ f (l==r) retur; t md = (l+r)/2; MergeSort(A, temp, l, md); MergeSort(A, temp, md+1, r); Θ(log) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 23
MergeSort: Ανάλυση Χρ. Εκτέλ. Συγχώνευση Σε κάθε επίπεδο της ανάδρομης περνάμε μια φορά από το κάθε στοιχείο. Επομένως η συγχώνευση των στοιχείων σε κάθε επίπεδο της εκτέλεσης χρειάζεται γραμμικό χρόνο Θ(). Σημειώστε ότι η διαδικασία απαιτεί τη χρήση βοηθητικού πίνακα. Μπορούμε να χρησιμοποιούμε τον ίδιο βοηθητικό πίνακα temp για όλες τις (αναδρομικές) κλήσεις του ΜergeSort. ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 24
MergeSort: Ανάλυση Χρ. Εκτέλ. Συνολικός Η αντιγραφή και η συγχώνευση παίρνουν χρόνο Θ() και η αναδρομή παίρνει χρόνο Θ(log ). Συνολικά Θ( log ). Ο χρόνος εκτέλεσης εκφράζεται και από την αναδρομική εξίσωση Τ(0) = Τ(1) = 1 Τ() = 2T(/2) + η οποία μπορεί να λυθεί με το Master Theorem ή με την μέθοδο της αντικατάστασης. Πλεονέκτημα MergeSort: O συνολικός χρόνος εκτέλεσης είναι Θ( log ) (σε αντίθεση με το SelectoSort (Θ( 2 )) και το IsertoSort (Ο( 2 )) Μειονέκτημα: Απαιτεί τη χρήση βοηθητικού πίνακα (δηλαδή χρειάζεται διπλάσιο χώρο αποθήκευσης για την εκτέλεση του). Αυτό δεν καθιστά την μέθοδο πολύ εύχρηστη. ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 25