ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 8 Ο Ταξινόμηση και Αναζήτηση Συναρτήσεις χειρισμού οθόνης ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 1
Εισαγωγή Η τακτοποίηση των δεδομένων με ιδιαίτερη σειρά είναι πολύ σημαντική λειτουργία που ονομάζεται ταξινόμηση ή διάταξη. Συνήθως η σειρά αυτή είναι με αύξουσα τάξη της τιμής των μεγεθών. Τα ταξινομημένα δεδομένα διευκολύνουν την αναζήτηση. Το πρόβλημα της αναζήτησης στοιχείου σε ομάδα δεδομένων (αριθμητικών ή αλφαριθμητικών) είναι ιδιαίτερα ενδιαφέρον στον προγραμματισμό επειδή εμφανίζεται σε πλήθος εφαρμογών. Υπάρχουν αρκετές μέθοδοι αναζήτησης που εξαρτώνται κυρίως από το, αν η ομάδα είναι ταξινομημένη ή όχι. Άλλο καθοριστικό στοιχείο είναι αν η ομάδα περιέχει στοιχεία που είναι όλα διάφορα μεταξύ τους ή όχι. Με τον όρο χειρισμό οθόνης εννοούμε τη χρήση συναρτήσεων με τις οποίες μπορεί ο προγραμματιστής να χειρίζεται την εμφάνιση αποτελεσμάτων στην κονσόλα. Η οθόνη γενικά έχει 80 θέσεις χαρακτήρων οριζόντια και 25 γραμμές κατακόρυφα. Έτσι μπορεί να οδηγηθεί η θέση του δρομέα σε μία από αυτές ή αντίστοιχα να αναγνωρισθεί η θέση στην οποία βρίσκεται. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 2
Ταξινόμηση φυσαλίδας H μέθοδος φυσαλίδας συγκρίνει και ανταλλάσσει ζεύγη γειτονικών στοιχείων, μέχρις ότου διαταχθούν όλα τα στοιχεία. Έτσι διαδοχικές προσπελάσεις στον πίνακα μετακινούν το μικρότερο στοιχείο της ακολουθίας προς το αριστερό άκρο του. Παράδειγμα για να ταξινομηθούν οι αριθμοί 5, 1, 4, 2 και 8 σε αύξουσα σειρά θα έχουμε στο πρώτο πέρασμα ανταλλαγή του 5 με το 1 οπότε το 5 θα βρεθεί στη δεύτερη θέση και θα συγκριθεί με το επόμενο 4 που ως μικρότερο επίσης πρέπει να ανταλλαγεί και στη συνέχεια το ίδιο με το 2 οπότε διαδοχικά θα έχουμε τα πιο κάτω στιγμιότυπα (5 14 2 8) (1 5 42 8) (1 4 5 28) (1 4 2 5 8). Σε δεύτερο πέρασμα βρίσκει ότι πρέπει να ανταλλαγεί το 4 με το 2 και στη συνέχεια τα βρίσκει σωστά, οπότε στο δεύτερο πέρασμα θα έχουμε την εικόνα (1 4 2 5 8) (1 4 2 5 8) (1 2 4 58) (1 2 4 5 8). Επειδή ο αλγόριθμος δεν μπορεί να γνωρίζει ότι ολοκληρώθηκε η διαδικασία κάνει ακόμα έναν έλεγχο εξ αρχής, χωρίς βέβαια στην περίπτωσή μας να χρειασθεί να κάνει οποιαδήποτε ανταλλαγή (1 2 4 5 8). ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 3
Ταξινόμηση με επιλογή Η μέθοδος βασίζεται στα εξής, αρχικά επιλέγεται το μικρότερο στοιχείο της ομάδας και ανταλλάσσεται με το πρώτο στοιχείο της, στη συνέχεια επαναλαμβάνεται η ίδια διαδικασία για τα υπόλοιπα στοιχεία, μέχρι να μείνει ένα, το τελευταίο. Στο πιο κάτω σχήμα φαίνεται καθαρά η διαδικασία. Παράδειγμα Αν το παρακολουθήσει κανείς προσεκτικά παρατηρεί ότι εντοπίζεται ως η ελάχιστη τιμή το 0 και τοποθετείται στην κορυφή. Στον επόμενο κύκλο το ίδιο γίνεται με τα υπόλοιπα στοιχεία και το 1 τοποθετείται στη δεύτερη θέση, μετά το 2 το 3 κ.ο.κ. Δεν είναι ο καλύτερος τρόπος γιατί διατρέχει πολλές φορές τα στοιχεία και βέβαια αν αυτά είναι πολλά γίνεται αντιληπτό ότι θα καθυστερεί όλο και περισσότερο. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 4
Ταξινόμηση με εισαγωγή Ξεκινώντας από το δεύτερο στοιχείο της ομάδας και σε κάθε κύκλο εξετάζοντας το στοιχείο της επόμενης θέσης, αυτό συγκρίνεται με τα αριστερότερά του και τοποθετείται στην θέση που του αρμόζει σε σχέση με αυτά μετακινώντας, όταν χρειάζεται τα στοιχεία αυτά προς τα δεξιά του κατά μία θέση. Παρατηρείστε την πιο κάτω διαδικασία 44 55 12 42 94 18 06 67 44 55 12 42 94 18 06 67 12 44 55 42 94 18 06 67 12 42 44 55 94 18 06 67 12 42 44 55 94 18 06 67 12 18 42 44 55 94 06 67 06 12 18 42 44 55 94 67 06 12 18 42 44 55 67 94 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 5
Γρήγορη ταξινόμηση Ο αλγόριθμος βασίζεται στην αρχή της αντιμετάθεσης και είναι η καλύτερη γνωστή μέθοδος ταξινόμησης για τυχαία στοιχεία. Ηγρήγορη ταξινόμηση στηρίζεται στη λογική διαίρει και βασίλευε. Αυτό που κάνει σε κάθε βήμα του αλγορίθμου της, διαιρεί το σύνολο της ομάδας που χειρίζεται σε δύο μέρη το αριστερό με τους μικρότερους και στο δεξιό με τους μεγαλύτερους σε σχέση με έναν επιλεγμένο αριθμό της ομάδας αυτής, συνήθως τον πρώτο ή τον τελευταίο της. Έτσι αρχικά θεωρεί το σύνολο των αριθμών, στον δεύτερο κύκλο έχει δυο ομάδες και έναν αριθμό μονό, στον τρίτο κύκλο θα χειρισθεί τις νέες μικρότερες ομάδες με την ίδια λογική. Συνεχίζοντας με τον τρόπο αυτό ο αλγόριθμος ολοκληρώνεται όταν η μεγαλύτερη τελική ομάδα αποτελείται από τρία ταξινομημένα στοιχεία. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 6
Σειριακή αναζήτηση Η πιο απλή μορφή αναζήτησης στοιχείου είναι η σειριακή ή γραμμική μέθοδος. Για τη συνέχεια θα εφαρμόσουμε τις τεχνικές σε πίνακα στοιχείων, στον οποίο θα καταχωρούμε τυχαίες ακέραιες τιμές. Γιατολόγοαυτό προκειμένου να εντοπίσουμε κάποια τιμή, η οποία μάλιστα ενδέχεται να υπάρχει περισσότερες από μία φορές, πρέπει να διατρέξουμε όλα τα στοιχεία του πίνακα και μάλιστα να καταμετρήσουμε τις φορές που εντοπίσθηκε η αναζητούμενη τιμή. Η σειριακή αναζήτηση είναι η απλούστερη, αλλά και η λιγότερη αποτελεσματική μέθοδος. Εφαρμόζεται μόνο σε περιπτώσεις όπου: ο πίνακας είναι μη ταξινομημένος, ο πίνακας είναι μικρού μεγέθους (για παράδειγμα, n 20), η αναζήτηση στο συγκεκριμένο πίνακα γίνεται σπάνια. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 7
Δυαδική αναζήτηση Αποτελεί τον πιο αποδοτικό τρόπο αναζήτησης. Το τίμημα όμως που θέλει είναι τα υπό εξέταση στοιχεία να είναι ταξινομημένα. Η σειριακή αναζήτηση θα απαιτούσε να διαβάσουμε το μεγαλύτερο μέρος του τηλεφωνικού καταλόγου μέχρι να εντοπίσουμε τον Σινάτκα και αν αυτός δεν καταγράφεται ως συνδρομητής πρέπει να εξαντλήσουμε τον κατάλογο για να το αντιληφθούμε. Η δυαδική αναζήτηση μοιάζει με τον εντοπισμό της σελίδας 331 του βιβλίου σας. Ο αλγόριθμος με τον οποίο λειτουργεί είναι επίσης της λογικής διαίρει και βασίλευε. Ανοίγετε περίπου στη μέση το βιβλίο και αν η σελίδα που δείχνει είναι μικρότερη του 331 αγνοείτε τις προηγούμενες από την τρέχουσα σελίδες και συνεχίζετε με τις επόμενες. Αντίθετα αν είναι μεγαλύτερη συνεχίζετε με τις προηγούμενες. Ανοίγετε πάλι στη μέση περίπου της ομάδας σελίδων που θα χειρισθείτε και με παρόμοιο τρόπο περιορίζετε τις υπό εξέταση σελίδες. Τελικά διαιρώντας σε κάθε κύκλο το υπό εξέταση σύνολο θα εντοπίσετε την αναζητούμενη σελίδα. Παράδειγμα ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 8
Χειρισμός οθόνης Στην λογική να διευκολυνθεί η παρουσίαση αποτελεσμάτων ή η ανάγνωση στοιχείων από την κονσόλα οθόνη χαρακτήρων υπάρχει η δυνατότητα να οδηγείται ο δρομέας σε συγκεκριμένο σημείο της όπου μπορεί να γράψει ή και να αναγνωρίσει στοιχεία. Για τη διαχείριση αυτή απαιτείται να συμπεριληφθεί στο πρόγραμμα η βιβλιοθήκη <conio.h>. Η βιβλιοθήκη αυτή περιλαμβάνει τις πολύ χρήσιμες συναρτήσεις gotoxy (int x, int y) wherex() wherey() clrscr() clreol() Οδηγεί τον δρομέα στη στήλη x και την γραμμή y της οθόνης Επιστρέφει την τρέχουσα θέση της στήλης και της γραμμής αντίστοιχα Καθαρίζει την οθόνη κειμένου από ότι έχει γραφεί. Καθαρίζει την γραμμή κειμένου από το τρέχον σημείο του δρομέα μέχρι το τέλος της γραμμής. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 9