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

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

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

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

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

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

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

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

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

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

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

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

Δομημένος Προγραμματισμός (ΤΛ1006)

που θα δώσει αποτέλεσµα 48, λόγω της αριστερής προσεταιριστικότητας των τελεστών / και *, ενώ η επιθυµητή αντικατάσταση θα ήταν η

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

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

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

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

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

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

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

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

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

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

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

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

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

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

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

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

Αναζήτηση και ταξινόμηση

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

Πίνακες. 1 Πίνακες. 30 Μαρτίου 2014

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Προγραμματισμός Η/Υ. Ενότητα 8: Ειδικά Θέματα Αλγορίθμων

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

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

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

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

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

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

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

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

Προγραµµατισµός Ι Εργαστήριο 6ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 6 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

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

Ταξινόμηση. 1. Ταξινόμηση του Shell. Εισαγωγή στην Ανάλυση Αλγορίθμων Μάγια Σατρατζέμη

Προγραµµατισµός Ι Εργαστήριο 6ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 6 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Εισαγωγή στον Προγραµµατισµό. Πανεπιστήµιο Θεσσαλίας Τµήµα Ηλεκτρολόγων Μηχανικών και Μηχανικών Η/Υ

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

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

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

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

Σύνοψη Προηγούμενου. Πίνακες (Arrays) Πίνακες (Arrays): Βασικές Λειτουργίες. Πίνακες (Arrays) Ορέστης Τελέλης

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #5

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

Στοιχεία Αλγορίθµων και Πολυπλοκότητας

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

Σημειώσεις δεύτερης εβδομάδας

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

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

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

Πίνακες. Οι πίνακες αποτελούν ένα σηµαντικό δοµηµένο τύπο δεδοµένων (structured data type) ή πιο απλά µία δοµή δεδοµένων (data structure).

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

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

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

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

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

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

Εισαγωγή στον δομημένο προγραμματισμό

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

Δομές Δεδομένων. Ενότητα 4: Ο ΑΤΔ Λίστα & Υλοποίηση Λίστας με σειριακή αποθήκευση- Ο ΑΤΔ Συνδεδεμένη Λίστα- Υλοποίηση ΑΤΔ Συνδεδεμένη Λίστα με πίνακα

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

Προγραμματισμός Ι (HY120)

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

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

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

Προεπεξεργαστής C. Προγραμματισμός Ι 1

Περιεχόμενα. Πρόλογος... 17

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

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

Προγραμματισμό για ΗΜΥ

ΠΡΟΓΡΜΜΑΤΑ ΣΕ C. Γράψτε σε γλώσσα προγραμματισμού C τη συνάρτηση:

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

Διαδικασιακός Προγραμματισμός

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

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

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

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

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

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

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

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 }

υναµική έσµευση Μνήµης (συν.) ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 Εφαρµογή

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

Bubble Hack Οπτικοποίηση του αλγορίθμου ταξινόμησης Bubble Sort στο Scratch

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

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

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

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

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

Transcript:

Αλγόριθμοι Ταξινόμησης Μέρος 1 Μανόλης Κουμπαράκης 1

Το Πρόβλημα της Ταξινόμησης Το πρόβλημα της ταξινόμησης (sorting) μιας ακολουθίας στοιχείων με κλειδιά ενός γνωστού τύπου (π.χ., τους ακέραιους ή τις συμβολοσειρές) είναι ένα από τα πιο ενδιαφέροντα προβλήματα στην Πληροφορική. Έχει μελετηθεί διεξοδικά και πολλές σχετικές δομές δεδομένων και αλγόριθμοι έχουν προταθεί. Θα παρουσιάσουμε μερικούς από αυτούς τους αλγόριθμους σ αυτό το μέρος του μαθήματος. Θα ασχοληθούμε κυρίως με ταξινόμηση πινάκων με ακέραια κλειδιά. Τα στοιχεία του πίνακα θα πρέπει να ταξινομηθούν σε αύξουσα σειρά. Οι μέθοδοι που θα παρουσιάσουμε μπορούν να επεκταθούν σε άλλες δομές δεδομένων (π.χ., συνδεδεμένες λίστες) ή τύπους κλειδιών (π.χ., συμβολοσειρές). 2

Στοιχειώδεις Μέθοδοι Ταξινόμησης Θα μελετήσουμε πρώτα διάφορους στοιχειώδεις αλγόριθμους ταξινόμησης. Οι αλγόριθμοι αυτοί είναι προτιμότεροι των πιο πολύπλοκων αλγορίθμων ταξινόμησης που θα παρουσιάσουμε στη συνέχεια αν έχουμε μικρούς πίνακες ή πίνακες με ειδική δομή. 3

Ταξινόμηση με Επιλογή Ο αλγόριθμος της ταξινόμησης με επιλογή (selection sort) λειτουργεί ως εξής. Πρώτα βρίσκει το μικρότερο στοιχείο του πίνακα και το αντιμεταθέτει με το στοιχείο που βρίσκεται στην πρώτη θέση του πίνακα. Έπειτα βρίσκει το δεύτερο μικρότερο στοιχείο και το αντιμεταθέτει με το στοιχείο που βρίσκεται στην δεύτερη θέση, και συνεχίζει με αυτό τον τρόπο μέχρι να ταξινομηθεί ολόκληρος ο πίνακας. 4

Παράδειγμα A S O R T I N G E X A M P L E A S O R T I N G E X A M P L E A A O R T I N G E X S M P L E A A E R T I N G O X S M P L E A A E E T I N G O X S M P L R A A E E G I N T O X S M P L R A A E E G I N T O X S M P L R A A E E G I L T O X S M P N R A A E E G I L M O X S T P N R A A E E G I L M N X S T P O R A A E E G I L M N O S T P X R A A E E G I L M N O P T S X R A A E E G I L M N O P R S X T A A E E G I L M N O P R S X T A A E E G I L M N O P R S T X A A E E G I L M N O P R S T X 5

Υλοποίηση σε C Θα δώσουμε κώδικα στη γλώσσα προγραμματισμού C που υλοποιεί τους διάφορους αλγόριθμους ταξινόμησης που παρουσιάζουμε. Οι συναρτήσεις που θα δώσουμε θα μπορούν να αντικαταστήσουν τη γενική συνάρτηση sort που χρησιμοποιούμε παρακάτω. Στο αρχείο διεπαφής δίνονται όλοι οι ορισμοί τύπων και όλες οι μακροεντολές που θα χρησιμοποιήσουμε. 6

Υλοποίηση σε C: Αρχείο Διεπαφής #ifndef SORTING_INCLUDED #define SORTING_INCLUDED sorting.h /* Macros to be used in sorting algorithms */ #define key(a) (A) #define less(a, B) (key(a) < key(b)) #define exch(a, B) { Item t = A; A = B; B = t; } #define compexch(a, B) if (less(b, A)) exch(a, B) /* Item is the type of elements in the arrays to be sorted */ typedef int Item; /* Prototypes of sorting functions */ void sort(item a[], int l, int r); #endif 7

Υλοποίηση σε C: Το αρχείο main.c #include <stdio.h> #include <stdlib.h> /* Driver program to be used for demonstrating the functionality of sorting algorithms */ int main(int argc, char *argv[]) { int i, N = atoi(argv[1]), sw = atoi(argv[2]); int *a = malloc(n*sizeof(int)); if (sw) for (i = 0; i < N; i++) a[i] = 1000*(1.0*rand()/RAND_MAX); else while (scanf("%d", &a[n]) == 1) N++; /* call the sorting algorithm */ sort(a, 0, N-1); for (i = 0; i < N; i++) printf("%3d ", a[i]); printf("\n"); } return 0; 8

Υλοποίηση σε C: Το αρχείο sort.c void sort(item a[], int l, int r) { /* details of the sorting algorithm */ } 9

Σχόλια για το main.c Η συνάρτηση int rand(void) επιστρέφει ένα ψευδοτυχαίο ακέραιο στο διάστημα 0 έως RAND_MAX που είναι τουλάχιστον 32767. Η κλήση του εκτελέσιμου προγράμματος πρέπει να δίνει τιμές στο N και το sw. Με sw==1, το πρόγραμμα γεμίζει τον πίνακα a που θα ταξινομηθεί με N ψευδοτυχαίους αριθμούς. Με N=0 και sw=0, το πρόγραμμα αναμένει από το χρήστη να εισάγει όσους ακεραίους θέλει στον πίνακα a (και να τερματίσει με EOF). 10

Ταξινόμηση με Επιλογή στη C void selection(item a[], int l, int r) { int i, j; for (i = l; i < r; i++) { int min = i; for (j = i+1; j <= r; j++) if (less(a[j], a[min])) min = j; exch(a[i], a[min]); } } 11

Ιδιότητες Στον εσωτερικό βρόχο του αλγόριθμου ταξινόμησης με επιλογή γίνεται απλώς μια σύγκριση του τρέχοντος στοιχείου με το μικρότερο στοιχείο που έχει βρεθεί μέχρι εκείνη τη στιγμή. Η εργασία μετακίνησης των στοιχείων βρίσκεται έξω από τον εσωτερικό βρόχο: κάθε αντιμετάθεση τοποθετεί ένα στοιχείο στην τελική του θέση, οπότε το πλήθος των αντιμεταθέσεων είναι n 1 όπου n είναι το πλήθος των στοιχείων του πίνακα (δεν χρειάζεται αντιμετάθεση για το τελευταίο στοιχείο). Ο χρόνος εκτέλεσης του αλγόριθμου ταξινόμησης με εισαγωγή εξαρτάται επίσης από το πλήθος των συγκρίσεων. Για κάθε i από 1 μέχρι n 1, γίνεται μια αντιμετάθεση και n i συγκρίσεις. Επομένως έχουμε n 1 + n 2 + + 2 + 1 = n(n 1) 2 συγκρίσεις. Επομένως η χρονική πολυπλοκότητα του αλγόριθμου ταξινόμησης με εισαγωγή είναι O(n 2 ) στη χειρότερη περίπτωση. Η πολυπλοκότητα είναι ίδια στη μέση περίπτωση. 12

Ιδιότητες Ένα μειονέκτημα της ταξινόμησης με επιλογή είναι ότι ο χρόνος εκτέλεσης εξαρτάται ελάχιστα από την έκταση της υπάρχουσας ταξινόμησης σε ένα πίνακα. Έτσι μπορεί να απαιτείται ο ίδιος σχεδόν χρόνος εκτέλεσης για ένα πίνακα που είναι ήδη ταξινομημένος, για ένα πίνακα του οποίου όλα τα κλειδιά είναι ίσα και για ένα πίνακα που έχει τυχαία ταξινόμηση. 13

Ιδιότητες Η ταξινόμηση με επιλογή είναι η προτιμώμενη μέθοδος για την ταξινόμηση πινάκων με πολύ μεγάλα στοιχεία (υλοποιημένα ως δομές struct) και μικρά κλειδιά. Για τέτοιες εφαρμογές, το κόστος της μετακίνησης δεδομένων είναι μεγαλύτερο από το κόστος εκτέλεσης των συγκρίσεων. Κανένας αλγόριθμος δεν μπορεί να ταξινομήσει ένα πίνακα με σημαντικά λιγότερες μετακινήσεις δεδομένων από τον αλγόριθμο ταξινόμησης με επιλογή. 14

Ταξινόμηση με Εισαγωγή Η μέθοδος της ταξινόμησης με εισαγωγή (insertion sort) λειτουργεί ως εξής. Διατρέχουμε τον πίνακα ξεκινώντας από την αρχή του. Εισάγουμε κάθε στοιχείο που επισκεπτόμαστε στη θέση που πρέπει να είναι ανάμεσα στα ήδη ταξινομημένα στοιχεία. Δημιουργούμε χώρο για να εισάγουμε το νέο στοιχείο μετακινώντας τα μεγαλύτερα στοιχεία μια θέση δεξιά, και στη συνέχεια εισάγουμε το νέο στοιχείο στην κενή θέση. 15

Παράδειγμα A S O R T I N G E X A M P L E A S O R T I N G E X A M P L E A O S R T I N G E X A M P L E A O R S T I N G E X A M P L E A O R S T I N G E X A M P L E A I O R S T N G E X A M P L E A I N O R S T G E X A M P L E A G I N O R S T E X A M P L E A E G I N O R S T X A M P L E A E G I N O R S T X A M P L E A A E G I M N O R S T X P L E A A E G I M N O P R S T X L E A A E G I L M N O P R S T X E A A E E G I L M N O P R S T X A A E E G I L M N O P R S T X 16

Υλοποίηση σε C void simpleinsertion(item a[], int l, int r) { int i, j; } for (i = l+1; i <= r; i++) for (j = i; j > l; j--) compexch(a[j-1], a[j]); 17

Ερώτηση Μπορείτε να σκεφτείτε βελτιώσεις στον κώδικα της προηγούμενης συνάρτησης simpleinsertion; 18

Μια Καλύτερη Υλοποίηση void insertion(item a[], int l, int r) { int i; for (i = l+1; i <= r; i++) compexch(a[l], a[i]); } for (i = l+2; i <= r; i++) { int j = i; Item v = a[i]; while (less(v, a[j-1])) { a[j] = a[j-1]; j--; } a[j] = v; } 19

Παρατηρήσεις για τη Συνάρτηση insertion Η συνάρτηση insertion αποτελεί σημαντική βελτίωση της συνάρτησης simpleinsertion επειδή: Τοποθετεί αρχικά το μικρότερο στοιχείο του πίνακα στην πρώτη θέση έτσι ώστε αυτό το στοιχείο να μπορεί να παίξει το ρόλο φρουρού (sentinel). Έτσι δεν χρειαζόμαστε τον έλεγχο j > l της simpleinsertion. Στον εσωτερικό βρόχο εκτελεί μια ανάθεση τιμής αντί για αντιμετάθεση. Τερματίζει τον εσωτερικό βρόχο μόλις το στοιχείο που εισάγεται βρεθεί στη σωστή θέση. 20

Ιδιότητες Αντίθετα από την ταξινόμηση με επιλογή, ο χρόνος εκτέλεσης της ταξινόμησης με εισαγωγή εξαρτάται κυρίως από την αρχική σειρά των κλειδιών των δεδομένων εισόδου. Για παράδειγμα, αν ο πίνακας είναι μεγάλος και τα κλειδιά ήδη ταξινομημένα (ή σχεδόν ταξινομημένα), η ταξινόμηση με εισαγωγή είναι γρήγορη ενώ η ταξινόμηση με επιλογή είναι αργή. 21

Ιδιότητες Μπορούμε να αποδείξουμε ότι η ταξινόμηση με εισαγωγή έχει χρονική πολυπλοκότητα O(n 2 ) στη χειρότερη και στη μέση περίπτωση. 22

Ταξινόμηση Φυσαλίδας Η ταξινόμηση φυσαλίδας (bubblesort) είναι ίσως η μέθοδος ταξινόμησης που οι περισσότεροι προγραμματιστές μαθαίνουν πρώτη. Κατά την ταξινόμηση φυσαλίδας, συνεχίζουμε να σαρώνουμε τον πίνακα, αντιμεταθέτοντας τα γειτονικά στοιχεία που βρίσκονται σε λάθος σειρά, μέχρι το αρχείο τελικά να ταξινομηθεί πλήρως. Η ταξινόμηση φυσαλίδας υλοποιείται εύκολα όπως και η ταξινόμηση με επιλογή ή εισαγωγή. 23

Παράδειγμα A S O R T I N G E X A M P L E A A S O R T I N G E X E M P L A A E S O R T I N G E X L M P A A E E S O R T I N G L X M P A A E E G S O R T I N L M X P A A E E G I S O R T L N M P X A A E E G I L S O R T M N P X A A E E G I L M S O R T N P X A A E E G I L M N S O R T P X A A E E G I L M N O S P R T X A A E E G I L M N O P S R T X A A E E G I L M N O P R S T X A A E E G I L M N O P R S T X A A E E G I L M N O P R S T X A A E E G I L M N O P R S T X 24

Υλοποίηση σε C void bubble(item a[], int l, int r) { int i, j; } for (i = l; i < r; i++) for (j = r; j > i; j--) compexch(a[j-1], a[j]); 25

Παρατηρήσεις στη Συνάρτηση bubble Για κάθε i μεταξύ l και r-1, ο εσωτερικός βρόχος τοποθετεί το μικρότερο από τα στοιχεία a[i],, a[r] στο a[i], σαρώνοντας τα στοιχεία από δεξιά προς τα αριστερά και συγκρίνοντας και αντιμεταθέτοντας διαδοχικά στοιχεία. Σε όλες τις συγκρίσεις, το μικρότερο στοιχείο μετακινείται προς τα πάνω σαν φυσαλίδα. Όπως και στην ταξινόμηση με επιλογή, καθώς ο αριθμοδείκτης i κινείται από αριστερά προς τα δεξιά, τα στοιχεία αριστερά τους βρίσκονται στην τελική τους θέση στον πίνακα. 26

Ιδιότητες Ο αλγόριθμος της ταξινόμησης φυσαλίδας μπορεί να βελτιωθεί ελέγχοντας για την περίπτωση που δεν γίνεται καμία αντιμετάθεση σε κάποια από τις διελεύσεις που σημαίνει ότι ο πίνακας είναι ήδη ταξινομημένος και μπορούμε να βγούμε από τον εξωτερικό βρόχο. 27

Ιδιότητες Κατά την i-οστή διέλευση του εσωτερικού βρόχου, η ταξινόμηση φυσαλίδας κάνει n i συγκρίσεις. Στη χειρότερη περίπτωση που ο πίνακας είναι ταξινομημένος με αντίστροφη σειρά, κατά την i-οστή διέλευση του εσωτερικού βρόχου, η ταξινόμηση φυσαλίδας κάνει n i αντιμεταθέσεις. Οπότε στη χειρότερη περίπτωση έχουμε O(n 2 ) συγκρίσεις και αντιμεταθέσεις, άρα η χρονική πολυπλοκότητα της ταξινόμησης φυσαλίδας είναι O(n 2 ) στη χειρότερη περίπτωση. Μπορούμε να αποδείξουμε ότι η πολυπλοκότητα είναι ίδια στη μέση περίπτωση. 28

Ο Αλγόριθμος Ταξινόμησης shellsort Η κεντρική ιδέα του αλγόριθμου shellsort είναι να αναδιατάξουμε τον δοσμένο πίνακα ώστε να αποκτήσει την παρακάτω ιδιότητα. Όταν παίρνουμε κάθε h-οστό στοιχείο του πίνακα ξεκινώντας οπουδήποτε, να έχουμε ένα ταξινομημένο υποπίνακα. Ένας τέτοιος πίνακας λέγεται h-ταξινομημένος. Δηλαδή, ένας h-ταξινομημένος πίνακας αποτελείται από ανεξάρτητους υποπίνακες που είναι ταξινομημένοι. Με την h-ταξινόμηση για μεγάλες τιμές του h, μπορούμε να μετακινήσουμε τα στοιχεία του πίνακα σε μεγάλες αποστάσεις και να διευκολύνουμε την h-ταξινόμηση για μικρές τιμές του h. Χρησιμοποιώντας τη διαδικασία της h-ταξινόμησης για οποιαδήποτε ακολουθία τιμών του h που καταλήγει στο 1, έχουμε ένα ταξινομημένο πίνακα. Κάθε h-ταξινόμηση γίνεται χρησιμοποιώντας τον αλγόριθμο ταξινόμησης με εισαγωγή. 29

Υλοποίηση σε C void shellsort(item a[], int l, int r) { int i, j, h; } for (h = 1; h <= (r-l)/9; h = 3*h+1) ; for ( ; h > 0; h /= 3) for (i = l+h; i <= r; i++) { int j = i; Item v = a[i]; while (j >= l+h && less(v, a[j-h])) { a[j] = a[j-h]; j -= h; } a[j] = v; } 30

Παρατηρήσεις στη Συνάρτηση shellsort Η υλοποίηση που παρουσιάσαμε χρησιμοποιεί την εξής ακολουθία τιμών του h: 1, 4, 13, 40, 121, Η ακολουθία αυτή προτάθηκε από τον Knuth το 1969, είναι εύκολο να υπολογιστεί και οδηγεί σε μια σχετικά αποδοτική ταξινόμηση για μεγάλους πίνακες. Γενικά, θέλουμε να χρησιμοποιούμε ακολουθίες τιμών που μειώνονται με γεωμετρικό τρόπο με συνέπεια το πλήθος των τιμών του h που θα χρησιμοποιήσουμε να είναι λογαριθμικό στο μέγεθος του πίνακα. 31

Ιδιότητες Η μαθηματική ανάλυση της μεθόδου ταξινόμησης shellsort είναι αρκετά δύσκολη. Μια ενδιαφέρουσα ιδιότητα είναι η παρακάτω. Η ταξινόμηση shellsort εκτελεί λιγότερες από O(n 3 2) συγκρίσεις για την ακολουθία τιμών του h που δώσαμε. 32

Μελέτη Robert Sedgewick. Αλγόριθμοι σε C. 3 η Αμερικανική Έκδοση. Εκδόσεις Κλειδάριθμος. Κεφ. 6 33