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

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

Εισαγωγή στους Η/Υ. Ενότητα 2β: Αντίστροφο Πρόβλημα. Δημήτρης Σαραβάνος, Καθηγητής Πολυτεχνική Σχολή Τμήμα Μηχανολόγων & Αεροναυπηγών Μηχανικών

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

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

Προγραμματισμός Η/Υ. Ενότητα 3: Top Down Σχεδιασμός

Προγραμματισμός Η/Υ. Ενότητα 5: Εντολές Επανάληψης

Οντοκεντρικός Προγραμματισμός

Διοικητική Λογιστική

Προγραμματισμός Η/Υ. Ενότητα 4: Εντολές Επιλογής

Πληροφορική ΙΙ Ενότητα 1

Θερμοδυναμική. Ανοικτά Ακαδημαϊκά Μαθήματα. Πίνακες Νερού σε κατάσταση Κορεσμού. Γεώργιος Κ. Χατζηκωνσταντής Επίκουρος Καθηγητής

Προγραμματισμός Η/Υ. Βασικές Προγραμματιστικές Δομές. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

ΠΛΗΡΟΦΟΡΙΚΗ Ι Ενότητα 8: Αναζήτηση και ταξινόμηση

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 3: Έλεγχοι στατιστικών υποθέσεων

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 1: Καταχώρηση δεδομένων

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

Ηλεκτρονικοί Υπολογιστές

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 2: Περιγραφική στατιστική

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

Λογιστική Κόστους Ενότητα 12: Λογισμός Κόστους (2)

Εισαγωγή στους Υπολογιστές

Τίτλος Μαθήματος: Μαθηματική Ανάλυση Ενότητα Γ. Ολοκληρωτικός Λογισμός

Δομημένος Προγραμματισμός

Βάσεις Περιβαλλοντικών Δεδομένων

Εισαγωγή στους Αλγορίθμους Ενότητα 9η Άσκηση - Αλγόριθμος Prim

Προγραμματισμός Η/Υ. Ενότητα 2β: Εισαγωγή στη C (Μέρος Δεύτερο)

Προγραμματισμός Η/Υ. Ενότητα 6: Πίνακες και Δείκτες

Λογιστική Κόστους Ενότητα 8: Κοστολογική διάρθρωση Κύρια / Βοηθητικά Κέντρα Κόστους.

Κβαντική Επεξεργασία Πληροφορίας

Διοικητική Λογιστική

Προγραμματισμός Η/Υ. Αναζήτηση & Ταξινόμηση. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

Θερμοδυναμική. Ανοικτά Ακαδημαϊκά Μαθήματα. Πίνακες Νερού Υπέρθερμου Ατμού. Γεώργιος Κ. Χατζηκωνσταντής Επίκουρος Καθηγητής

Μηχανολογικό Σχέδιο Ι

Εισαγωγή στους Αλγορίθμους Ενότητα 10η Άσκηση Αλγόριθμος Dijkstra

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

Εισαγωγή στους Η/Υ. Ενότητα 2α: Χάρτης Karnaugh (Βοηθητικό υλικό)

Μαθηματικά Διοικητικών & Οικονομικών Επιστημών

1 η Διάλεξη. Ενδεικτικές λύσεις ασκήσεων

Ενότητα. Εισαγωγή στις βάσεις δεδομένων

Κβαντική Επεξεργασία Πληροφορίας

Δομημένος Προγραμματισμός

Μυελού των Οστών Ενότητα #1: Ερωτήσεις κατανόησης και αυτόαξιολόγησης

Εισαγωγή στους Αλγορίθμους Ενότητα 9η Άσκηση - Αλγόριθμος Kruskal

Βέλτιστος Έλεγχος Συστημάτων

Δομημένος Προγραμματισμός

Δομημένος Προγραμματισμός

Διδακτική Πληροφορικής

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Προγραμματισμός Η/Υ. 8 η ενότητα: Περιβαλλοντικά και μαθηματικά προβλήματα. Τμήμα. Τεχνολόγων Περιβάλλοντος. ΤΕΙ Ιονίων Νήσων

Ενδεικτικές λύσεις ασκήσεων διαχείρισης έργου υπό συνθήκες αβεβαιότητας

Δομημένος Προγραμματισμός

Προγραμματισμός Η/Υ. 7 η ενότητα: Αρχεία. Τμήμα. Τεχνολόγων Περιβάλλοντος. ΤΕΙ Ιονίων Νήσων. Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων

Διεθνείς Οικονομικές Σχέσεις και Ανάπτυξη

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών

Διδακτική Πληροφορικής

ΣΥΜΠΕΡΙΦΟΡΑ ΚΑΤΑΝΑΛΩΤΗ

Τεχνικό Σχέδιο - CAD

Ιστορία της μετάφρασης

Γραμμική Άλγεβρα και Μαθηματικός Λογισμός για Οικονομικά και Επιχειρησιακά Προβλήματα

Μαθηματικά Διοικητικών & Οικονομικών Επιστημών

Ευφυής Προγραμματισμός

Μεθοδολογία Έρευνας Κοινωνικών Επιστημών Ενότητα 2: ΣΥΓΚΕΝΤΡΩΣΗ ΠΛΗΡΟΦΟΡΙΩΝ ΜΑΡΚΕΤΙΝΓΚ Λοίζου Ευστράτιος Τμήμα Τεχνολόγων Γεωπόνων-Kατεύθυνση

Προγραμματισμός H/Y Ενότητα 5: Συναρτήσεις. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Έλεγχος και Διασφάλιση Ποιότητας Ενότητα 4: Μελέτη ISO Κουππάρης Μιχαήλ Τμήμα Χημείας Εργαστήριο Αναλυτικής Χημείας

Τεχνικό Σχέδιο - CAD

Εισαγωγή στην Διοίκηση Επιχειρήσεων

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

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

Προγραμματισμός H/Y Ενότητα 2: Εντολές ελέγχου ροής. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

ΔΡΔ: Διαγράμματα Ροής Δεδομένων

Εισαγωγή στην Πληροφορική

Προγραμματισμός Η/Υ. Αλγόριθμοι. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

ΕΡΓΑΣΤΗΡΙΟ ΦΥΣΙΚΗΣ Ι ΘΕΩΡΙΑ ΣΦΑΛΜΑΤΩΝ. Κανονισμός Μαθήματος και Εργαστηρίου Καθηγήτρια Γεωργά Σταυρούλα Τμήμα Φυσικής

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ

Σχεδίαση και Ανάλυση Αλγορίθμων Ενότητα 6: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ: ΠΡΟΒΛΗΜΑ ΑΝΑΖΗΤΗΣΗΣ

Προγραμματισμός Η/Υ. 3 η ενότητα. Τμήμα. Τεχνολόγων Περιβάλλοντος. ΤΕΙ Ιονίων Νήσων. Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων

Εισαγωγή στους Υπολογιστές

Διοίκηση Εξωτερικής Εμπορικής Δραστηριότητας

Κβαντική Επεξεργασία Πληροφορίας

Λογιστική Κόστους Ενότητα 11: Λογισμός Κόστους (1)

Ψηφιακή Επεξεργασία Εικόνων

Προγραμματισμός H/Y Ενότητα 4: Δείκτες. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Αλγόριθμοι και πολυπλοκότητα Συγχωνευτική Ταξινόμηση

Διδακτική Πληροφορικής

Διδακτική Πληροφορικής

Εισαγωγή στους Αλγορίθμους Ενότητα 11η Άσκηση - Σταθμισμένος Χρονοπρογραμματισμός Διαστημάτων

Προγραμματισμός Η/Υ. 6 η ενότητα: Συναρτήσεις. Τμήμα. Τεχνολόγων Περιβάλλοντος. ΤΕΙ Ιονίων Νήσων. Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων

Εκκλησιαστικό Δίκαιο. Ενότητα 10η: Ιερά Σύνοδος της Ιεραρχίας και Διαρκής Ιερά Σύνοδος Κυριάκος Κυριαζόπουλος Τμήμα Νομικής Α.Π.Θ.

Μαθηματικά Διοικητικών & Οικονομικών Επιστημών

Τεχνικό Σχέδιο - CAD. Τόξο Κύκλου. Τόξο Κύκλου - Έλλειψη. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

Διαχείριση Πολιτισμικών Δεδομένων

ΗΛΕΚΤΡΟΝΙΚΗ ΙIΙ Ενότητα 6

Διοίκηση Επιχειρήσεων

Βάσεις Περιβαλλοντικών Δεδομένων

Transcript:

Προγραμματισμός Η/Υ Ενότητα 8: Ειδικά Θέματα Αλγορίθμων Νίκος Καρακαπιλίδης, Καθηγητής Δημήτρης Σαραβάνος, Καθηγητής Πολυτεχνική Σχολή Τμήμα Μηχανολόγων & Αεροναυπηγών Μηχανικών

Σκοποί ενότητας Κατανόηση της σύνταξης συναρτήσεων με βάση τα δεδομένα πινάκων Κατανόηση των μεθόδων της γραμμικής και δυαδικής αναζήτησης μιας παραμέτρου Κατανόηση των μεθόδων ταξινόμησης των παραμέτρων 2

Περιεχόμενα ενότητας Πέρασμα Πίνακα σε Συνάρτηση Προβλήματα Αναζήτησης Προβλήματα Ταξινόμησης 3

Μέρος 1 ο Πέρασμα Πίνακα σε Συνάρτηση

Πέρασμα Πίνακα σε Συνάρτηση

Πέρασμα Πίνακα σε Συνάρτηση Πέρασμα πίνακα Παράδειγμα: int my_array[24]; my_function(my_array, 24); Δίνουμε το όνομα του πίνακα (χωρίς [ ]) Συνήθως χρειάζεται να «περαστεί» και το μέγεθος του πίνακα Γίνεται «πέρασμα δια αναφοράς» (call by reference) Το όνομα του πίνακα είναι η διεύθυνση του πρώτου του στοιχείου Η συνάρτηση «γνωρίζει» που είναι αποθηκευμένος ο πίνακας 6

Πέρασμα Πίνακα σε Συνάρτηση Πέρασμα στοιχείων πίνακα Παράδειγμα: my_other_function(my_array[3]); Δίνουμε το όνομα του στοιχείου Γίνεται «πέρασμα δια τιμής» (call by value) 7

Πέρασμα Πίνακα σε Συνάρτηση Δήλωση (ή πρωτότυπο) συνάρτησης Παράδειγμα: void modify_array(int b[], int array_size); Τα ονόματα των παραμέτρων δεν είναι υποχρεωτικά στη δήλωση της συνάρτησης int b[] μπορεί να γραφεί απλά ως int [] int array_size μπορεί να γραφεί απλά ως int Επομένως, το παραπάνω παράδειγμα μπορεί να γραφεί ως: void modify_array(int [], int ); 8

Παράδειγμα 1 /* Example program Πέρασμα ολόκληρου πίνακα και στοιχείων πίνακα σε συναρτήσεις */ 2 Passing arrays and individual array elements to functions */ 3 #include <stdio.h> 4 #define SIZE 5 5 6 void modifyarray( int [], int ); /* function prototypes */ 7 void modifyelement( int ); 8 9 int main() 10 { 11 int a[ SIZE ] = { 0, 1, 2, 3, 4 }, i; 12 13 printf( "Effects of passing entire array call " 14 "by reference:\n\nthe values of the " 15 "original array are:\n" ); 9

Παράδειγμα 16 17 for ( i = 0; i <= SIZE - 1; i++ ) 18 printf( "%3d", a[ i ] ); 19 20 printf( "\n" ); 21 modifyarray( a, SIZE ); /* call by reference */ 22 printf( "The values of the modified array are:\n" ); 23 24 for ( i = 0; i <= SIZE - 1; i++ ) 25 printf( "%3d", a[ i ] ); 26 Ολόκληροι πίνακες: * Πέρασμα δια αναφοράς * Μπορούν να τροποποιηθούν Μεμονωμένα στοιχεία πίνακα: * Πέρασμα δια τιμής * Δεν μπορούν να τροποποιηθούν 27 printf( "\n\n\neffects of passing array element call " 28 "by value:\n\nthe value of a[3] is %d\n", a[ 3 ] ); 29 modifyelement( a[ 3 ] ); /* call by value */ 30 printf( "The value of a[ 3 ] is %d\n", a[ 3 ] ); 10

Παράδειγμα 31 return 0; 32 } 33 34 void modifyarray( int b[], int size ) /* function definition */ 35 { 36 int j; 37 38 for ( j = 0; j <= size - 1; j++ ) 39 b[ j ] *= 2; 40 } 41 42 void modifyelement( int e ) /* function definition */ 43 { 44 printf( "Value in modifyelement is %d\n", e *= 2 ); 45 } 11

Παράδειγμα output προγράμματος Effects of passing entire array call by reference: The values of the original array are: The values of the modified array are: 0 2 4 6 8 Effects of passing array element call by value: The value of a[3] is 6 Value in modifyelement is 12 The value of a[3] is 6 12

Μέρος 2 ο Προβλήματα Αναζήτησης

Προβλήματα Αναζήτησης Γραμμική και Δυαδική Αναζήτηση

Γραμμική Αναζήτηση Γενικά Απλός αλγόριθμος, χρήσιμος για μικρούς και μη ταξινομημένους πίνακες Παράδειγμα Να γραφεί πρόγραμμα που να ψάχνει έναν πίνακα ακεραίων στοιχείων (όνομα πίνακα: student_id) για να βρει σε ποια θέση του περιέχεται κάποια συγκεκριμένη τιμή (έστω η τιμή z) Αν η τιμή περιέχεται σε πολλές θέσεις του πίνακα, θέλουμε να βρίσκουμε μόνο την πρώτη από αυτές Το μέγεθος του πίνακα ορίζεται με τη σταθερά STUDENT_NUM 15

Γραμμική Αναζήτηση Αλγόριθμος επίλυσης προβλήματος Για κάθε στοιχείο του πίνακα εάν είναι ίσο με z Φύλαξε θέση Τερμάτισε την επανάληψη Χειρότερη περίπτωση: εξέταση όλων των στοιχείων του πίνακα int i;... for (i=0;i<student_num;++i) if (student_id[i]==z) break;... 16

Παράδειγμα Γραμμική Αναζήτηση (χρήση συνάρτησης) Να γραφεί συνάρτηση που αναζητά μέσα σε έναν πίνακα ακεραίων στοιχείων id_table τον αριθμό μητρώου id. Το μέγεθος του πίνακα (αριθμός φοιτητών) περιέχεται στην παράμετρο size. Εάν βρεθεί ο αριθμός μητρώου που ψάχνουμε, να επιστραφεί η θέση του πίνακα που τον περιέχει. Αλλιώς, να επιστραφεί η τιμή του size. int location_of_student(int id_table[], int size, int id) { int i; for(i=0;i<size;++i) if (student_id[i]==id) return i; return size; } 17

Αναζήτηση και ενημέρωση Παράδειγμα Έστω δύο παράλληλοι πίνακες (ίδιο μέγεθος) όπου αποθηκεύονται οι αριθμοί μητρώου και οι βαθμοί των φοιτητών για κάποιο μάθημα (έστω id_table και grade_table αντίστοιχα) Να γραφεί συνάρτηση που αναζητά μέσα στον πίνακα id_table κάποιον φοιτητή με αριθμό μητρώου id και στη συνέχεια ενημερώνει κατάλληλα τον πίνακα grade_table (μέσω κάποιας παραμέτρου new_grade) 18

Αναζήτηση και ενημέρωση Το μέγεθος των πινάκων (αριθμός φοιτητών) περιέχεται στην παράμετρο size Αν η ενημέρωση είναι επιτυχής, να επιστρέφεται «0». Αλλιώς (αν δεν βρεθεί ο συγκεκριμένος αριθμός μητρώου), να επιστρέφεται η τιμή «-1» int update_grade(int id_table[], float grade_table[], int size, int id, float new_grade) { int location = location_of_student(id_table,size,id); if (location == size) return -1; else { grade_table[location]= new_grade; return 0; } } 19

Μέτρηση (χρήση const) Παράδειγμα Να γραφεί συνάρτηση που υπολογίζει τον αριθμό των φοιτητών που έχουν πάρει (σε κάποιο μάθημα) βαθμό από 8 και πάνω καθώς και τον αριθμό αυτών που έχουν αποτύχει (βαθμός μικρότερος του 5) Οι βαθμοί είναι αποθηκευμένοι σε πίνακα μεγέθους size 20

Μέτρηση (χρήση const) void grade_count(const int grade_table[], int size, int *above_eight, int *below_five) { int i; *above_eight = *below_five = 0; for(i=0;i<size;++i) if (grade_table[i]>=8.0) ++*above_eight; else if (grade_table[i]<5) ++*below_five; } Σημασία χρήσης της const δηλώνει ότι δεν μπορεί να γίνει ανάθεση σε κάποια μεταβλητή (read only) Θέματα ασφάλειας Ιδιαίτερα χρήσιμη για παραμέτρους Π.χ., στο grade_count απαγορεύει την τροποποίηση των περιεχομένων του grade_table 21

Δυαδική αναζήτηση (binary search) Για ταξινομημένους πίνακες Σε αύξουσα ή φθίνουσα σειρά Συγκρίνει το μεσαίο στοιχείο ενός πίνακα (έστω middle) με το στοιχείο που ψάχνουμε (έστω key) Αν είναι ίσο, το στοιχείο βρέθηκε Αν key < middle, ψάχνει στο πρώτο μισό του πίνακα Αν key > middle, ψάχνει στο δεύτερο μισό του πίνακα Επανάληψη 22

Δυαδική αναζήτηση Πολύ γρήγορος αλγόριθμος Το πολύ N βήματα, όπου 2 N > (αριθμός στοιχείων πίνακα) Παράδειγμα: για πίνακα 30 στοιχείων χρειάζονται το πολύ 5 βήματα (2 5 > 30) Μεσαίο στοιχείο πίνακα Περιττό και άρτιο πλήθος στοιχείων 23

Δυαδική αναζήτηση Πρώτο παράδειγμα: Αναζήτηση 91 Πρώτο βήμα 5 6 7-23 3 35 61 71 88 91 111 min pos max 24

Δυαδική αναζήτηση Πρώτο παράδειγμα: Αναζήτηση 91 Δεύτερο βήμα 5 6 7-23 3 35 61 71 88 91 111 min pos max 25

Δυαδική αναζήτηση Πρώτο παράδειγμα: Αναζήτηση 91 Τρίτο βήμα 5 6 7-23 3 35 61 71 88 91 111 Το στοιχείο βρέθηκε!!! min pos max 26

Δυαδική αναζήτηση Δεύτερο παράδειγμα: Αναζήτηση 4 Πρώτο βήμα 5 6 7-23 3 35 61 71 88 91 111 min pos max 27

Δυαδική αναζήτηση Δεύτερο παράδειγμα: Αναζήτηση 4 Δεύτερο βήμα 5 6 7-23 3 35 61 71 88 91 111 min pos max 28

Δυαδική αναζήτηση Δεύτερο παράδειγμα: Αναζήτηση 4 Τρίτο βήμα 5 6 7-23 3 35 61 71 88 91 111 min pos max Το στοιχείο δεν υπάρχει!!! 29

Δυαδική αναζήτηση Κώδικας int binary_search(const int table[], int size, int item) { int min = 0, max = size 1, pos= (min + max)/2; while(min <= max){ if (item > table[pos]) min = pos + 1; else if (item < table[pos]) max = pos 1; else /* βρέθηκε */ return pos; pos = (min + max) / 2; } return -1; } 30

Μέρος 3 ο Προβλήματα Ταξινόμησης

Προβλήματα Ταξινόμησης Ταξινόμηση Φυσαλίδας και Επιλογής

Ταξινόμηση Γενικά Πολύ σπουδαία διεργασία Αύξουσα ή φθίνουσα σειρά Ταξινόμηση φυσαλίδας (bubble sort) Σύγκριση διαδοχικών ζευγαριών στοιχείων ενός πίνακα Αν είναι στην επιθυμητή σειρά, καμία αλλαγή Αν όχι, αντίστρεψε τη σειρά τους (ενάλλαξε τα περιεχόμενά τους) Επανάληψη Αλγόριθμος bubble sort Απαιτεί διπλό βρόχο Σειρά ταξινόμησης ως παράμετρος 33

Ταξινόμηση φυσαλίδας 25 3 35 111-40 3 25 35 111-40 3 25 35 111-40 3 25 35 111-40 3 25 35-40 111 34

Ταξινόμηση φυσαλίδας 3 25 35-40 111 3 25 35-40 111 3 25 35-40 111 3 25-40 35 111 3 25-40 35 111 35

Ταξινόμηση φυσαλίδας 3 25-40 35 111 3 25-40 35 111 3-40 25 35 111 3-40 25 35 111 3-40 25 35 111 36

Ταξινόμηση φυσαλίδας 3-40 25 35 111-40 3 25 35 111-40 3 25 35 111-40 3 25 35 111-40 3 25 35 111 37

Ταξινόμηση φυσαλίδας -40 3 25 35 111-40 3 25 35 111-40 3 25 35 111-40 3 25 35 111-40 3 25 35 111 Ταξινομημένο!! 38

Ταξινόμηση φυσαλίδας Παρατηρήσεις στον αλγόριθμο Κάθε προσπέλαση καθορίζει τη θέση ενός τουλάχιστο στοιχείου Η πρώτη προσπέλαση καθορίζει το μεγαλύτερο στοιχείο Η δεύτερη το αμέσως μικρότερο κ.ο.κ. 39

Ταξινόμηση φυσαλίδας Ο αριθμός των στοιχείων που εξετάζονται μετά από κάθε προσπέλαση μειώνεται κατά ένα Γιατί; Τερματισμός αλγορίθμου (ταξινόμηση στοιχείων) Εάν σε μια προσπέλαση δεν γίνει καμία εναλλαγή στοιχείων 40

Ταξινόμηση φυσαλίδας με μείωση του αριθμού στοιχείων που εξετάζονται 25 3 35 111-40 3 25 35 111-40 3 25 35 111-40 3 25 35 111-40 3 25 35-40 111 41

Ταξινόμηση φυσαλίδας με μείωση του αριθμού στοιχείων που εξετάζονται 3 25 35-40 111 3 25 35-40 111 3 25 35-40 111 3 25-40 35 111 42

Ταξινόμηση φυσαλίδας με μείωση του αριθμού στοιχείων που εξετάζονται 3 25-40 35 111 3 25-40 35 111 3-40 25 35 111 43

Ταξινόμηση φυσαλίδας με μείωση του αριθμού στοιχείων που εξετάζονται 3-40 25 35 111-40 3 25 35 111 Ταξινομημένο!! 44

Ταξινόμηση φυσαλίδας Κώδικας 1 void bubble_sort(int table[], int size) { int pass, j, hold; for ( pass = 1; pass <= size - 1; pass++ ) for ( j = 0; j <= size - 2; j++ ) if ( table[j] > table[j+1] ) { hold = table[j]; table[j] = table[j+1]; table[j+1] = hold; } } 45

Ταξινόμηση φυσαλίδας Κώδικας 2 void bubble_sort(int table[], int size) { int sorted, len = size 1, k; do{ sorted = 1; /* έστω ότιο πίνακας είναι ταξινομημένος */ for (k = 0; k < len; k++) if (table[k]<table[k+1]){ swap(&table[k],&table[k+1]); sorted = 0; } len; } while (!sorted && len > 0); } 46

Ταξινόμηση φυσαλίδας Κώδικας 3 void bubble_sort(int compare(int,int), int table[], int size) { } int sorted, len = size 1, k; do{ sorted = 1; /* έστω ότι ο πίνακας είναι ταξινομημένος */ for (k = 0; k < len; k++) if (compare(table[k],table[k+1])){ } len; } while (!sorted && len > 0); Για καθορισμό αύξουσας η φθίνουσας σειράς swap(&table[k],&table[k+1]); sorted = 0; 47

Ταξινόμηση φυσαλίδας int less(int x, int y) { return x < y; } int greater(int x, int y) { return x > y; } #define SIZE 5 int main () { int table[size] = {9,3,5,1,7}; } bubble_sort(less, table, 5); display_table(table,size); bubble_sort(greater, table,5); display_table(table,size); 48

Ταξινόμηση επιλογής Βασική ιδέα: Σε έναν πίνακα στοιχείων, βρες το μεγαλύτερο στοιχείο του και κάνε εναλλαγή θέσεων (swap) αυτού με το τελευταίο στοιχείο του πίνακα Το αποτέλεσμα είναι μια μη ταξινομημένη λίστα της οποίας το μέγεθος είναι κατά 1 μικρότερο από το μέγεθος της αρχικής λίστας, η οποία ακολουθείται από μια «ταξινομημένη» λίστα μεγέθους 1 Επανάληψη του παραπάνω βήματος για τη μη ταξινομημένη λίστα έχει ως αποτέλεσμα μια μη ταξινομημένη λίστα της οποίας το μέγεθος είναι κατά 2 μικρότερο από το μέγεθος της αρχικής, η οποία ακολουθείται από μια ταξινομημένη λίστα μεγέθους 2. κ.ο.κ. Τερματισμός αλγορίθμου (ταξινόμηση στοιχείων): Όταν το μέγεθος της μη ταξινομημένης λίστας γίνει 1 49

Ταξινόμηση επιλογής Πέρασμα 1 [0] [1] [2] [3] [4] 43 22 17 36 16 Βρες το μεγαλύτερο των πρώτων πέντε στοιχείων και κάνε το εναλλαγή με το στοιχείο array[4] Πέρασμα 2 16 22 17 36 43 Πέρασμα 3 16 22 17 36 43 Βρες το μεγαλύτερο των πρώτων τεσσάρων στοιχείων και κάνε το εναλλαγή με το στοιχείο array[3] Βρες το μεγαλύτερο των πρώτων τριών στοιχείων και κάνε το εναλλαγή με το στοιχείο array[2] 50

Ταξινόμηση επιλογής Πέρασμα 4 [0] [1] [2] [3] [4] 16 17 22 36 43 Βρες το μεγαλύτερο των πρώτων δύο στοιχείων και κάνε το εναλλαγή με το στοιχείο array[1] 16 17 22 36 43 Ταξινομημένο!! 51

Ταξινόμηση επιλογής Κώδικας void selection_sort(int size, int table[]) { int i; int index_of_largest, last, temp; for (last = size-1; last >= 1; last--) { index_of_largest = 0; for (i = 1; i <= last; i++) if (table[i] > table[index_of_largest]) index_of_largest = i; /* end if */ /* end for */ temp = table[last]; table[last] = table[index_of_largest]; table[index_of_largest] = temp; } } 52

Τέλος Ενότητας

Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στο πλαίσιο του εκπαιδευτικού έργου των διδασκόντων. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Πανεπιστήμιο Πατρών» έχει χρηματοδοτήσει μόνο την αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 54

Σημείωμα Αναφοράς Copyright Πανεπιστήμιο Πατρών, Πολυτεχνική Σχολή, Τμήμα Μηχανολόγων & Αεροναυπηγών Μηχανικών, Νίκος Καρακαπιλίδης, Δημήτρης Σαραβάνος. Νίκος Καρακαπιλίδης, Δημήτρης Σαραβάνος. «Προγραμματισμός Η/Υ. Ειδικά θέματα Αλγορίθμων». Έκδοση: 1.0. Πάτρα 2014. Διαθέσιμο από τη δικτυακή διεύθυνση: https://eclass.upatras.gr/courses/mech1207/ 55

Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά, Μη Εμπορική Χρήση Παρόμοια Διανομή 4.0 [1] ή μεταγενέστερη, Διεθνής Έκδοση. Εξαιρούνται τα αυτοτελή έργα τρίτων π.χ. φωτογραφίες, διαγράμματα κ.λ.π., τα οποία εμπεριέχονται σε αυτό και τα οποία αναφέρονται μαζί με τους όρους χρήσης τους στο «Σημείωμα Χρήσης Έργων Τρίτων». [1] http://creativecommons.org/licenses/by-nc-sa/4.0/ Ως Μη Εμπορική ορίζεται η χρήση: που δεν περιλαμβάνει άμεσο ή έμμεσο οικονομικό όφελος από την χρήση του έργου, για το διανομέα του έργου και αδειοδόχο που δεν περιλαμβάνει οικονομική συναλλαγή ως προϋπόθεση για τη χρήση ή πρόσβαση στο έργο που δεν προσπορίζει στο διανομέα του έργου και αδειοδόχο έμμεσο οικονομικό όφελος (π.χ. διαφημίσεις) από την προβολή του έργου σε διαδικτυακό τόπο Ο δικαιούχος μπορεί να παρέχει στον αδειοδόχο ξεχωριστή άδεια να χρησιμοποιεί το έργο για εμπορική χρήση, εφόσον αυτό του ζητηθεί. 56

Διατήρηση Σημειωμάτων Οποιαδήποτε αναπαραγωγή ή διασκευή του υλικού θα πρέπει να συμπεριλαμβάνει: το Σημείωμα Αναφοράς το Σημείωμα Αδειοδότησης τη δήλωση Διατήρησης Σημειωμάτων το Σημείωμα Χρήσης Έργων Τρίτων (εφόσον υπάρχει) μαζί με τους συνοδευόμενους υπερσυνδέσμους. 57

Σημείωμα Χρήσης Έργων Τρίτων Οποιοδήποτε έργο στην παρούσα ενότητα, έχει δημιουργηθεί από τους διδάσκοντες του μαθήματος ή/και την Τμηματική Ομάδα Εργασίας και παρέχεται με την ίδια άδεια CC BY-NC-SA 4.0 58