Ταξινόμηση: Εισαγωγικά Ταξινόμηση (Sor ng) Ορέστης Τελέλης Βασικό πρόβλημα για την Επιστήμη των Υπολογιστών. π.χ. αλφαβητική σειρά, πωλήσεις ανά τιμή, πόλεις με βάση πληθυσμό, Μπορεί να είναι ένα πρώτο βήμα προς την αποδοτική αναζήτηση: telelis@unipi.gr Θυμηθείτε τη δυαδική αναζήτηση σε ταξινομημένους πίνακες. Τμήμα Ψηφιακών Συστημάτων, Πανεπιστήμιο Πειραιώς Σημαντική και πολύ χρονοβόρα: αντικείμενο εκτεταμένων ερευνών. Αναπτύχθηκαν πολλοί και διαφορετικοί αλγόριθμοι ταξινόμησης. Δείτε για παράδειγμα: h p://en.wikipedia.org/wiki/sor ng_algorithm Donald Knuth., Vol. 3: Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 1 / 44 Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 2 / 44 Αλγόριθμοι Απλής Ταξινόμησης Βασικά Βήματα των Αλγορίθμων Σχετικά αργοί αλγόριθμοι. Αξίζει να εξεταστούν, διότι: Κατανοούμε επακριβώς τη λειτουργία τους. Κατά περιπτώσεις πιο αποδοτικοί από πιο ταχύτερους αλγόριθμους. Π.χ., η αποδοτική για μικρή ή σχεδόν ταξινομημένη είσοδο. Ενα πρόγραμμα μπορεί μόνο (?) να δε μπορεί να έχει μια καθολική εικόνα στα δεδομένα όπως ο άνθρωπος. Εκτελεί «τοπική» εξέταση των δεδομένων. Οι τρεις αλγόριθμοι που μελετάμε εκτελούν επαναλαμβανόμενα: μεταξύ δύο στοιχείων. δύο στοιχείων ενός στοιχείου μέχρι οι συγκρίσεις στοιχείων σε διαφορετικές θέσεις να είναι «σωστές». Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 3 / 44 Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 4 / 44
1. Ταξινόμηση Φυσαλίδας (Bubble Sort) Βήματα Αλγορίθμου Ταξινόμησης Φυσαλίδας Απλή αλλά αργή επαναληπτική μέθοδος ταξινόμησης. Σε κάθε επανάληψη σαρώνει την ακολουθία των στοιχείων. Συγκρίνει κάθε στοιχείο στην ακολουθία με το επόμενο: αντιμεταθέτει τα στοιχεία αν είναι σε «λάθος» σειρά. Επαναλαμβάνει, μέχρι σε κάποια σάρωση να μη συμβεί αντιμετάθεση. Υποθέτοντας ταξινόμηση σε αύξουσα σειρά: Κάθε σάρωση εκτελείται σε ακολουθία μικρότερη κατά ένα στοιχείο. Σύγκρινε τα γειτονικά στοιχεία. Εάν το πρώτο είναι μεγαλύτερο από το δεύτερο, αντιμετάθεσέ τα. Μετακινήσου μια θέση δεξιά και επανάλαβε για όλα τα στοιχεία (ολοκλήρωση πρώτης σάρωσης). Συνέχισε μέχρι να μην υπάρχουν άλλα ζεύγη για να συγκρίνεις Ο αλγόριθμος αυτός ταξινομεί τα στοιχεία σε αύξουσα σειρά. Πώς θα τον τροποποιούσατε ώστε να ταξινομεί σε φθίνουσα σειρά? Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 5 / 44 Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 6 / 44 Ταξινόμηση Φυσαλίδας (Παράδειγμα 1ης Σάρωσης) Ταξινόμηση Φυσαλίδας (Παράδειγμα Εκτέλεσης) 23 12 58 7 10 Σύγκρινε 23, 12. 12 23 58 7 10 Αντιμετάθεσε 23, 12. 12 23 58 7 10 Σύγκρινε 23, 58. 12 23 58 7 10 Σύγκρινε 58, 7. 12 23 7 58 10 Αντιμετάθεσε 58, 7. 12 23 7 58 10 Σύγκρινε 58, 10. 12 23 7 10 58 Αντιμετάθεσε 58, 10. swapped = true j := n 1 j > 0 swapped == true: swapped := false i := 1 j 1: a i > a i+1 : tmp := a i+1 a i+1 := a i a i := tmp swapped := true j := j 1. Είσοδος: 1η Σαρ.: 2η Σαρ.: 3η Σαρ.: 4η Σαρ.: a 0 a 1 a 2 a 3 a 4 23 12 58 7 10 23 12 58 7 10 23 12 7 10 23 12 7 10 12 7 10 12 7 10 7 10 7 10 Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 7 / 44 Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 8 / 44
Υλοποίηση Ταξινόμησης Φυσαλίδας ArrayBub { [ ] a ; nelems ; ArrayBub ( max ) { a = [ max ] ; nelems = 0 ; i n s e r t ( v a l u e ) { a [ nelems ] = v a l u e ; nelems + + ; d i s p l a y ( ) { ( j = 0 ; j < nelems ; j ++) System. out. p r i n t ( a [ j ] + ) ; System. out. p r i n t l n ( ) ; Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 9 / 44 Υλοποίηση Ταξινόμησης Φυσαλίδας b u b b l e S o r t ( ) { swapped = ; j = nelems 1; ( j > 0 && swapped == ) { swapped = ; ( i = 0 ; i < j ; i ++) ( a [ i ] > a [ i +1] ) { swap ( i, i +1) ; swapped = ; j = j 1 ; swap ( one, two ) { temp = a [ one ] ; a [ one ] = a [ two ] ; a [ two ] = temp ; Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 10 / 44 Υλοποίηση Ταξινόμησης Φυσαλίδας Αναλλοίωτες Συνθήκες BubbleSortApp { main ( S t r i n g [ ] a r g s ) { maxsize = 100; ArrayBub a r r ; a r r = ArrayBub ( maxsize ) ; a r r. i n s e r t ( 7 7 ) ; a r r. i n s e r t ( 9 9 ) ; a r r. i n s e r t ( 4 4 ) ; a r r. i n s e r t ( 5 5 ) ; a r r. i n s e r t ( 2 2 ) ; a r r. i n s e r t ( 8 8 ) ; a r r. i n s e r t ( 1 1 ) ; a r r. i n s e r t ( 0 0 ) ; a r r. i n s e r t ( 6 6 ) ; a r r. i n s e r t ( 3 3 ) ; a r r. d i s p l a y ( ) ; a r r. b u b b l e S o r t ( ) ; a r r. d i s p l a y ( ) ; Είναι χρήσιμες για την: κατανόηση της λειτουργίας του αλγόριθμου, τυπική τεκμηρίωση της ορθότητάς του, ανάλυση της πολυπλοκότητας του αλγορίθμου, αποσφαλμάτωση (debugging) της υλοποίησης. Η αναλλοίωτη είναι ότι τα στοιχεία δεξιά του j είναι ταξινομημένα. Αυτό ισχύει καθόλη την εκτέλεση του αλγόριθμου. Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 11 / 44 Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 12 / 44
Ανάλυση Πολυπλοκότητας Αλγορίθμου Φυσαλίδας Ανάλυση Πολυπλοκότητας Αλγόριθμου Φυσαλίδας Πλήθος Συγκρίσεων: n 1. Πλήθος Αντιμεταθέσεων: 0 έως n 1. Το στοιχείο στο τέλος του πίνακα ταξινομήθηκε: δε θα μετακινηθεί ξανά. Πλήθος Συγκρίσεων: n 2. Πλήθος Αντιμεταθέσεων: 0 έως n 2. Το στοιχείο στην προτελευταία θέση ταξινομήθηκε: δε μετακινείται ξανά. Στην 1η σάρωση n 1 συγκρίσεις, στη 2η σάρωση n 2 συγκρίσεις, Αρα: (n 1) + (n 2) + + 1 = n(n 1)/2 = O(n 2 ) συγκρίσεις. Στην 1η σάρωση n 1 αντιμεταθέσεις, στη 2η σάρωση n 2, Στη χειρότερη περίπτωση n(n 1)/2 = O(n 2 ) αντιμεταθέσεις. ( ) Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 13 / 44 Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 14 / 44 2. Ταξινόμηση Επιλογής (Selec on Sort) H ταξινόμηση επιλογής βελτιώνει την ταξινόμηση φυσαλίδας: μειώνει το πλήθος των αντιμεταθέσεων από O(n 2 ) σε O(n). Βασική Ιδέα i 0 n 2 i: j μεταξύ των i,..., n 1. Αντιμεταθέτει τα στοιχεία των θέσεων i και j εφόσον χρειάζεται. Ο αριθμός συγκρίσεων παραμένει O(n 2 ). Σημαντική βελτίωση για «ογκώδη» αντιμετατιθέμενα αντικείμενα: σε υλοποιήσεις με πραγματικές «αντιγραφές» αντικειμένων. μπορεί να συμβαίνει σε υλοποιήσεις C/C++. στη Java πάντα αντιμεταθέτουμε αναφορές (διευθύνσεις μνήμης). Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 15 / 44 i := 0 n 2: j := i t := i + 1 n 1: - a t < a j: j := t tmp := a i a i := a j a j := tmp Είσοδος: 1η Επαν.: 2η Επαν.: 3η Επαν.: 4η Επαν.: a 0 a 1 a 2 a 3 a 4 23 12 58 7 10 23 12 58 7 10 12 58 10 12 58 23 10 58 23 58 23 12 23 23 58 Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 16 / 44
Παράδειγμα: Ταξινόμηση Επιλογής 23 12 58 7 10 Σύγκρινε το ελάχιστο στοιχείο (7) με το στοιχείο στη θέση 0 (23). 7 12 58 23 10 Αντιμετάθεσε 23, 7. 7 12 58 23 10 Σύγκρινε το επόμενο ελάχιστο (10) με το στοιχείο στη θέση 1 (12). 7 10 58 23 12 Αντιμετάθεσε 12, 10. 7 10 58 23 12 Σύγκρινε το επόμενο ελάχιστο (12) με το στοιχείο στη θέση 2 (58). 7 10 12 23 58 Αντιμετάθεσε 58, 12. 7 10 12 23 58 Συγκρινε το επόμενο ελάχιστο (23) με το στοιχείο στη θέση 3 (23). 7 10 12 23 58 Συγκρινε το επόμενο ελάχιστο (58) με το στοιχείο στη θέση 4 (58). Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 17 / 44 Υλοποίηση Ταξινόμησης Επιλογής A r r a y S e l { [ ] a ; nelems ; A r r a y S e l ( max ) { a = [ max ] ; nelems = 0 ; i n s e r t ( v a l u e ) { a [ nelems ] = v a l u e ; nelems + + ; d i s p l a y ( ) { ( j = 0 ; j < nelems ; j ++) System. out. p r i n t ( a [ j ] + ) ; System. out. p r i n t l n ( ) ; Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 18 / 44 Υλοποίηση Ταξινόμησης Επιλογής Υλοποίηση Ταξινόμησης Επιλογής s e l e c t i o n S o r t ( ) { ( i = 0 ; i < nelems 1; i + +) { j = i ; ( t = i + 1 ; t < nelems ; t ++) ( a [ t ] < a [ j ] ) j = t ; swap ( i, j ) ; swap ( one, two ) { temp = a [ one ] ; a [ one ] = a [ two ] ; a [ two ] = temp ; S e l e c t S o r t A p p { main ( S t r i n g [ ] a r g s ) { maxsize = 100; A r r a y S e l a r r ; a r r = A r r a y S e l ( maxsize ) ; a r r. i n s e r t ( 7 7 ) ; a r r. i n s e r t ( 9 9 ) ; a r r. i n s e r t ( 4 4 ) ; a r r. i n s e r t ( 5 5 ) ; a r r. i n s e r t ( 2 2 ) ; a r r. i n s e r t ( 8 8 ) ; a r r. i n s e r t ( 1 1 ) ; a r r. i n s e r t ( 0 0 ) ; a r r. i n s e r t ( 6 6 ) ; a r r. i n s e r t ( 3 3 ) ; a r r. d i s p l a y ( ) ; a r r. s e l e c t i o n S o r t ( ) ; a r r. d i s p l a y ( ) ; Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 19 / 44 Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 20 / 44
Ανασκόπηση Αλγόριθμου Επιλογής 3. Ταξινόμηση Παρεμβολής (Inser on Sort) i O(n 2 ) (καθορίζεται από το πλήθος των συγκρίσεων). Πολύ λιγότερες - O(n) - αντιμεταθέσεις, από τον αλγόριθμο φυσαλίδας. Για μικρό n, η ταξινόμηση επιλογής μπορεί να είναι σημαντικά ταχύτερη. Ειδικά εάν ο χρόνος που απαιτείται για μια αντιμετάθεση είναι πολύ μεγαλύτερος από το χρόνο μιας σύγκρισης. Επισκέπτεται κάθε θέση i = 0,..., n 1 της ακολουθίας εισόδου. i Διατρέχει «όπισθεν» την ακολουθία, a j a i, για j < i. Μετακινεί τα στοιχεία αυτά μία θέση «προς τα εμπρός». Εισάγει (παρεμβάλλει) το στοιχείο a i στην κενή θέση που δημιουργείται. Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 21 / 44 Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 22 / 44 Ταξινόμηση Παρεμβολής Παράδειγμα: Ταξινόμηση Παρεμβολής 23 12 58 7 10 Επεξεργασία του 12. i := 1 n 1: tmp := a[i] j := i j > 0 a j 1 tmp: a j := a j 1 j = j 1 a j := tmp Είσοδος: 1η Επαν.: 2η Επαν.: 3η Επαν.: 4η Επαν.: a 0 a 1 a 2 a 3 a 4 23 12 58 7 10 12 58 7 10 58 7 10 58 7 10 7 10 7 10 10 10 23 58 7 10 Μετακινούμε το 23 για να κάνουμε χώρο για το 12. 12 23 58 7 10 Εισάγουμε το 12 στη θέση 0. 12 23 58 7 10 Επεξεργασία του 7. 12 23 58 10 Μετακινούμε τα 12, 23, 58 για να κάνουμε χώρο για το 7. 7 12 23 58 10 Εισάγουμε το 7 στη θέση 0. 7 12 23 58 10 Επεξεργασία του 10. 7 12 23 58 Mετακινούμε τα 12, 23, 58, για να κάνουμε χώρο για το 10. Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 23 / 44 Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 24 / 44
Υλοποίηση Ταξινόμησης Παρεμβολής Υλοποίηση Ταξινόμησης Παρεμβολής A r r a y I n s { [ ] a ; nelems ; A r r a y I n s ( max ) { a = [ max ] ; nelems = 0 ; i n s e r t ( v a l u e ) { a [ nelems ] = v a l u e ; nelems + + ; d i s p l a y ( ) { ( j = 0 ; j < nelems ; j ++) System. out. p r i n t ( a [ j ] + ) ; System. out. p r i n t l n ( ) ; i n s e r t i o n S o r t ( ) { ( i = 1 ; i < nelems ; i + +) { temp = a [ i ] ; j = i ; ( j >0 && a [ j 1] >= temp ) { a [ j ] = a [ j 1]; j ; a [ j ] = temp ; Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 25 / 44 Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 26 / 44 Υλοποίηση Ταξινόμησης Παρεμβολής I n s e r t S o r t A p p { main ( S t r i n g [ ] a r g s ) { maxsize = 100; A r r a y I n s a r r ; a r r = A r r a y I n s ( maxsize ) ; a r r. i n s e r t ( 7 7 ) ; a r r. i n s e r t ( 9 9 ) ; a r r. i n s e r t ( 4 4 ) ; a r r. i n s e r t ( 5 5 ) ; a r r. i n s e r t ( 2 2 ) ; a r r. i n s e r t ( 8 8 ) ; a r r. i n s e r t ( 1 1 ) ; a r r. i n s e r t ( 0 0 ) ; a r r. i n s e r t ( 6 6 ) ; a r r. i n s e r t ( 3 3 ) ; a r r. d i s p l a y ( ) ; a r r. i n s e r t i o n S o r t ( ) ; a r r. d i s p l a y ( ) ; Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 27 / 44 Ανασκόπηση Ταξινόμησης Παρεμβολής Στο τέλος κάθε επανάληψης, τα στοιχεία με μικρότερους δείκτες από i είναι ταξινομημένα μεταξύ τους. n 1 επαναλήψεις (διότι το i είναι από 1 έως n 1). Στην i-οστή επαν.: ολίσθηση κατά 1 θέση το πολύ i 1 στοιχείων. Περίπου ίδιο πλήθος συγκρίσεων και αντιγραφών (ολισθήσεων). Αρα, συνολικό πλήθος βημάτων: n 1 (i 1) = 1 + 2 + + (n 2) = O(n 2 ) i=1 Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 28 / 44
Ταξινόμηση Αντικειμένων Ταξινομούνται και σύνθετα αντικείμενα, όχι μόνο οι βασικοί τύποι. Ταξινόμηση αντικειμένων τύπου Person. Χρήση ταξινόμησης παρεμβολής (inser on sort). Αλφαβητική ταξινόμηση βάσει του επωνύμου (πεδίο lastname). Παράδειγμα Ταξινόμησης Αντικειμένων Person { S t r i n g lastname ; S t r i n g f i r s t N a m e ; age ; Person ( S t r i n g l a s t, S t r i n g f i r s t, a ) { lastname = l a s t ; f i r s t N a m e = f i r s t ; age = a ; d i s p l a y P e r s o n ( ) { System. out. p r i n t ( L a s t name : + lastname ) ; System. out. p r i n t (, F i r s t name : + f i r s t N a m e ) ; System. out. p r i n t l n (, Age : + age ) ; S t r i n g g e t L a s t ( ) { lastname ; Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 29 / 44 Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 30 / 44 Παράδειγμα Ταξινόμησης Αντικειμένων Παράδειγμα Ταξινόμησης Αντικειμένων ArrayInOb { Person [ ] a ; nelems ; ArrayInOb ( max ) { a = Person [ max ] ; nelems = 0 ; i n s e r t ( S t r i n g l a s t, S t r i n g f i r s t, age ) { a [ nelems ] = Person ( l a s t, f i r s t, age ) ; nelems + + ; d i s p l a y ( ) { ( j = 0 ; j < nelems ; j ++) a [ j ]. d i s p l a y P e r s o n ( ) ; i n s e r t i o n S o r t ( ) { ( i = 1 ; i < nelems ; i ++) { Person temp = a [ i ] ; j = i ; ( j >0 && a [ j 1]. g e t L a s t ( ). compareto ( temp. g e t L a s t ( ) ) >0) { a [ j ] = a [ j 1]; j ; a [ j ] = temp ; Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 31 / 44 Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 32 / 44
O b j e c t S o r t A p p { main ( S t r i n g [ ] a r g s ) { maxsize = 100; ArrayInOb a r r ; a r r = ArrayInOb ( maxsize ) ; a r r. i n s e r t ( Evans, P a t t y, 24) ; a r r. i n s e r t ( Smith, Doc, 59) ; a r r. i n s e r t ( Smith, L o r r a i n e, 37) ; a r r. i n s e r t ( Smith, P a u l, 37) ; a r r. i n s e r t ( Yee, Tom, 43) ; a r r. i n s e r t ( Hashimoto, Sato, 21) ; a r r. i n s e r t ( Stimson, Henry, 29) ; a r r. i n s e r t ( V e l a s q u e z, J o s e, 72) ; System. out. p r i n t l n ( Before s o r t i n g : ) ; a r r. d i s p l a y ( ) ; a r r. i n s e r t i o n S o r t ( ) ; System. out. p r i n t l n ( A f t e r s o r t i n g : ) ; a r r. d i s p l a y ( ) ; Σύγκριση Αλγορίθμων Απλής Ταξινόμησης Η ταξινόμηση φυσαλίδας είναι απλή αλλά είναι χρήσιμη μόνο αν η ποσότητα των προς επεξεργασία δεδομένων είναι μικρή. Η ταξινόμηση επιλογής ελαχιστοποιεί τον αριθμό των αντιμεταθέσεων αλλά ο αριθμός των συγκρίσεων παραμένει υψηλός. Μπορεί να είναι χρήσιμη όταν η ποσότητα των δεδομένων είναι μικρή και η αντιμετάθεση των στοιχείων είναι πολύ χρονοβόρα σε σχέση με τη σύγκρισή τους. Η ταξινόμηση παρεμβολής είναι πιο ευέλικτη και η καλύτερη επιλογή στις περισσότερες περιπτώσεις, αν υποθέσουμε ότι η ποσότητα των δεδομένων είναι μικρή ή τα δεδομένα είναι σχεδόν ταξινομημένα. Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 33 / 44 Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 34 / 44 Ταξινόμηση Συγχώνευσης Παράδειγμα Συγχώνευσης, Δίνονται δύο ταξινομημένοι πίνακες και. Ζητείται αλγόριθμος που δημιουργεί έναν ταξινομημένο πίνακα, που περιέχει τα στοιχεία των και. 1 Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 35 / 44
Παράδειγμα Συγχώνευσης Παράδειγμα Συγχώνευσης 1 2 1 2 3 Παράδειγμα Συγχώνευσης Παράδειγμα Συγχώνευσης 1 2 3 4 1 2 3 4 5
Παράδειγμα Συγχώνευσης Παράδειγμα Συγχώνευσης 1 2 3 4 5 6 1 2 3 4 5 6 7 Παράδειγμα Συγχώνευσης Παράδειγμα Συγχώνευσης 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 9
Παράδειγμα Συγχώνευσης Αλγόριθμος Συγχώνευσης (Merge) A[ i ] = και B[ j ] =, για i A.length και j B.length αντίστοιχα. 1 2 3 4 5 6 7 8 9 10 Επιστρέφει πίνακα C, με τα στοιχεία των A,B σε αύξουσα σειρά C νέος πίνακας μήκους A.length + B.length; i = 0; j = 0; k = 0,..., (A.length+B.length) 1 { A[ i ] < B[ j ] C[ k ] = A[ i ]; i = i + 1; { C[ k ] = B[ j ]; j = j + 1; C; O(n), για πίνακες A, B το πολύ n στοιχείων. Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 37 / 44 Ταξινόμηση Συγχώνευσης (Παράδειγμα) Ταξινόμηση Συγχώνευσης (Παράδειγμα) 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 Μετά το 1ο Βήμα (συγχωνεύσεις υποπινάκων μήκους 1): 15 16 13 14 11 12 9 10 7 8 5 6 3 4 1 2 Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 38 / 44 Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 38 / 44
Ταξινόμηση Συγχώνευσης (Παράδειγμα) Ταξινόμηση Συγχώνευσης (Παράδειγμα) 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 Μετά το 1ο Βήμα (συγχωνεύσεις υποπινάκων μήκους 1): 15 16 13 14 11 12 9 10 7 8 5 6 3 4 1 2 Μετά το 1ο Βήμα (συγχωνεύσεις υποπινάκων μήκους 1): 15 16 13 14 11 12 9 10 7 8 5 6 3 4 1 2 Μετά το 2ο Βήμα (συγχωνεύσεις υποπινάκων μήκους 2): 13 14 15 16 9 10 11 12 5 6 7 8 1 2 3 4 Μετά το 2ο Βήμα (συγχωνεύσεις υποπινάκων μήκους 2): 13 14 15 16 9 10 11 12 5 6 7 8 1 2 3 4 Μετά το 3ο Βήμα (συγχωνεύσεις υποπινάκων μήκους 4): 9 10 11 12 13 14 15 16 1 2 3 4 5 6 7 8 Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 38 / 44 Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 38 / 44 Ταξινόμηση Συγχώνευσης (Παράδειγμα) Ταξινόμηση Συγχώνευσης 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 Μετά το 1ο Βήμα (συγχωνεύσεις υποπινάκων μήκους 1): 15 16 13 14 11 12 9 10 7 8 5 6 3 4 1 2 Μετά το 2ο Βήμα (συγχωνεύσεις υποπινάκων μήκους 2): 13 14 15 16 9 10 11 12 5 6 7 8 1 2 3 4 Μετά το 3ο Βήμα (συγχωνεύσεις υποπινάκων μήκους 4): 9 10 11 12 13 14 15 16 1 2 3 4 5 6 7 8 Μπορώ να δημιουργήσω n 2 ταξινομημένα ζεύγη στοιχείων του πίνακα. Δηλαδή να ταξινομήσω κάθε ζεύγος, ανεξάρτητα από τα υπόλοιπα: { { { { A[ 0 ], A[ 1 ], A[ 2 ], A[ 3 ], A[ 4 ], A[ 5 ],..., A[ n 2 ], A[ n 1 ] 8 7 6 5 4 3 2 1 = 7 8 5 6 3 4 1 2 n 2 Οι πίνακες ενός στοιχείου εντός κάθε ζεύγους είναι ταξινομημένοι! Μετά το 4ο Βήμα (συγχωνεύσεις υποπινάκων μήκους 8): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Πόσο χρόνο χρειάζομαι για να συγχωνεύσω όλα τα ζευγάρια? O(n) Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 38 / 44 Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 39 / 44
Ταξινόμηση Συγχώνευσης Ταξινόμηση Συγχώνευσης Από το 1ο βήμα, έχω n 4 ζευγάρια υπο-πινάκων: κάθε πίνακας σε κάθε ζευγάρι έχει ακριβώς 2 στοιχεία στη σωστή σειρά, είναι ταξινομημένος: { [ ] [ ] { [ ] [ ] A 0 1, A 2 3, A 4 5, A 6 7,..., { [ ] [ ]..., A (n 4) (n 3), A (n 2) (n 1) Συγχωνεύσω 2 γειτονικά ζεύγη υπο-πινάκων (2 στοιχείων έκαστος). 7 8 5 6 3 4 1 2 = 5 6 7 8 1 2 3 4 Από το 2ο βήμα, έχω n 8 ζευγάρια υπο-πινάκων: κάθε πίνακας σε κάθε ζευγάρι έχει ακριβώς 4 στοιχεία στη σωστή σειρά, είναι ταξινομημένος: { [ ] [ ] { [ ] [ ] A 0 3, A 4 7, A 8 11, A 12 15,..., { [ ] [ ]..., A (n 6) (n 3), A (n 4) (n 1) Συγχωνεύω 2 γειτονικά ζεύγη υπο-πινάκων (4 στοιχείων έκαστος). 5 6 7 8 1 2 3 4 = 1 2 3 4 5 6 7 8 Πόσο χρόνο χρειάζομαι για να συγχωνεύσω όλα τα n 4 ζεύγη? O(n) Πόσο χρόνο χρειάζομαι για να συγχωνεύσω όλα τα n 8 ζεύγη? O(n) Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 40 / 44 Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 41 / 44 Πολυπλοκότητα Ταξινόμησης Συγχώνευσης Ταξινόμηση Συγχώνευσης: Λεπτομέρειες Υλοποίησης Κάθε βήμα (συγχωνεύσεις γειτονικών υποπινάκων) σε O(n) χρόνο. Χρειάζεται εκτίμηση του πλήθους των βημάτων. Στο τέλος κάθε βήματος έχει: ζευγών προς συγχώνευση. έχει των ταξινομημένων υπο-πινάκων. Αν ο αλγόριθμος κάνει k βήματα συγχωνεύσεων, στο k-στό βήμα: Μήκος ταξινομημένου υποπίνακα: 2 k = n. Επομένως, k = log n. Αρα η πολυπλοκότητα του αλγορίθμου είναι O(n log n). Είσοδος της είναι ο πίνακας A και το τρέχον μήκος υποπινάκων. Συγχωνεύονται ζεύγη γειτονικών υποπινάκων του τρέχοντος μήκους: μέσα σε έναν νέο, προσωρινό πίνακα, αντιγράφουμε το αποτέλεσμα πίσω στον A, στις θέσεις που καταλάμβαναν οι υποπίνακες κάθε ζεύγους. Ειδική περίπτωση: αν το πλήθος των στοιχείων δεν είναι δύναμη του 2. Ο 2ος υποπίνακας του τελευταίου ζευγαριού έχει ένα στοιχείο λιγότερο ή περισσότερο. Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 42 / 44 Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 43 / 44
Πολυπλοκότητα Ταξινόμησης Συγχώνευσης Ο. Τελέλης Πανεπιστήμιο Πειραιώς Δομές Δεδομένων 44 / 44