Δοµές Δεδοµένων. 8η Διάλεξη: Ταξινόµηση. Ε. Μαρκάκης

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

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

Δοµές Δεδοµένων. 6η Διάλεξη Αναδροµικές Εξισώσεις και Αφηρηµένοι Τύποι Δεδοµένων. Ε. Μαρκάκης

Δοµές Δεδοµένων. 13η Διάλεξη Πίνακες Συµβόλων. Ε. Μαρκάκης

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

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Πίνακες Συµβόλων Κεφάλαιο 12 ( ) Ε. Μαρκάκης Επίκουρος Καθηγητής

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

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ουρές προτεραιότητας Κεφάλαιο 9. Ε. Μαρκάκης Επίκουρος Καθηγητής

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ουρές προτεραιότητας Κεφάλαιο 9. Ε. Μαρκάκης Επίκουρος Καθηγητής

Δοµές Δεδοµένων. 11η Διάλεξη Ταξινόµηση Quicksort και Ιδιότητες Δέντρων. Ε. Μαρκάκης

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Αφηρηµένοι Τύποι Δεδοµένων Κεφάλαιο 4 ( , ) Ε. Μαρκάκης Επίκουρος Καθηγητής

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Στοιχειώδεις Δοµές Δεδοµένων Δοµικά Στοιχεία και Πίνακες Κεφάλαιο 3 (3.1 και 3.2) Ε. Μαρκάκης Επικ. Καθηγητής

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

Δοµές Δεδοµένων. 3η Διάλεξη Στοιχειώδεις Δοµές Δεδοµένων: Πίνακες. Ε. Μαρκάκης

Δοµές Δεδοµένων. 2η Διάλεξη Αλγόριθµοι Ένωσης-Εύρεσης (Union-Find) Ε. Μαρκάκης. Βασίζεται στις διαφάνειες των R. Sedgewick K.

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

Οικονοµικό Πανεπιστήµιο Αθηνών. Τµήµα Πληροφορικής. Φθινοπωρινό Εξάµηνο Δοµές Δεδοµένων - Εργασία 2. Διδάσκων: E. Μαρκάκης

Δοµές Δεδοµένων. 7η Διάλεξη Αφηρηµένοι Τύποι Δεδοµένων. Ε. Μαρκάκης

Δοµές Δεδοµένων. 5η Διάλεξη Λίστες και αρχές ανάλυσης αλγορίθµων. Ε. Μαρκάκης

Βασικές Έννοιες Δοµών Δεδοµένων

Δοµές Δεδοµένων. 4η Διάλεξη Στοιχειώδεις Δοµές Δεδοµένων: Πίνακες και Λίστες. Ε. Μαρκάκης

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών

Δομές ελέγχου ροής προγράμματος

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

Συλλογές, Στοίβες και Ουρές

2.1. Εντολές Σχόλια Τύποι Δεδομένων

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Στοιχειώδεις Δοµές Δεδοµένων Λίστες Κεφάλαιο 3 (3.3, 3.4, 3.7) Ε. Μαρκάκης Επικ. Καθηγητής

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Αρχές Ανάλυσης Αλγορίθµων Κεφάλαιο 2. Ε. Μαρκάκης Επικ. Καθηγητής

Δοµές Δεδοµένων. 10η Διάλεξη Ταξινόµηση. E. Μαρκάκης

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Στοιχειώδεις Δοµές Δεδοµένων Λίστες Κεφάλαιο 3 (3.3, 3.4, 3.7) Ε. Μαρκάκης Επικ. Καθηγητής

Δοµές Δεδοµένων. 14η Διάλεξη Δέντρα Δυαδικής Αναζήτησης. Ε. Μαρκάκης

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

Δοµές Δεδοµένων. 12η Διάλεξη Διάσχιση Δέντρων και Ουρές Προτεραιότητας. Ε. Μαρκάκης

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Αλγόριθµοι Ένωσης-Εύρεσης (Union-Find) Κεφάλαιο 1. Ε. Μαρκάκης Επικ. Καθηγητής

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

Κλάσεις. Τροποποιητές, ιασυνδέσεις, Πακέτα. Τροποποιητές ελέγχου προσπέλασης µεταβλητών και µεθόδων

Ουρά Προτεραιότητας (priority queue)

Δοµές Δεδοµένων. 16η Διάλεξη Κατακερµατισµός. Ε. Μαρκάκης

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Διασυνδέσεις / Διεπαφές. Παναγιώτης Σφέτσος, PhD

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πολυμορφισμός Αφηρημένες κλάσεις Interfaces (διεπαφές)

Κατασκευαστές. Μέθοδοι Κατασκευής (Constructors).

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων Παράδειγμα: Τμήμα πανεπιστημίου

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 22/11/07

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

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

Wrapper Classes, Abstract Classes and Interfaces

ΕΡΓΑΣΙΑ 4 - Αντικειμενοστραφής Υλοποίηση του Συστήματος Κατανομής Θέσεων σε Προγράμματα Σπουδών

Δοµές Δεδοµένων. 15η Διάλεξη Δέντρα Δυαδικής Αναζήτησης και Κατακερµατισµός. Ε. Μαρκάκης

Στοιχεία Αλγορίθµων και Πολυπλοκότητας

p

Η εφαρµογή xsortlab. Οπτικός τρόπος ταξινόµησης

public class ArrayStack implements Stack {

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Στοιχειώδεις Δομές Δεδομένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring

Initialize each person to be free. while (some man is free and hasn't proposed to every woman) { Choose such a man m w = 1 st woman on m's list to

Γράφημα. Συνδυαστικό αντικείμενο που αποτελείται από 2 σύνολα: Σύνολο κορυφών (vertex set) Σύνολο ακμών (edge set) 4 5 πλήθος κορυφών πλήθος ακμών

Δοµές Δεδοµένων. 18η Διάλεξη Ισορροπηµένα δέντρα. Ε. Μαρκάκης

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

Κεφάλαιο 6 Ουρές Προτεραιότητας

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

Δομές δεδομένων (2) Αλγόριθμοι

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Στοιχεία εξεταζόµενου Αριθµός Απάντησης Βαθµολογία. Σύνολο (Θέµα 4 ο )

Δομές Δεδομένων & Αλγόριθμοι

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

Δοκιμή και Αποσφαλμάτωση Testing and Debugging

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

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

Μία Μελέτη Περίπτωσης: Διήθηση

Κλάσεις και Αντικείµενα

Δομές Δεδομένων & Ανάλυση Αλγορίθμων. 3ο Εξάμηνο. Ουρά (Queue) Υλοποίηση της με τη βοήθεια πίνακα.

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07

Ταξινόμηση κάδου και ταξινόμηση Ρίζας Bucket-Sort και Radix-Sort

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

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. Δοµές Δεδοµένων

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

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Κλάσεις.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Μαθήματα από τα εργαστήρια

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

Δομές Δεδομένων & Αλγόριθμοι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

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

ΕΠΛ Φροντιστήριο 3

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

Transcript:

Δοµές Δεδοµένων 8η Διάλεξη: Ταξινόµηση Ε. Μαρκάκης

Υπενθύµιση Εργαστήρια την επόµενη εβδοµάδα Πρόγραµµα εργαστηρίων αναρτηµένο στο eclass Εργασία 1 θα αναρτηθεί την Τρίτη, παράδοση 20/11 Δοµές Δεδοµένων 07-2

Περίληψη ΑΤΔ για πολυώνυµα Ταξινόµηση: οι κανόνες του παιχνιδιού Ταξινόµηση µε εισαγωγή Γενικές Υλοποιήσεις Δοµές Δεδοµένων 07-3

Δοµές Δεδοµένων 07-4 ΑΤΔ για πολυώνυµα Εφαρµογή: Symbolic Mathematics. Προγράµµατα σαν τα Matlab, Mathematica, Maple χρησιµοποιούν µεθόδους για διαχείριση πολυωνύµων Συµβολική επεξεργασία, π.χ.: Θέλουµε µεθόδους για Πρόσθεση πολυωνύµων Πολλαπλασιασµό πολυωνύµων Αποτίµηση ενός πολυωνύµου σε συγκεκριµένο x ( ) 6 3 3 2 3 2 1 1 6 2 1 6 5 4 3 2 3 2 3 2 x x x x x x x x x x x! +! + + = + + + " " # $ % % & '! +!

ΑΤΔ για πολυώνυµα Διασύνδεση ΑΤΔ: class Poly { // υλοποιήσεις και ιδιωτικά µέλη κρυµµένα } Poly(int, int) //φτιάχνει το πολυώνυµο cx N double eval(double) //αποτίμηση void add(poly) // πρόσθεση πολυωνύμων void mult(poly) //πολλαπλασιασμός public String tostring() Δοµές Δεδοµένων 07-5

ΑΤΔ για πολυώνυµα Έστω ότι θέλουµε να υπολογίζουµε τις εκφράσεις (x+1) N, π.χ. (x+1) 2 = x 2 + 2x + 1 (x+1) 4 = x 4 + 4x 3 + 6x 2 + 4x + 1 Πρόγραµµα πελάτη: public class Binomial { public static void main(string[] args) { int N = Integer.parseInt(args[0]); double p = Double.parseDouble(args[1]); Poly y = new Poly(1, 0); //y=1 Poly t = new Poly(1, 0); //t=1 t.add(new Poly(1, 1)); //t = x+1 for (int i = 0; i < N; i++) y.mult(t); } Δοµές Δεδοµένων 07-6

ΑΤΔ για πολυώνυµα Υλοποίηση: Θα δούµε την eval (υπόλοιπες µέθοδοι στο βιβλίο) Εσωτερική αναπαράσταση πολυωνύµου βαθµού Ν: πίνακας Ν+1 στοιχείων µε τους συντελεστές Αποτίµηση πολυωνύµου, Απλοϊκή µέθοδος: Ο(Ν 2 ) πολλαπλ/µοί Αλγόριθµος του Horner: Ο(Ν) ( ( a4x + a3) x + a2) x + a1) x 0 a + 4 3 2 4x + a3x + a2x + a1x + a0 = a Δοµές Δεδοµένων 07-7

ΑΤΔ για πολυώνυµα class Poly { private int n; //βαθμός πολυωνύμου + 1 private int[] a; //συντελεστές Poly(int c, int N) { //δημιουργεί το πολυώνυμο a = new int[n+1]; // cx N n = N+1; a[n] = c; for (int i = 0; i < N; i++) a[i] = 0; } } double eval(double d) { //υπολογισμός της double t = 0.0; // τιμής στο d for (int i = n-1; i >= 0; i--) t = t*d + (double) a[i]; return t; } Δοµές Δεδοµένων 07-8

ΑΤΔ - Σύνοψη Επιτρέπουν το χτίσιµο επιπέδων αφαίρεσης Διαχωρισµός µεταξύ πελάτη και υλοποίησης Διευκολύνουν τη σχεδίαση modular programming Επαναχρησιµοποίηση κώδικα Βολικός µηχανισµός για τη σύγκριση αλγορίθµων Δοµές Δεδοµένων 07-9

Κεφάλαιο 6 Ταξινόµηση Δοµές Δεδοµένων 07-10

Οι κανόνες του παιχνιδιού Στόχος ταξινόµησης Είσοδος: Δίνεται ένα σύνολο Ν στοιχείων Υλοποίηση των συνόλων µε πίνακες ή λίστες Κάθε στοιχείο περιλαµβάνει ένα κλειδί Έξοδος: Αναδιάταξη των στοιχείων σύµφωνα µε τα κλειδιά Αύξουσα / φθίνουσα αριθµητική / λεξικογραφική σειρά Είδη ταξινόµησης Εσωτερική ταξινόµηση: τα στοιχεία χωράνε στη µνήµη Εξωτερική ταξινόµηση: τα στοιχεία αποθηκεύονται στο δίσκο Προσαρµοστική ταξινόµηση: εξαρτάται από τα στοιχεία Σε εσωτερική ταξινόµηση έχουµε πιο εύκολη πρόσβαση στα στοιχεία Θα ασχοληθούµε κυρίως µε εσωτερική ταξινόµηση Δοµές Δεδοµένων 07-11

Οι κανόνες του παιχνιδιού Ταξινόµηση σε πίνακα Κάποιες συµβάσεις: Θέλουµε ταξινόµηση σε αύξουσα σειρά Πρόγραµµα οδήγησης: γεµίζει τον πίνακα και καλεί την sort() Sort(): υλοποιεί έναν αλγόριθµο ταξινόµησης, βασίζεται στις: less(): σύγκριση 2 στοιχείων exch(): αντιµετάθεση 2 στοιχείων compexch(): σύγκριση 2 στοιχείων και αντιµετάθεση αν είναι απαραίτητο αποδεσµεύεται η sort() από τον τύπο δεδοµένων Δοµές Δεδοµένων 07-12

Ταξινόµηση µε εισαγωγή (Insertion Sort) H µέθοδος που χρησιµοποιούν οι χαρτοπαίκτες Δείτε εδώ: http://www.youtube.com/watch?v=ejpfmtym8cw Ή ψάξτε στο youtube insertion sort Δοµές Δεδοµένων 07-13

Ταξινόµηση µε εισαγωγή (Insertion Sort) H ιδέα του αλγορίθµου: Βρόχος στα δεδοµένα εισόδου Στην επανάληψη k: κοιτάµε το στοιχείο a[k] Ο αριστερός υποπίνακας a[0],,a[k-1] είναι ήδη ταξινοµηµένος (από τις προηγούµενες επαναλήψεις) Βρίσκουµε ποια είναι η σωστή θέση για το a[k] Κανουµε τις απαραίτητες αντιµεταθέσεις Δοµές Δεδοµένων 07-14

Ταξινόµηση µε εισαγωγή (Insertion Sort) class ArraySortBasic { static boolean less(double v, double w) { return v < w; } static void exch(double[] a, int i, int j) { double t = a[i]; a[i] = a[j]; a[j] = t; } static void compexch(double[] a, int i, int j) { if (less(a[j], a[i])) exch (a, i, j); } static void sort(double[] a, int p, int r) { for (int i = p+1; i <= r; i++) for (int j = i; j > p; j--) compexch(a, j-1, j); } public static void main(string[] args) { double a[] = new double[integer.parseint(args[0])]; for (int i = 0; i < N; i++) a[i] = Math.random(); sort(a, 0, N-1);} Δοµές Δεδοµένων 07-15

Πολυπλοκότητα Αξιολόγηση αλγορίθµων ταξινόµησης Βασικές λειτουργίες: συγκρίσεις και αντιµεταθέσεις Η σύγκριση απαιτεί ανάγνωση Η µετάθεση απαιτεί ανάγνωση και εγγραφή Οι πιο απλές ταξινοµήσεις είναι συνήθως O(N 2 ) Οι πιο περίπλοκες ταξινοµήσεις είναι O(NlοgN) Ορισµένες ειδικές ταξινοµήσεις είναι O(N) Πολυπλοκότητα της Insertion Sort Worst case: αν ο πίνακας αρχικά είναι σε φθίνουσα σειρά 1 η επανάληψη: 1 σύγκριση και µετάθεση 2 η επανάληψη: 2 συγκρίσεις και µεταθέσεις... Συνολικά 1+2+...+Ν-1 = Ν(Ν-1)/2 = Ο(Ν 2 ) Δοµές Δεδοµένων 07-16

Ιδιότητες και επιπλέον είδη ταξινόµησης Ευσταθής και µη ταξινόµηση Πολλές φορές έχουµε στοιχεία µε πολλά κλειδιά Ευσταθής ταξινόµηση: διατηρεί τη σχετική σειρά ως προς το δεύτερο κλειδί Έστω ότι έχουµε ένα αρχείο µε ονόµατα και βαθµούς Αν ταξινοµούµε µε βάση τους βαθµούς, τα ονόµατα που ισοβαθµούν µένουν ταξινοµηµένα σε ευσταθή ταξινόµηση Οι περισσότερες απλές µέθοδοι είναι ευσταθείς Οι περισσότερες από τις εξελιγµένες µεθόδους δεν είναι ευσταθείς Έµµεση ταξινόµηση (indirect sort) Αναδιατάσσουµε τους δείκτες αλλά όχι τα ίδια τα στοιχεία Δοµές Δεδοµένων 07-17

Γενικές υλοποιήσεις Αποδέσµευση της ταξινόµησης από τους τύπους Οι αλγόριθµοι ταξινόµησης δεν εξαρτώνται από τα κλειδιά Αρκεί να µπορούν να τα συγκρίνουν Οι αλγόριθµοι ταξινόµησης δεν εξαρτώνται από τα στοιχεία Αρκεί να µπορούν να τα αντιµεταθέσουν Γενική βιβλιοθήκη ταξινόµησης Ο πελάτης µεταβιβάζει στη sort() έναν πίνακα στοιχείων Η sort() καλεί τις µεθόδους σύγκρισης και αντιµετάθεσης Η βιβλιοθήκη της Java χρησιµοποιεί τη διεπαφή Comparable Κάθε αντικείµενο µπορεί να υλοποιεί την Comparable Αρκεί να υλοποιεί τη µέθοδο v.compareto(w) -x αν v<w, +x αν v>w, 0 αν v=w Κάθε πίνακας τέτοιων αντικειµένων µπορεί να ταξινοµηθεί Δοµές Δεδοµένων 07-18

Γενικές υλοποιήσεις Μια απλούστερη µορφή της βιβλιοθήκης! Αρχικά ορίζουµε έναν γενικό τύπο αντικειµένου ITEM Η διεπαφή ITEM αρκεί να παρέχει τη µέθοδο less() interface ITEM { boolean less(item v); } Στη συνέχεια ορίζουµε τη γενική τάξη ταξινόµησης Sort Η τάξη δεν περιέχει κατάσταση Όλες οι µέθοδοι είναι static Βοηθητική µέθοδος less() Παίρνει ως παραµέτρο δύο στοιχεία τύπου ITEM Βοηθητικές µέθοδοι exch() και compexch() Παίρνουν ως παραµέτρους πίνακες µε αντικείµενα ITEM Αντιµεταθέτουν στοιχεία τύπου ITEM Δοµές Δεδοµένων 07-19

Γενικές υλοποιήσεις Βοηθητική µέθοδος sort() Καλείται από τους πελάτες µε πίνακα τύπου ITEM και δύο όρια για το εύρος του πίνακα class Sort { static boolean less(item v, ITEM w) { return v.less(w); } static void exch(item[] a, int i, int j) { ITEM t = a[i]; a[i] = a[j]; a[j] = t; } static void compexch(item[] a, int i, int j) { if (less(a[j], a[i])) exch (a, i, j); } static void sort(item[] a, int p, int r) { example(a, p, r); } static void example(item[] a, int p, int r) { for (int i = p+1; i <= r; i++) for (int j = i; j > p; j--) compexch(a, j-1, j); } } Δοµές Δεδοµένων 07-20

Γενικές υλοποιήσεις ΑΤΔ στοιχείων Υλοποιεί τη διεπαφή ITEM Πρέπει να παρέχει υλοποίηση της less() Μπορούµε να προσθέσουµε ανάγνωση, τυχαίο ορισµό και εµφάνιση στοιχείων class myitem implements ITEM { } public boolean less(item) //υλοποιεί τη σύγκριση void read() //διαβάζει το στοιχείο από την είσοδο void rand() //παράγει ένα τυχαίο στοιχείο public String tostring() Δοµές Δεδοµένων 07-21

Γενικές υλοποιήσεις Παράδειγµα 1: τύποι ταξινόµησης ακεραίων Υλοποίηση τάξης myitem Χρησιµοποιεί τις πράξεις των ακεραίων Προσοχή στις µετατροπές τύπων! class myitem implements ITEM { private int key; //το στοιχείο ως προς το οποίο ταξινομούμε public boolean less(item w) { return key < ((myitem) w).key; } void read() { key = In.getInt(); } void rand() { key = (int) (1000 * Math.random()); } public String tostring() { return key + ""; } } Δοµές Δεδοµένων 07-22

ΑΤΔ πίνακα στοιχείων Γενικές υλοποιήσεις Πίνακας στοιχείων άγνωστου τύπου Μπορούµε να προσθέσουµε ανάγνωση και τυχαίο ορισµό στοιχείων πίνακα Παρέχει τη δυνατότητα εµφάνισης και ταξινόµησης (υπο)πινάκων Διασύνδεση class myarray { } myarray(int) void rand() //παράγει τυχαία στοιχεία void read() //διαβάζει τον πίνακα από την είσοδο void show(int, int) //τυπώνει μέρος του πίνακα void sort(int, int) /*ταξινομεί (υπο)πίνακα που καθορίζουν οι παράμετροι */ Δοµές Δεδοµένων 07-23

Γενικές υλοποιήσεις Παράδειγµα 1: τύποι ταξινόµησης ακεραίων Υλοποίηση τάξης myarray µε στοιχεία myitem Υλοποίηση γίνεται µε χρήση των µεθόδων της myitem class myarray { private myitem[] a; private int N; myarray(int N) { this.n = N; a = new myitem[n]; for (int i = 0; i < N; i++) a[i] = new myitem(); } void rand() { for (int i = 0; i < N; i++) a[i].rand(); } void read() { for (int i = 0; i < N; i++) if (!In.empty()) a[i].read(); } void sort(int p, int r) { Sort.sort(a, p, r); } } Δοµές Δεδοµένων 07-24

Γενικές υλοποιήσεις Πρόγραµµα οδήγησης ταξινόµησης (driver program) class ArraySort { public static void main(string[] args) { int N = Integer.parseInt(args[0]); myarray A = new myarray(n); if (args.length < 2) A.rand(); else A.read(); A.sort(0, N-1); A.show(0, N-1); } } Δοµές Δεδοµένων 07-25

Γενικές υλοποιήσεις Παράδειγµα 2: τύποι ταξινόµησης εγγραφών Έστω µία τραπεζική εφαρµογή µε αντικείµενα που περιέχουν: Αριθµό λογαριασµού (int), όνοµα (String), υπόλοιπο (double) Αρχικά ορίζουµε την τάξη των εγγραφών Μπορούµε να επιλέξουµε το κλειδί ταξινόµησης Η SortKeyField δείχνει ποιο κλειδί θέλουµε class Record { int id; //αριθμός λογαριασμού double balance; //υπόλοιπο String who; //όνομα static int SortKeyField = 0; public String tostring() { return id+" "+balance + " " + who; } } Δοµές Δεδοµένων 07-26

Γενικές υλοποιήσεις Παράδειγµα 2: τύποι ταξινόµησης εγγραφών Στη συνέχεια ορίζουµε την τάξη myitem Κληρονοµεί τη Record και υλοποιεί την ITEM Η less() ταξινοµεί ανάλογα µε τη SortKeyField class myitem extends Record implements ITEM { public boolean less(item w) { myitem r = (myitem) w; switch (SortKeyField) { case 2: return who.compareto(r.who) < 0; case 1: return balance < r.balance; default: return id < r.id; } } } Δοµές Δεδοµένων 07-27

Γενικές υλοποιήσεις Ιδιότητες γενικής υλοποίησης Λειτουργεί µε οποιονδήποτε τύπο αντικειµένων Όχι τόσο αποδοτική για ενσωµατωµένους τύπους Απαιτείται ένα πρόσθετο επίπεδο αναφορών Στην πράξη όµως εργαζόµαστε µε αντικείµενα (π.χ. εγγραφές) και όχι µε στοιχειώδεις τύπους Υλοποιεί ταξινόµηση δεικτών Ταξινόµηση δεικτών Οι πίνακες αντικειµένων περιέχουν αναφορές Η αντιµετάθεση γίνεται σε επίπεδο αναφορών Αποφεύγεται η αντιγραφή των αντικειµένων Το κόστος της αντιµετάθεσης είναι µικρό Ανάλογο µε την αντιµετάθεση ακεραίων Δοµές Δεδοµένων 07-28