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

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

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

Να εκτυπωθούν οι πρώτες Ν σειρές του τριγώνου, χρησιµοποιώντας ένα πίνακα µεγέθους Ν στοιχείων (η Ν-οστή σειρά περιέχει Ν στοιχεία).

ΕΠΛ 034: Εισαγωγή στον Προγραμματισμό για ΗΜΥ

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

Πίνακες (Arrays) ΕΠΛ131 Ενότητα VI

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

Κεφάλαιο 8.7. Πίνακες & Συναρτήσεις ( ιάλεξη 17) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

Προγραμματισμός HY: Γλώσσα Προγραμματισμού C

ΕΠΛ131 Αρχές Προγραμματισμού

Μεθόδων Επίλυσης Προβλημάτων

Κεφάλαιο Πίνακες Ι. (Διάλεξη 16)

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

Πίνακες (Arrays) ΕΠΛ131 Ενότητα VI

Επανάληψη. Εντολές while, for, do-while

είκτες και Πίνακες (2)

Συναρτήσεις. Κατασκευαστικά Τεµάχια για τη ηµιουργία Αρθρωτών Προγραµµάτων

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (Programming in the large)

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

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 3 η : Επίλυση Προβληµάτων Χειµερινό Εξάµηνο 2011

Μεθόδων Επίλυσης Προβλημάτων

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

ΗΥ-150. Ταξινόµηση και Αναζήτηση

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

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

Προγραμματισμός Η/Υ Ι (Χρήση της C) 6 η Θεωρία ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ

Κεφάλαιο 8.6. Πίνακες ΙI (Διάλεξη 17)

Κεφάλαιο Πίνακες Ι. ( ιάλεξη 15) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

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

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

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

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

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

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

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

Η βασική λειτουργία σε όλες αυτές τις συναρτήσεις είναι η εκτύπωση γραµµών.

Συναρτήσεις και Πίνακες

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

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

242 -ΕισαγωγήστουςΗ/Υ

Εργαστήριο 1: Επανάληψη Βασικών Εννοιών στη Γλώσσα C

Μεθόδων Επίλυσης Προβλημάτων

Επανάληψη για τις Τελικές εξετάσεις

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

Επανάληψη για τις Τελικές εξετάσεις. (Διάλεξη 24) ΕΠΛ 032: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

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

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

Περαιτέρω για Συναρτήσεις

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

Στόχοι και αντικείμενο ενότητας. Τύπος πίνακα. Τύπος πίνακα (συν.) #6. Πίνακες και Δείκτες

Κεφάλαιο 8.6. Πίνακες ΙI ( ιάλεξη 16) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

Η Γλώσσα C Μία Σφαιρική Ανασκόπηση

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

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

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

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

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

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 4. Παραδείγματα Ανάλυσης Πολυπλοκότητας Ανάλυση Αναδρομικών Αλγόριθμων

Βαθμός Σχόλια. lab PASS 1194 PASS 1238 PASS 1239 PASS

ΕΠΛ131 Αρχές Προγραμματισμού

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες ( ιάλεξη 18) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Προγραμματισμός Μεθόδων Επίλυσης Προβλημάτων. 14. Πίνακες Ι. Ιωάννης Κατάκης. ΕΠΛ 032: Προγραμματισμός Μεθόδων Επίλυσης Προβλημάτων

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

Μεθόδων Επίλυσης Προβλημάτων

Ανάπτυξη και Σχεδίαση Λογισμικού

Η τιµή εξόδου κάποιας συνάρτησης µπορεί να είναι δείκτης, π.χ.

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 8 Ο. Ταξινόμηση και Αναζήτηση Συναρτήσεις χειρισμού οθόνης ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

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

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

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

Διάλεξη 04: Παραδείγματα Ανάλυσης

Προγραμματισμός Ι. Είσοδος/Έξοδος. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

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

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

Διάλεξη 04: Παραδείγματα Ανάλυσης Πολυπλοκότητας/Ανάλυση Αναδρομικών Αλγόριθμων

Φροντιστήριο 4 Σκελετοί Λύσεων

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

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

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

ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ C ΣΕΙΡΑ 2 η

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

Προγραµµατισµός 1 Ταξινόµηση - Αναζήτηση

Πίνακες. Ι.Ε.Κ ΓΛΥΦΑΔΑΣ Τεχνικός Τεχνολογίας Internet Αλγοριθμική Ι (Ε) Σχολ. Ετος A Εξάμηνο

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

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

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

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

Στόχοι και αντικείμενο ενότητας. Συντακτικό Γλώσσας. Αλφάβητο. #2.. Εισαγωγή στη C (Μέρος Πρώτο)

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

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

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

ιαφάνειες παρουσίασης #9 (α)

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

ΕΓΓΡΑΦΟ ΕΡΓΑΣΙΑΣ ΤΩΝ ΥΠΗΡΕΣΙΩΝ ΤΗΣ ΕΠΙΤΡΟΠΗΣ. Εκθεση χώρας - Κύπρος {COM(2015) 85 final}

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

Διάλεξη 9η: Πίνακες (arrays)

Transcript:

Πίνακες Οι πίνακες αποτελούν ένα σηµαντικό δοµηµένο τύπο δεδοµένων (structured data type) ή πιο απλά µία δοµή δεδοµένων (data structure). Οι απλοί τύποι δεδοµένων (οι τιµές τους δεν µπορούν να διασπασθούν σε απλούστερα στοιχεία) δεν αρκούν από µόνοι τους. Για υψηλότερη αφαιρετικότητα (δεδοµένων) χρειάζονται δοµές δεδοµένων. Μία δοµή δεδοµένων είναι µία συνάθροιση συγγενών δεδοµένων τα οποία αποθηκεύονται κάτω από το ίδιο όνοµα. Ένας πίνακας είναι µία δοµή δεδοµένων, όπου ένα σύνολο αντικειµένων του ιδίου τύπου αποθηκεύονται σε σειρά, π.χ. month_days 31 28 31 30 31 30 31 31 30 31 30 31 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec typedef enum {Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec month_t; int month_days [12] = {31,28,31,30,31,30,31,31,30,31,30,31;

month_days[jan] 31 month_days[feb] 28 Ορισµός Πίνακα Ο ορισµός ενός πίνακα αποτελείται από: Την ονοµασία του (month_days) Τον τύπο των στοιχείων του (int) Το πλήθος των στοιχείων του (12) Έστω n το πλήθος των στοιχείων κάποιου πίνακα. Ατοµικά, αυτά τα στοιχεία αναφέρονται ως το στοιχείο 0, το στοιχείο 1, το στοιχείο 2,, το στοιχείο (n-1). Έτσι month_days[0] είναι το πρώτο στοιχείο του πίνακα month_days, month_days[1] είναι το δεύτερο στοιχείο του πίνακα, και month_days[11] είναι το τελευταίο στοιχείο του πίνακα. ονοµασία πίνακα double x [8]; τύπος στοιχείων πλήθος στοιχείων Πίνακας x x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7] 16.0 12.0 6.0 8.0 2.5 12.0 14.0 54.5 2

Η επεξεργασία ενός πίνακα γίνεται στοιχείο µε στοιχείο, π.χ. printf( %.1f, x[0]); x[3] = 25.0; sum = x[0] + x[1]; sum += x[2]; x[3] += 1.0; x[2] = x[0] + x[1]; Τα στοιχεία ενός πίνακα αποθηκεύονται σε συνεχόµενες θυρίδες στη µνήµη του υπολογιστή. Ως εκ τούτου υπάρχει τυχαία προσπέλαση σε οποιοδήποτε στοιχείο του πίνακα. Αυτό είναι ένα από τα πλεονεκτήµατα της δοµής του πίνακα. & x[0] η διεύθυνση του πρώτου στοιχείου του πίνακα x & x[i] η διεύθυνση του i-οστού στοιχείου του πίνακα x Παράδειγµα #define NUM_STUDENTS 56 int s_id [NUM_STUDENTS]; double s_aver [NUM_STUDENTS]; Ο πίνακας s_id περιέχει τις ταυτότητες µίας οµάδας φοιτητών και ο πίνακας s_aver περιέχει τους σταθµικούς µέσους όρους του τρέχοντος εξαµήνου, για την ίδια οµάδα φοιτητών. 3

Τέτοιοι πίνακες ονοµάζονται παράλληλοι πίνακες. Περιέχουν συγγενείς πληροφορίες για το ίδιο σύνολο οντοτήτων. Εναλλακτικά θα µπορούσε να χρησιµοποιηθεί ένας πίνακες του οποίου τα στοιχεία είναι εγγραφές. s_id[0] 5505 s_aver[0] 6.8 s_id[1] 4556 s_aver[1] 7.3 s_id[2] 5691 s_aver[2] 4.5 s_id[55] 9146 s_aver[55] 8.4 Αρχικοποίηση Πίνακα int prime_lt_100 [] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97; char vowels [] = { A, E, I, O, U ; Σύνταξη τύπος_στοιχείων ονοµασία_πίνακα [πλήθος_στοιχείων] ; τύπος_στοιχείων ονοµασία_πίνακα [πλήθος_στοιχείων] = {λίστα_αρχικοποίησης ; 4

Όταν γίνεται αρχικοποίηση των στοιχείων του πίνακα παράλληλα µε τη δήλωσή του, δεν χρειάζεται να αναφερθεί ρητά το πλήθος των στοιχείων του. Τα στοιχεία του πίνακα αναφέρονται ως ονοµασία_πίνακα[0], ονοµασία_πίνακα[1], ονοµασία_πίνακα[2],........., ονοµασία_πίνακα[πλήθος_στοιχείων 1]. Η λίστα_αρχικοποίησης περιέχει σταθερές εκφράσεις του δεδοµένου τύπου_στοιχείων. Οι εκφράσεις διαχωρίζονται µε κόµµατα και αντιστοιχούν µία προς µία στα στοιχεία του πίνακα. Αναφορά σε Στοιχεία του Πίνακα είκτες Πίνακα Array Subscripts Τι σηµαίνουν οι ακόλουθες εκφράσεις; int i = 5; x[4] x[i] x[i+1] x[i+i] x[2*i] x[2*i 3] x[(int)x[4]] x[i++] x[ i] x[i-1] = x[i]; x[i] = x[i+1]; 5

x[i] 1 = x[i]; Πρόσβαση σε µη υπαρκτό στοιχείο του πίνακα, π.χ. x[10], µπορεί να οδηγήσει στον τερµατισµό του προγράµµατος, αλλά το πιθανότερο είναι ότι θα οδηγήσει σε λανθασµένα αποτελέσµατα. Σύνταξη για δείκτες πίνακα ονοµασία_πίνακα[δείκτης] Ο δείκτης µπορεί να είναι οποιαδήποτε έκφραση τύπου int. Σηµειώνεται ότι είναι ευθύνη του προγραµµατιστή να επαληθεύσει ότι η τιµή αυτή είναι στο πεδίο [0, πλήθος_στοιχείων 1]. Παράδειγµα: #define SIZE 5 int square[size], i; for (i = 0; i < SIZE; ++i) square[i] = i * i; square[0] square[1] square[2] square[3] square[4] 0 1 4 9 16 6

Παράδειγµα typedef enum {Mon, Tue, Wed, Thu, Fri, Sat, Sun day_t; int max_temp[7]; day_t today; for (today = Mon; today <= Sun; ++today) { printf( \nenter max temp for ); print_day(today); scanf( %d, &max_temp[today]); Παράδειγµα: Γραµµική Αναζήτηση (Linear Search) Πίνακας x x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7] x[8] 6 2 7 1 3 9 4 10 12 pos Αρχίζοντας από το πρώτο στοιχείο του πίνακα, διαδοχικά συγκρίνεται το υπό αναζήτηση στοιχείο µε το στοιχείο του πίνακα, µέχρις ότου είτε να εντοπισθεί το στοιχείο, είτε να 7

εξετασθούν όλα τα στοιχεία. Εποµένως η αλγοριθµική δοµή είναι απροσδιόριστη επανάληψη. #include <stdio.h> #define SIZE 9 void main () { int x[] = {6, 2, 7, 1, 3, 9, 4, 10, 12, pos = 0, item ; printf( \nenter item ); scanf( %d, &item); while (pos < SIZE && item!= x[pos]) ++pos; if (pos == SIZE) printf( \nitem not found ); else printf( \nitem found ); Προσοχή: Σειρά συνθηκών της εντολής while. Σηµείωση: Λόγω του ότι ένας πίνακας χρειάζεται να επεξεργαστεί στοιχείο προς στοιχείο, η επανάληψη (απροσδιόριστη ή απαριθµητή) αποτελεί την πιο κατάλληλη αλγοριθµική δοµή για πίνακες. 8

Εναλλακτικός ορισµός Η τελευταία είσοδος του πίνακα δεν αποτελεί µέρος του πίνακα, αλλά χώρο αποθήκευσης του υπό αναζήτηση στοιχείου. #include <stdio.h> #define SIZE 9 void main () { int x[size+1] = {6, 2, 7, 1, 3, 9, 4, 10, 12, pos = 0; printf( \nenter item ); scanf( %d, &x[size]); while (x[pos]!= x[size]) ++pos; if (pos == SIZE) printf( \nitem not found ); else printf( \nitem found ); Enter item 16 Item not found Enter item 9 Item found x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7] x[8] x[9] 6 2 7 1 3 9 4 10 12 99 9

Στοιχεία Πίνακα ως Ορίσµατα Συναρτήσεων printf( %d %d, x[i], x[i]+3); scanf( %d, &x[i]); swap(&x[i], &x[i+1]); Πίνακες ως Παράµετροι και Ορίσµατα Η ονοµασία ενός αρχείου είναι συνώνυµη µε τη διεύθυνση του πρώτου στοιχείου του πίνακα. Το πέρασµα ενός πίνακα που δίνεται ως όρισµα γίνεται µέσω διευθύνσεως. Σε επίπεδο συναρτήσεων, δεν χρειάζεται να προσδιοριστεί το πλήθος των στοιχείων µίας παραµέτρου που είναι πίνακας. Το πόσα στοιχεία χρειάζεται να επεξεργασθούν µπορεί να διατυπωθεί ως άλλη παράµετρος. Παράδειγµα: Αρχικοποίηση πίνακα void fill_array (int table[], int size, int value) { int i; for (i = 0; i < size; ++i) table[i] = value; int x[8], y[100]; fill_array(x,8,0); fill_array(y,10,1); 10

fill_array(x,8,0); Αρχικά: ιασύνδεση του πίνακα x µε τη συνάρτηση x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7] table fill_array size 8 value 0 Μετά την εκτέλεση της συνάρτησης fill_table x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7] 0 0 0 0 0 0 0 0 Σηµείωση: fill_array(x,8,0) fill_array(&x[0],8,0) void fill_array(int table[], int size, int value) void fill_array(int *table, int size, int value) 11

Παράδειγµα: Επαναδιατύπωση της γραµµικής αναζήτησης ως συνάρτηση typedef enum bool_t; {NotFound, Found bool_t linear_search(const int table[], int size, int item){ int pos = 0; while (pos < size && table[pos]!= item) ++pos; if (pos == size) return NotFound; else return Found; Με τον προσδιοριστή const (σταθερά) δηλώνεται ρητά ότι η παράµετρος table είναι µόνο για είσοδο. Αυτό δεν είναι απλά για να είναι η λογική πιο διαφανής, αλλά επίσης αποτελεί ασφαλιστική δικλείδα αφού µε αυτό τον τρόπο απαγορεύεται στη συνάρτηση να τροποποιήσει τα περιεχόµενα του πίνακα. fill_array(x,8,23); linear_search(x,8,6) NotFound linear_search(x,8,23) Found 12

Παράδειγµα: Υπολογισµός του µέγιστου στοιχείου ενός πίνακα int get_max(const int table[], int size) { int i, Max = table[0]; for (i=1; i < size; ++i) if (Max < table[i]) Max = table[i]; return Max; Παράδειγµα: υαδική αναζήτηση Τα στοιχεία του πίνακα είναι ταξινοµηµένα σε αύξουσα σειρά. x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7] 1 3 5 7 9 11 13 15 Min Max bool_t binary_search(const int table[], int size, int item) { int Min = 0, Max = size 1, pos; do { pos = (Min + Max) / 2; if (item > table[pos]) Min = pos + 1; else Max = pos 1; while (item!= table[pos] && Min <= Max); if (item == table[pos]) return Found; else return NotFound; 13

Παράδειγµα: Ταξινόµηση Φυσαλίδας (Bubble Sort) Αλγόριθµος Ενόσω ο πίνακας δεν είναι ταξινοµηµένος, διαδοχικά σύγκρινε γειτνιάζοντα στοιχεία του πίνακα και ενάλλαξε τα περιεχόµενά τους εάν δεν είναι στη ζητούµενη σειρά. Ο αλγόριθµος συνεπάγεται διπλή επανάληψη. Ο εξωτερικός βρόχος ελέγχει το µήκος του αριστερού τµήµατος του πίνακα που χρειάζεται να εξεταστεί. Αρχικά εξετάζεται ολόκληρος ο πίνακας. Ο εσωτερικός βρόχος ελέγχει τις διαδοχικές συγκρίσεις ανάµεσα στα γειτνιάζοντα στοιχεία του πίνακα. Κάθε φορά που ολοκληρώνεται ο εσωτερικός βρόχος οι εναλλαγές που εκτελέσθηκαν, έχουν ως αποτέλεσµα το στοιχείο που πρέπει να βρίσκεται στη τελευταία θέση του εν λόγω τµήµατος του πίνακα, να καταχωρηθεί σε εκείνη τη θέση. Σε κάθε διαδοχική προσπέλαση του πίνακα (εξωτερικός βρόχος) το µήκος του τµήµατος που χρειάζεται να εξετασθεί µειώνεται κατά ένα. Η εξωτερική επανάληψη είναι απροσδιόριστη (ενόσω υπάρχουν στοιχεία σε λανθασµένες θέσεις) ενώ η εσωτερική επανάληψη είναι απαριθµητή (κάθε δυάδα γειτνιαζόντων στοιχείων του εν λόγω τµήµατος του πίνακα). 14

9 3 5 1 7 1η Προσπέλαση 9 3 5 1 7 3 9 5 1 7 3 5 9 1 7 3 5 1 9 7 3 5 1 7 9 2η Προσπέλαση 3 5 1 7 9 3 5 1 7 9 3 1 5 7 9 3η Προσπέλαση 3 1 5 7 9 1 3 5 7 9 15

4η Προσπέλαση 1 3 5 7 9 Το στοιχείο του πίνακα που είναι πρώτο στη ζητούµενη σειρά, εάν στη αρχική διάταξη βρίσκεται στη τελευταία θέση, σε κάθε προσπέλαση θα προχωρεί µία θέση προς τα αριστερά. Συνάρτηση bsort pred table size bsort pred το κατηγόρηµα βάσει του οποίου θα γίνει η ταξινόµηση table ο πίνακας ο οποίος χρειάζεται να ταξινοµηθεί, και συγκεκριµένα η διεύθυνση του πρώτου στοιχείου του. Ο πίνακας αποτελεί ταυτόχρονα είσοδο και έξοδο. size το πλήθος των στοιχείων του πίνακα /* Βοηθητική συνάρτηση swap */ void swap (int *x, int *y) { int temp = *x; *x = *y; *y = temp; 16

/* Συνάρτηση bsort */ void bsort(int pred(int,int), int table[], int size) { int Sorted, len = size 1, k; do {Sorted = 1; /* Γίνεται η υπόθεση ότι ο πίνακας είναι ταξινοµηµένος */ for (k = 0; k < len; k++) if (!pred(table[k],table[k+1]) {swap(&table[k],&table[k+1]); Sorted = 0; len; while (!Sorted && len > 0); Χρήση συνάρτησης bsort int lessp(int x, int y) { return x < y; int greaterp(int x, int y) { return x > y; void main () { int tab[5] = {9,3,5,1,7; bsort(lessp, tab, 5); printf( \ntable in ascending order: %d %d %d %d %d, tab[0], tab[1], tab[2], tab[3], tab[4]); bsort(greaterp, tab,5); printf( \ntable in descending order: %d %d %d %d %d, tab[0], tab[1], tab[2], tab[3], tab[4]); 17

Table in ascending order: 1 3 5 7 9 Table in descending order: 9 7 5 3 1 Παράδειγµα: Ταξινόµηση Επιλογής (Selection Sort) Αρχικά το υπό εξέταση τµήµα του πίνακα είναι ολόκληρος ο πίνακας. ιαδοχικά αυτό το τµήµα µειώνεται κατά ένα στοιχείο, συγκεκριµένα το δεξιότερο στοιχείο, µέχρις ότου το τµήµα να αποτελείται από ένα στοιχείο µόνο. Η επεξεργασία του κάθε τµήµατος συνεπάγεται την εναλλαγή των περιεχοµένων του τελευταίου στοιχείου του τµήµατος και του στοιχείου του τµήµατος που περιέχει την τελευταία σε σειρά τιµή, σύµφωνα µε την ζητούµενη κατάταξη. Και αυτός ο αλγόριθµος συνεπάγεται διπλή επανάληψη. Όµως σε αυτή την περίπτωση και οι δύο βρόχοι είναι απαριθµητής µορφής. 9 3 5 1 7 1η Προσπέλαση 9 3 5 1 7 2η Προσπέλαση 7 3 5 1 9 18

3η Προσπέλαση 1 3 5 7 9 4η Προσπέλαση 1 3 5 7 9 Συνάρτηση ssort H συνάρτηση έχει την ίδια διεπαφή όπως την συνάρτηση bsort. void ssort(int pred(int, int), int table[], int size) { int pos, len, k; for (len = size; len > 1; len) {pos = 0; for (k = 1; k < len; k++) if (pred(table[pos], table[k])) pos = k; swap(&table[len 1], &table[pos]); 19