Fortran και Αντικειμενοστραφής προγραμματισμός.

Σχετικά έγγραφα
Συναρτήσεις και Υπορουτίνες

Fortran και Αντικειμενοστραφής προγραμματισμός.

Διαφάνειες παρουσιάσεων Αρχικές Διαφάνειες σε Pascal: Σ.Ζάχος, Ν.Παπασπύρου Προσαρμογή σε Fortran: Α.Παγουρτζής, Δ.Σούλιου

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ. Δρ. Ιωάννης Λυχναρόπουλος Τμήμα Μηχανολόγων Μηχανικών Πανεπιστήμιο Θεσσαλίας

Fortran και Αντικειμενοστραφής προγραμματισμός.

Fortran και Αντικειμενοστραφής προγραμματισμός.

FORTRAN και Αντικειμενοστραφής Προγραμματισμός

FORTRAN & Αντικειμενοστραφής Προγραμματισμός ΣΝΜΜ 2017

FORTRAN & Αντικειμενοστραφής Προγραμματισμός ΣΝΜΜ 2017

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

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

Η γλώσσα προγραμματισμού Strange

Κεφάλαιο 7: Υποπρογράμματα. Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών

TO ΥΠΟΠΡΟΓΡΑΜΜΑ ΣΥΝΑΡΤΗΣΗ

Κεφάλαιο 7: Υπορουτίνες

Πίνακες. FORTRAN και Αντικειμενοστραφής Προγραμματισμός

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

Μορφοποίηση της εξόδου

Υπο-προγράμματα στη Fortran

ΥΠΟΛΟΓΙΣΤΕΣ Ι. Τι είναι μια υπορουτίνα; με υπορουτίνα ΥΠΟΡΟΥΤΙΝΕΣ. Παράδειγμα #1: η πράξη SQ. Ποια η διαφορά συναρτήσεων και υπορουτίνων;

Η γλώσσα προγραμματισμού EEL

8 FORTRAN 77/90/95/2003

auth Αλγόριθμοι - Τμήμα Πληροφορικής ΑΠΘ - Εξάμηνο 4ο

Pascal. 15 Νοεμβρίου 2011

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

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

Εισαγωγή στον Προγραμματισμό Η/Υ για Χημικούς Μηχανικούς

Ταξινόμηση με συγχώνευση Merge Sort

Προγραμματισμός με FORTRAN Συνοπτικός Οδηγός Α. Σπυρόπουλος Α. Μπουντουβής

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

Πίνακες. (i) FORTRAN και Αντικειµενοστραφής Προγραµµατισµός

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

Quicksort. Επιμέλεια διαφανειών: Δ. Φωτάκης Μικροαλλαγές: Α. Παγουρτζής. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

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

Υπολογιστές Ι. Άδειες Χρήσης. Υποπρογράμματα. Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

Σχεδίαση Αλγορίθμων -Τμήμα Πληροφορικής ΑΠΘ - Εξάμηνο 4ο

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

Συναρτήσεις. Υποπρόγραμμα

Μεταγλωττιστές Βελτιστοποίηση

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

Fortran και Αντικειμενοστραφής προγραμματισμός.

Ενότητα 1 Διάλεξη 3. Προγραμματισμός με Εφαρμογές στην Επιστήμη του Μηχανικού. Σιέττος Κωνσταντίνος

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

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

Κεφάλαιο 7ο: Συναρτήσεις και Υπορουτίνες

ΑΛΓΟΡΙΘΜΟΙ. Ενότητα 4: Διαίρει και Βασίλευε. Ιωάννης Μανωλόπουλος, Καθηγητής Αναστάσιος Γούναρης, Επίκουρος Καθηγητής Τμήμα Πληροφορικής ΑΠΘ

Δομή προγράμματος στη Fortran

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Εισαγωγή στην FORTRAN. Δρ. Ιωάννης Λυχναρόπουλος

Προγραμματισμός Αναδρομή

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

IMPLICIT NONE INTEGER :: a, b, c

Κεφάλαιο 12 : ΕΡΓΑΣΤΗΡΙΑΚΗ ΔΡΑΣΤΗΡΙΟΤΗΤΑ 03 Συναρτήσεις

Κεφάλαιο 5ο: Εντολές Επανάληψης

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

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

Τμήμα Φυσικής Πανεπιστημίου Κύπρου Εαρινό Εξάμηνο 2015/2016. ΦΥΣ145 Υπολογιστικές Μέθοδοι στην Φυσική

Δομή προγράμματος στη Fortran

Τμήμα Μηχανολόγων Μηχανικών Πανεπιστήμιο Θεσσαλίας ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ ΠΙΝΑΚΕΣ. Ιωάννης Λυχναρόπουλος Μαθηματικός, MSc, PhD

Κεφάλαιο 6 Υλοποίηση Γλωσσών Προγραμματισμού

Εισαγωγή στον Προγραμματισμό Η/Υ για Χημικούς Μηχανικούς

Άσκηση 1. Α. Υπολογίστε χωρίς να εκτελέσετε κώδικα FORTRAN τα παρακάτω: Ποιά είναι η τελική τιμή του Z στα παρακάτω κομμάτια κώδικα FORTRAN:

Oι εντολές COMMON και PARAMETER

Μέρος 2 Κατασκευή Συντακτικού Αναλυτή

Αναδρομή (Recursion) Η Δίδυμη Αδελφή της Επανάληψης. Διαφάνειες από τους Robert Sedgewick και Kevin Wayne Ι-1

Τμήμα Μηχανολόγων Μηχανικών Πανεπιστήμιο Θεσσαλίας ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Δομή Επιλογής. Ιωάννης Λυχναρόπουλος Μαθηματικός, MSc, PhD

Κεφάλαιο 12 : ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

p

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

Αναδρομή Ανάλυση Αλγορίθμων

Προγραμματισμός Αναδρομή

Μεταγλωττιστές Βελτιστοποίηση

Εντολή Δεδομένα Περιεχόμενα μετά την εκτέλεση 1 read(x) 122 x= 2 read(a,b,c) a= b= c= 3 read(d,e)

ΣΧΕΔΙΑΣΗ ΚΑΙ ΥΛΟΠΟΙΗΣΗ ΛΟΓΙΣΜΙΚΟΥ

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

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

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

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

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

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

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις

FORTRAN & Αντικειμενοστραφής Προγραμματισμός ΣΝΜΜ 2016

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

Διάλεξη 19: Αλγόριθμοι ΤαξινόμησηςII. Διδάσκων: Παναγιώτης Ανδρέου

Quicksort. ιδάσκοντες: Σ. Ζάχος,. Φωτάκης Επιμέλεια διαφανειών:. Φωτάκης. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

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

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

Τμήμα Μηχανολόγων Μηχανικών Πανεπιστήμιο Θεσσαλίας ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ ΠΙΝΑΚΕΣ. Ιωάννης Λυχναρόπουλος Μαθηματικός, MSc, PhD

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

Εισαγωγή στη Fortran. Μάθημα 3 ο. Ελευθερία Λιούκα

Συνάρτηση Διαδικασία

Pascal. 26 Οκτωβρίου 2011

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

Αντίρριο, 14/03/2017 Προδιαγραφές Εργαστηριακής Εργασίας για το μάθημα «Μεταγλωττιστές»

Ταξινόμηση. 1. Στατιστικά Διάταξης 2. Στατιστικά σε Μέσο Γραμμικό Χρόνο. Εισαγωγή στην Ανάλυση Αλγορίθμων Μάγια Σατρατζέμη

Ενότητα 3: «Εισαγωγή στην Αλγοριθμική και στον Προγραμματισμό: loops, subroutines, tables»

Εισαγωγή στον Προγραμματισμό Η/Υ για Χημικούς Μηχανικούς

Σε γενικές γραμμές, είναι καλή πρακτική να γράϕουμε προγράμματα C που αποτελούνται από πολλές και μικρές συναρτήσεις, παρά από λίγες και μεγάλες.

ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 4-1

ΣΧΟΛΙΑ 1 ΗΣ ΕΡΓΑΣΙΑΣ. 15 Μαΐου 2013

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

Transcript:

Fortran και Αντικειμενοστραφής προγραμματισμός www.corelab.ntua.gr/courses/fortran_naval/naval Δδάσκοντες: Άρης Παγουρτζής (pagour@cs.ntua.gr) (Επίκουρος Καθηγητής ΣΗΜΜΥ ) Δώρα Σούλιου (dsouliou@mail.ntua.gr) (ΕΔΙΠ ΣΗΜΜΥ) 6η ενότητα Υπορουτίνες Συναρτήσεις Πέρασμα παραμέτρων Αναδρομικά υποπρογράμματα Hanoi, Mergesort, Quicksort Αρχικές Διαφάνειες σε Pascal: Ε. Ζάχος, Ν. Παπασπύρου Προσαρμογή σε Fortran - συμπληρώσεις: Α. Παγουρτζής, Δ. Σούλιου 1

Συναρτήσεις και Υπορουτίνες (i) Ομάδες εντολών που εκτελούν μια συγκεκριμένη εργασία (μια σειρά υπολογισμών) ή που επαναλαμβάνονται συχνά και αποτελούν ανεξάρτητες προγραμματιστικές οντότητες μπορούν να μετακινηθούν έξω από το κυρίως σώμα του προγράμματος σε υποπρογράμματα. Έτσι απλοποιείται το κυρίως πρόγραμμα και τα υποπρογράμματα μπορούν να διορθωθούν ή τροποποιηθούν πιο εύκολα. 2 Κατηγορίες υποπρογραμμάτων: υπορουτίνες και συναρτήσεις 2

Συναρτήσεις και Υπορουτίνες (i) Οι συναρτήσεις δηλώνονται με την εντολή FUNCTION και οι υπορουτίνες με την εντολή SUBROUTINE. Η βασική διαφορά τους είναι πως οι συναρτήσεις επιστρέφουν τουλάχιστον μια τιμή στο πρόγραμμα που τις καλεί ενώ οι υπορουτίνες μπορεί και να μην επιστρέφουν. Συντακτικά, οι συναρτήσεις έχουν ρόλο παραστάσεων (εκφράσεων), ενώ οι υπορουτίνες έχουν ρόλο εντολών. 3

Συναρτήσεις και Υπορουτίνες (ii) Η δομή ενός προγράμματος με υποπρογράμματα έχει ως εξής: Κύριο Πρόγραμμα Εσωτερικά Υποπρογράμματα Τέλος κύριου Προγράμματος Έχουμε ένα κυρίως πρόγραμμα που καλεί εσωτερικά τα υποπρογράμματά του (συναρτήσεις και υπορουτίνες). Τα εσωτερικά προγράμματα μπορούν να χρησιμοποιηθούν μόνο από το κυρίως πρόγραμμα που τα περιλαμβάνει. Τα υποπρογράμματα δεν μπορούν να περιλαμβάνουν άλλα προγράμματα αλλά μπορούν να καλούν το ένα το άλλο αν βρίσκονται εντός του ιδίου κυρίως προγράμματος. Υπάρχουν και τα εξωτερικά υποπρογράμματα που ουσιαστικά είναι ανεξάρτητα προγράμματα αποθηκευμένα σε διαφορετικά αρχεία και μπορούν να χρησιμοποιηθούν από οποιοδήποτε άλλο πρόγραμμα και μπορεί να περιέχουν εσωτερικά υποπρογράμματα αλλά και να καλούν άλλα εξωτερικά. Στη FORTRAN μπορούμε να συμπεριλάβουμε, σε οποιοδήποτε σημείο του κώδικα του κυρίως προγράμματος ή του υποπρογράμματος, κώδικα που είναι γραμμένος σε άλλο αρχείο χρησιμοποιώντας την εντολή INCLUDE όνομα αρχείου. Το νέο αρχείο μπορεί επίσης να έχει εντολές INCLUDE 4

Συναρτήσεις (i) επιστρεφόμενος τύπος FUNCTION όνομα (όρισμα Α, όρισμα Β, ) τύπος ορίσματος Α :: όρισμα Α τύπος ορίσματος Β :: όρισμα Β... τύπος :: τοπική μεταβλητή... κώδικας... FUNCTION όνομα συνάρτησης Παράδειγμα: REAL FUNCTION emvado_trigwnou(a,b,c) REAL :: a,b,c,temp temp=(a+b+c)/2.0 emvado_trigwnou=sqrt(temp*(temp-a)*(temp-b)*(temp-c)) 5

Συναρτήσεις (ii) Ο επιστρεφόμενος τύπος μπορεί να είναι μια δήλωση τύπου όπως real, integer, κ.λπ. ή μία από τις εντολές recursive, pure, elemental. Το όνομα της συνάρτησης θα πρέπει να δηλωθεί και στο κυρίως πρόγραμμα στις δηλώσεις μεταβλητών και ο τύπος να είναι ο ίδιος. Το όνομα είναι υποχρεωτικό και με αυτό καλείται η συνάρτηση. Ακολουθεί τους κανόνες ονοματολογίας. Ορίσματα είναι η λίστα των παραμέτρων με τις οποίες καλείται η συνάρτηση και τα οποία θα πρέπει να δηλωθούν σαν μεταβλητές αντίστοιχου τύπου. Αν δεν υπάρχουν ορίσματα βάζουμε απλά τις παρανθέσεις. Ορίζονται οι τοπικές μεταβλητές της συνάρτησης Προαιρετικά μπορεί να υπάρχει η εντολή RESULT (αποτέλεσμα). Στην παρένθεση υπάρχει το όνομα της μεταβλητής που επιστρέφει η συνάρτηση. Αν δεν υπάρχει αυτή η εντολή το όνομα της συνάρτησης είναι αυτή η μεταβλητή. Αν υπάρχει εντολή RETURN διακόπτεται η εκτέλεση της συνάρτησης και συνεχίζεται η εκτέλεση του κυρίως προγράμματος. 6

Συναρτήσεις (iii) PROGRAM ypologismos_emvadou REAL::x,y,z,emv,emvado_trigwnou READ(*,*) x,y,z emv = emvado_trigwnou(x,y,z) WRITE(*,*) emv REAL FUNCTION emvado_trigwnou(a,b,c) REAL :: a,b,c,temp temp=(a+b+c)/2.0 emvado_trigwnou=sqrt(temp*(temp-a)*(temp-b)*(temp-c)) 7

Συναρτήσεις (iv) PROGRAM ypologismos_paragontikou_1 INTEGER:: x, paragontiko READ(*,*) x WRITE(*,*) "To paragontiko einai", paragontiko(x) INTEGER FUNCTION paragontiko(a) INTEGER :: a,i,p=1 DO i=1,a p=p*i DO paragontiko = p 8

Συναρτήσεις (v) 2 ος τρόπος δήλωσης με την εντολή CONTAINS PROGRAM όνομα προγράμματος Δηλώσεις μεταβλητών Κλήση συναρτήσεων με ορίσματα CONTAINS FUNCTION όνομα 1 ης συνάρτησης(όρισμα Α, όρισμα Β, ) Δηλώσεις μεταβλητών καθώς και του τύπου επιστροφής της συνάρτησης Υπολογισμός τιμής της συνάρτησης FUNCTION FUNCTION όνομα 2 ης συνάρτησης(όρισμα Α, όρισμα Β, ) Δηλώσεις μεταβλητών καθώς και του τύπου επιστροφής της συνάρτησης Υπολογισμός τιμής της συνάρτησης FUNCTION PROGRAM 9

Συναρτήσεις (vi) 2 ος τρόπος δήλωσης με την εντολή CONTAINS PROGRAM Synarthseis INTEGER:: x=12,y=10 WRITE(*,*) athroisma(x,y); WRITE(*,*) diafora(x,y) CONTAINS FUNCTION athroisma(a,b) INTEGER:: athroisma, a,b athroisma=a+b FUNCTION athroisma FUNCTION diafora(c,d) INTEGER:: diafora,c,d diafora=c-d FUNCTION diafora PROGRAM 10

Συναρτήσεις: πέρασμα παραμέτρων PROGRAM perasma_timi_anafora INTEGER:: x=5,y=10,k,l,syn1,syn2 WRITE(*,*) x,y k=syn1(x) l=syn2(y) WRITE(*,*) x,y INTEGER FUNCTION syn1(a) INTEGER,INTENT(in):: a! Πέρασμα κατά τιμή a=a*10! Compilation error syn1=5 FUNCTION syn1 INTEGER FUNCTION syn2(b) INTEGER,INTENT(inout):: b! Πέρασμα κατ αναφορά b=b*10 syn2=30 FUNCTION syn2 11

Συναρτήσεις: πέρασμα παραμέτρων PROGRAM perasma_anafora_synartisi INTEGER::x,y,w,allagi READ(*,*) x,y WRITE(*,*) arxika x kai y: ", x, y w=allagi(x,y) WRITE(*,*) telika x kai y: ", x, y INTEGER FUNCTION allagi(a,b) INTEGER :: a,b,temp temp=a a=b! Συμπεραίνεται: a κατ αναφορά b=temp! Συμπεραίνεται: b κατ αναφορά allagi=temp Πληκτρολογήστε το πρόγραμμα και δείτε ποιές είναι οι τιμές των x, y πρίν και μετά την κλήση της συνάρτησης 12

Υπορουτίνες PROGRAM perasma_anafora_diadikasia INTEGER::x,y READ(*,*) x,y WRITE(*,*) arxika x kai y: ", x, y CALL allagi(x,y) WRITE(*,*) telika x kai y: ", x, y SUBROUTINE allagi(a,b) INTEGER :: a,b,temp temp=a a=b! Συμπεραίνεται: a κατ αναφορά b=temp! Συμπεραίνεται: b κατ αναφορά Πληκτρολογήστε το πρόγραμμα και δείτε ποιές είναι οι τιμές των x, y πρίν και μετά την κλήση της συνάρτησης 13

Συναρτήσεις με αναδρομή PROGRAM ypologismos_paragontikou_2 INTEGER:: x, paragontiko READ(*,*) x WRITE(*,*) "To paragontiko einai", paragontiko(x) INTEGER RECURSIVE FUNCTION paragontiko(a) result (parag_result) INTEGER :: a IF (a==0) THEN parag_result=1 ELSE parag_result=a*paragontiko(a-1) IF 14

Υπορουτίνες με αναδρομή PROGRAM hanoitowers INTEGER::n READ(*,*) n CALL hanoi(n,'a', b', c') RECURSIVE SUBROUTINE hanoi(n,frompeg,auxpeg,topeg) INTEGER:: n CHARACTER:: frompeg,auxpeg,topeg IF (n == 1) THEN WRITE(*,101) 1, frompeg, topeg ELSE CALL hanoi(n-1,frompeg,topeg,auxpeg) WRITE(*,101) n, frompeg,topeg CALL hanoi(n-1,auxpeg,frompeg,topeg) IF 101 FORMAT(1x,"Move disk ",i1," from peg ", A1, " to peg ", A1) 15

Υπορουτίνες με αναδρομή PROGRAM hanoitowers INTEGER::n READ(*,*) n CALL hanoi(n,'a', b', c') RECURSIVE SUBROUTINE hanoi(n,frompeg,auxpeg,topeg) INTEGER:: n CHARACTER:: frompeg,auxpeg,topeg IF (n == 1) THEN WRITE(*,101) 1, frompeg, topeg ELSE CALL hanoi(n-1,frompeg,topeg,auxpeg) WRITE(*,101) n, frompeg,topeg CALL hanoi(n-1,auxpeg,frompeg,topeg) IF 101 FORMAT(1x,"Move disk ",i1," from peg ", A1, " to peg ", A1) Έξοδος στην οθόνη Move disk 1 from peg a to peg b Move disk 2 from peg a to peg c Move disk 1 from peg b to peg c Move disk 3 from peg a to peg b Move disk 1 from peg c to peg a Move disk 2 from peg c to peg b Move disk 1 from peg a to peg b Move disk 4 from peg a to peg c Move disk 1 from peg b to peg c Move disk 2 from peg b to peg a Move disk 1 from peg c to peg a Move disk 3 from peg b to peg c Move disk 1 from peg a to peg b Move disk 2 from peg a to peg c Move disk 1 from peg b to peg c 16

Merge Sort (i) Ταξινόμηση με συγχώνευση (Ταξινόμηση με συγχώνευση (MergeSort) Διαιρώ την ακολουθία των αριθμών σε δύο μέρη Με αναδρομικές κλήσεις, ταξινομώ τα δύο μέρη ανεξάρτητα Συγχωνεύω τα δύο ταξινομημένα μέρη Στη χειρότερη περίπτωση απαιτούνται O(n log n) συγκρίσεις) 17

Merge Sort (ii) program MergeSortAlgorithm integer, parameter :: N = 20 integer, dimension(n) :: & A=(/85,46,39,81,72,24,105,210,133,22,27,78,28,98,12,34,48,64,23,45/) integer, dimension ((N+1)/2) :: T write(*,'(a,/,10i4,/,10i4)') 'ΜΗ Ταξινομημένος Πίνακας :',A call MergeSort(A,N) write(*,'(a,/,10i4,/,10i4)') 'Ταξινομημένος Πίνακας :',A end 18

Merge Sort: η βασική υπορουτίνα (iii) recursive subroutine MergeSort(A,N) integer, intent(in) :: N integer, dimension(n), intent(in out) :: A integer, dimension((n+1)/2):: T1,T2 integer :: mid,rest,s if (N < 2) return if (N == 2) then if (A(1) > A(2)) then S = A(1) A(1) = A(2) A(2) = S endif return endif...... mid=(n+1)/2 rest=n-mid call MergeSort(A,mid) call MergeSort(A(mid+1),rest) if (A(mid) > A(mid+1)) then T1(1:mid)=A(1:mid) T2(1:rest)=A(mid+1:N) call Merge(T1,mid,T2,rest,A,N) endif return end subroutine MergeSort 19

Merge Sort: υπορουτίνα Merge (iv) subroutine Merge (A,NA,B,NB,C,NC) integer :: NA,NB,NC integer :: A(NA),B(NB),C(NC) integer :: I,J,K I = 1; J = 1; K = 1; do while(i <= NA.and. J <= NB) if (A(I) <= B(J)) then C(K) = A(I); I = I+1 else C(K) = B(J); J = J+1 endif K = K + 1 enddo...... do while (I <= NA) C(K) = A(I) I = I + 1 K = K + 1 enddo do while (J <= NB) C(K) = B(J) J = J + 1 K = K + 1 enddo end subroutine merge 20

Quicksort (i) PROGRAM Quicksort USE Qsort_Module INTEGER, PARAMETER :: Ν = 20 INTEGER :: Α(n) INTEGER :: Ι write(*,*)"dwse times ston pinaka" DO Ι = 1,N read(*,*) Α(Ι) DO WRITE (*, "(A)") "Ο πίνακας πριν την ταξινόμηση" WRITE (*, "(10I5)") A CALL Qsort(Α) WRITE (*,*) WRITE (*, "(A)") "Ο πίνακας μετά την ταξινόμηση" WRITE (*,"(10I5)") Α PROGRAM Quicksort 21

Quicksort: ιδέα (ii) Σε κάθε βήμα της διαμέρισης x x swap(a[left],a[right]) 1 left right N Μετά τη διαμέριση x x x 1 left right N μέρος 1 μέρος 2 x x x 22

Quicksort: βασική υπορουτίνα (iii) MODULE Qsort_Module CONTAINS RECURSIVE SUBROUTINE Qsort(Α) INTEGER, INTENT(IN OUT) :: Α(:) INTEGER :: split IF(size(Α) > 1) THEN CALL Partition(Α, split) CALL Qsort(Α(:split-1)) CALL Qsort(Α(split:)) IF SUBROUTINE Qsort 23

Quicksort: υπορουτίνα Partition (iv) SUBROUTINE Partition(Α, marker) INTEGER, INTENT(IN OUT) :: Α(:) INTEGER, INTENT(OUT) :: marker INTEGER :: left, right, pivot, temp pivot = (Α(1) + Α(size(Α))) / 2 left = 0 right = size(α) + 1 DO WHILE (left < right) right = right - 1 DO WHILE (Α(right) > pivot) right = right-1 DO left = left + 1 DO WHILE (Α(left) < pivot) left = left + 1 DO IF (left < right) THEN temp = Α(left) Α(left) = Α(right) Α(right) = temp IF DO IF (left == right) THEN marker = left + 1 ELSE marker = left IF SUBROUTINE Partition MODULE Qsort_Module 24