Να κάνω πιο ενδιαφέρον το πρόγραμμα:
Θα ήθελα να δω την λύση χωρίς να μετακινούνται τα ονόματα αλλά να υπάρχει πίνακας δεικτών όπου το κάθε Χ όνομα δείχνει το επόμενο Χ (ταξινομημένο).
Σε κάθε εισαγωγή θα γίνεται μια γρήγορη ανίχνευση και θα παρεμβάλεται το στοιχείο (Κωδικός, όνομα και βαθμός) ανανενώνοντας τον δείκτη ΕΠΟΜΕΝΟ του προηγούμενου στοιχείου αντιγράφοντας πρώτα αυτόν τον δείκτη στο καινούργιο στοιχείο.
Ο πίνακας με τα στοιχεία ουδέποτε θα ταξινομηθεί αυτούσιος. Όλες οι αναφορές σ΄αυτόν θα γίνονται έμμεσα από τον πίνακα ΕΠΟΜΕΝΟ.
Για κάθε εισαγωγή στοιχείου θα απαιτηθεί μια σάρωση των στοιχείων. Δεν θα απαιτηθεί ξεχωριστό στάδιο ταξινόμησης, όπως στην λύση του periptero, η οποία είναι η πλέον χρονοβόρα (bubble sort).
Το επόμενο στάδιο είναι να φτιάξουμε μια γρήγορη αναζήτηση. Ετοιμάζουμε έναν πίνακα ΤΑΧΥΣ διαβάζοντας μια φορά την λίστα των ΕΠΟΜΕΝΟ...η οποία για κάθε επόμενο πάει μπροστά ή πίσω (να γιατι η προσπέλαση αυτή λέγεται ΤΥΧΑΙΑ ΠΡΟΣΠΕΛΑΣΗ και οι μνήμες RAM φτιάχτηκαν γι' αυτόν το σκοπό, RANDOM ACCESS MEMORY)...αλλά με την ανάγνωση προκαλούμε την παραγωγή της σωστής σειράς και την τοποθετούμε σε έναν πίνακα.
Ο πίνακας ΤΑΧΥΣ χρησιμοποιείται ως εξής: Εκλέγουμε με μια ακέραια διαίρεση του πλήθους καταχωρήσεων τη μεσαία καταχώρηση. Κάνουμε την σύγκρισή μας και ανάλογα επιλέγουμε το άνω μισό ή το κάτω μισό...μέχρι το διάστημα να μην διαιρείται. Εκεί είναι η νέα θέση. Πάμε στον πίνακα ΕΠΟΜΕΝΟ και κάνουμε την παρεμβολή (βάζουμε στην αμέσως επόμενη ελεύθερη θέση του πίνακα την τιμή που έδειχνε η θέση που βρέθηκε στον ΤΑΧΥΣ ο οποίος δείχνει στον ΕΠΟΜΕΝΟ, ο οποίος δείχνει το επόμενο των καταχωρήσεων ...είναι λίγο σπαζοκεφαλιά αλλά βγαίνει).
Το κέρδος από αυτή την διαδικασία είναι η ταχύτητα διεκπεραίωσης..η οποία είναι σημαντική όταν η λίστα ξεφύγει από τα δέκα ονόματα...(η bubble sort είναι γρήγορη για μέχρι δέκα στοιχεία). Τελικά ο μόνος πίνακας που φτιάχνεται πριν από κάθε αναζήτηση είναι ο ΤΑΧΥΣ...αλλά μας οδηγεί να γίνονται λιγότερες συγκρίσεις..(αφού πάμε με δείκτες)
Αν ΠΕΡΙΕΧΟΜΕΝΟ ο πίνακας των στοιχείων, τότε θα έχουμε την τιμή ΕΠΟΜ όπου θα δείχνει το πρώτο στοιχείο του ΕΠΟΜΕΝΟ όπου σ΄αυτό θα φαίνεται το επόμενο στοιχείο. .
Ο πίνακας ΤΑΧΥΣ θα έχει στο στοιχείο 1 την τιμή της ΕΠΟΜ...και στο 2 την τιμή της ΕΠΟΜΕΝΟ(ΕΠΟΜ) και στην 3 την τιμή ΕΠΟΜΕΝΟ(ΕΠΟΜΕΝΟ(ΕΠΟΜ))....
Στον πίνακα ΕΠΟΜΕΝΟ θα υπάρχει ένα στοιχείο με τιμή 0 που θα σημαίνει δεν υπάρχει επόμενο (είναι δηλαδή το τελευταίο στοιχείο). Ο πίνακας ΤΑΧΥΣ δεν θα έχει πουθενά τιμή 0 (αν οι δείκτες του ΠΕΡΙΕΧΟΜΕΝΟ ξεκινούν από 1). Μεταξύ τους οι ΠΕΡΙΕΧΟΜΕΝΟ και ΕΠΟΜΕΝΟ έχουν αντιστοιχία ένα προς ένα...το ΠΕΡΙΕΧΟΜΕΝΟ(5) έχει επόμενο το ΠΕΡΙΕΧΟΜΕΝΟ(ΕΠΟΜΕΝΟ(5)) αλλά δεν σημαίνει ότι είναι το πέμπτο ταξινομημένο στοιχείο αλλά το πέμπτο που εισήχθηκε ως περιεχόμενο!
Έχω γράψει όλα όσα χρειάζεται κανείς για να φτιάξει το πρόγραμμα...ας δούμε λοιπόν την λύση σε ΓΛΩΣΣΑ!
Βρείτε την!
Μπορούμε να έχουμε έτοιμο τον πίνακα ΤΑΧΥΣ πριν την εισαγωγή του επόμενoυ στοιχείου....Μια ακόμα βελτίωση θα είναι η γνώση της θέσης στον ΤΑΧΥΣ και η απευθείας παρεμβολή με μετακίνηση μονο αυτών των δεικτών που χρειάζονται μια θέση παραπάνω. Μια ανώτερη ακόμα τεχνική είναι ο πίνακας ΤΑΧΥΣ να είναι σελιδοποιημένος όπου κάθε μετακίνηση να δημιουργεί πρώτα μετατοπίσεις σελίδων (άρα όχι στοιχείων αλλά δεικτών σε σελίδες)...και μετά να γίνεται μια μετακίνηση από μια σελίδα σε άλλη...και αυτές οι δυο σελίδες να έχουν η μία άνω και η άλλη κάτω κενό χώρο, πάλι μέσω ενός δείκτη, για το σκοπό αυτό υπήρχε από παλιά σύστημα σελιδοποίησης της μνήμης όπου ο αριθμός σελίδας αναφέρεται ως SEGMENT,
http://en.wikipedia.org/wiki/Segmentation_(memory), όταν δεν αντιστοιχούσε σε ένα SEGMENT φυσική διεύθυνση, ούτε από την εικονική, τότε έβγαινε ένα EXCEPTION ή μπλέ οθόνη στα Windows....Τα segments είναι ακόμα χαρακτηριστικά της οικογένειας μικροεπεξεργαστών της Intel x86, σε αντίθεση με την οικογένεια της Motorola 68xxx που χρησιμοποιούσε flat model στην μνήμη...εννιαία ή επίπεδη...όλες οι διευθύνσεις να είναι μια συνέχεια...ενώ στα Segment το κάθε segment μπορούσε κανείς να το αναδιατάξει λογικά και είχε και το μειονέκτημα οι δείκτες να είναι περιορισμένοι εντός segment ενώ στο flat model οι δείκτες είναι μεγάλοι...και τους προβάλουν ως 32bit μοντέλο προγρμματισμού...και εννοούν το μέγεθος των δεικτών και η σχέση τους με την μνήμη.
Στην πληροφορική κερδίζει αυτός που έχει γενική εικόνα του υπολογιστή, από τους καταχωρητές, τον χειρισμό της μνήμης μέχρι και το πώς δουλεύουν τα interrupts, οι διακοπές! Και αυτό γιατί όλη αυτή η βασική γνώση αναπαράγεται μέσα στα προγράμματα...όπως έδειξα με τον πίνακα ΤΑΧΥΣ!
Δείτε τι σχέση υπάρχει μεταξύ εφαρμογής και μνήμης με μια εικόνα:
http://en.wikipedia.org/wiki/Image:VirtualMem01.png