10η Διάλεξη Ταξινόμηση E. Μαρκάκης

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
Ε. ΠετράκηςΛίστες1  Λίστα: πεπερασμένη σειρά στοιχείων ίδιου τύπου  Οι πράξεις εξαρτώνται από τον τύπο της λίστας και όχι από τον τύπο δεδομένων  Λίστα:
Advertisements

Συλλογές, Στοίβες και Ουρές Σε πολλές εφαρμογές μας αρκεί η αναπαράσταση ενός δυναμικού συνόλου με μια δομή δεδομένων η οποία δεν υποστηρίζει την αναζήτηση.
Στοιχειώδεις Δομές Δεδομένων TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Τύποι δεδομένων στη Java • Ακέραιοι.
Εισαγωγή στους Αλγόριθμους Ταξινόμησης
Λίστες παράλειψης (skip lists) TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A
Lab 3: Sorted List ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι18/10/2010.
Γιάννης Σταματίου Μη αποδοτική αναδρομή και η δυναμική προσέγγιση Webcast 8.
Διαίρει-και-Βασίλευε
Ισορροπημένα Δένδρα TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Μπορούμε να επιτύχουμε χρόνο εκτέλεσης για.
Δυναμικη Δεσμευση Μνημης Συνδεδεμενες Λιστες (dynamic memory allocation, linked lists) Πως υλοποιουμαι προγραμματα που δεν γνωριζουμε πριν την εκτελεση.
ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι
Αλγόριθμοι Ταξινόμησης
Διερεύνηση γραφήματος. Ένας αλγόριθμος διερεύνησης γραφήματος επισκέπτεται τους κόμβους του γραφήματος με μια καθορισμένη στρατηγική, π.χ. κατά εύρος.
Lab 3: Sorted List ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι115/4/2015.
Λίστες παράλειψης (skip lists) TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A
Θεωρία Υπολογισμού Χρονική Πολυπλοκότητα και Μοντέλα.
ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ Διδάσκοντες:Γιάννης Μαΐστρος Στάθης Ζάχος Νίκος Παπασπύρου
Ενότητα 2.1 Αλγόριθμοι Ταξινόμησης O(n 2 ) & O(nlogn) Σχεδίαση & Ανάλυση Αλγορίθμων.
8-1 ΜΑΘΗΜΑ 8 ο Εισαγωγή στους Αλγόριθμους Ταξινόμησης.
Δομές Δεδομένων και Αρχεία
Δομές Δεδομένων 8η Διάλεξη: Ταξινόμηση Ε. Μαρκάκης.
Ενότητα 1 1 Πρότυπο κόστος. Τι είναι: –Πολύ σωστά και πολύ λεπτομερειακά υπολογισμένο προϋπολογιστικό κόστος Τι εκφράζει: –Στόχους που θα πρέπει να επιτευχθούν.
Δομές Δεδομένων 7η Διάλεξη Αφηρημένοι Τύποι Δεδομένων Ε. Μαρκάκης.
17η Διάλεξη Ισορροπημένα δέντρα Ε. Μαρκάκης
ΔΟΜΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΕ C 1.Σχόλια 2.Οδηγίες προεπεξεργαστή 3.Ορισμοί τύπων 4.Δηλώσεις συναρτήσεων (πρωτότυπα) 5.Ορισμός της main 6.Ορισμοί συναρτήσεων.
ΘΕΑΤΡΟΠΑΙΔΑΓΩΓΙΚΟ ΠΡΟΓΡΑΜΜΑ ΣΕ ΣΥΝΕΡΓΑΣΙΑ ΜΕ ΤΟ ΣΥΛΛΟΓΟ ΑΜΕΑ ΑΡΓΟΛΙΔΑΣ.
Εισαγωγή στον Προγ/μό Η/Υ
Διδάσκων: Δρ. Τσίντζα Παναγιώτα
Διδάσκων: Δρ. Τσίντζα Παναγιώτα
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Στοιχειώδεις Δομές Δεδομένων: Πίνακες και Λίστες
Διδάσκων: Δρ. Τσίντζα Παναγιώτα
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
Διδάσκων: Δρ. Τσίντζα Παναγιώτα
Π Ι Ν Α Κ Ε Σ (arrays) ΤΑΞΙΝΟΜΗΣΗ
Διερεύνηση γραφήματος
ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ ΠΡΟΫΠΟΛΟΓΙΣΜΟΥΣ
18η Διάλεξη Ισορροπημένα δέντρα Ε. Μαρκάκης
Μετασχηματισμός Laplace συνέχεια
9η Διάλεξη Ταξινόμηση Ε. Μαρκάκης
Περιορισμοί Αλγοριθμικής Ισχύος – Κατηγοριοποίηση πολυπλοκοτήτων
Εισαγωγή στον Προγ/μό Υπολογιστών
Δομές διακλάδωσης, επαναλήψεις, μέθοδοι
12η Διάλεξη Διάσχιση Δέντρων και Ουρές Προτεραιότητας Ε. Μαρκάκης
Ταξινόμηση Ορισμός: Δοθέντων των στοιχείων a1,a2,… ,an η ταξινόμηση συνίσταται στην αντιμετάθεση της θέσης των στοιχείων ώστε να τοποθετηθούν με μια νέα.
Τεχνολογία και Προγραμματισμός Υπολογιστών
Χωρικοί-χρονικοί συμβιβασμοί
Ο Κύκλος του Νερού (Φυσική) Μεταβιτσιάδου Ελένη Σελίδα 1
11η Διάλεξη Ταξινόμηση Quicksort και Ιδιότητες Δέντρων Ε. Μαρκάκης
ΚΑΤΑΚΛΙΣΗ ΔΙΑΜΕΡΙΣΜΑΤΟΣ ΑΠΌ ΘΑΛΑΣΣΑ
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον ΑΕΠΠ
Ουρά Προτεραιότητας (priority queue)
Αναδρομικές Εξισώσεις και Αφηρημένοι Τύποι Δεδομένων
15η Διάλεξη Δέντρα Δυαδικής Αναζήτησης και Κατακερματισμός Ε. Μαρκάκης
ΤΜΗΜΑ : Πρακτικών Ασκήσεων Διδασκαλίας (ΠΑΔ)
Πείθουμε τους εαυτούς μας ότι η ζωή μας θα είναι καλύτερη όταν θα παντρευτούμε, θα αποκτήσουμε ένα μωρό, μετά ένα ακόμα. Μετά αγχωνόμαστε διότι τα παιδιά.
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
מבני נתונים ויעילות אלגוריתמים
ΓΡΑΜΜΕΣ - ΓΡΑΜΜΑΤΑ - ΓΕΩΜΕΤΡΙΚΕΣ ΚΑΤΑΣΚΕΥΕΣ
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Sắp thứ tự.
THIẾT KẾ VÀ ĐÁNH GIÁ THUẬT TOÁN
Δομές Δεδομένων (Data Structures)
Δομές ροής προγράμματος
Πείθουμε τους εαυτούς μας ότι η ζωή μας θα είναι καλύτερη όταν θα παντρευτούμε, θα αποκτήσουμε ένα μωρό, μετά ένα ακόμα. Μετά αγχωνόμαστε διότι τα παιδιά.
ΙΝΣΤΙΤΟΥΤΟ ΕΛΛΗΝΙΚΟΥ ΓΑΛΑΚΤΟΣ
Πείθουμε τους εαυτούς μας ότι η ζωή μας θα είναι καλύτερη όταν θα παντρευτούμε, θα αποκτήσουμε ένα μωρό, μετά ένα ακόμα. Μετά αγχωνόμαστε διότι τα παιδιά.
Δομές Δεδομένων (Data Structures)
«Το επείγον στην Παιδιατρική»
Μεταγράφημα παρουσίασης:

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

Περίληψη Ταξινόμηση με αριθμοδείκτη κλειδιού Ταξινόμηση με συγχώνευση – Αλγόριθμος Mergesort Διμερής συγχώνευση Αφηρημένη επιτόπου συγχώνευση Αναλυτική ταξινόμηση Mergesort Συνθετική ταξινόμηση Mergesort Χαρακτηριστικά επιδόσεων Υλοποιήσεις Mergesort με λίστες Δομές Δεδομένων

Καταμέτρηση με αριθμοδείκτη Ταξινόμηση ειδικής μορφής Αποφυγή συγκρίσεων αν εκμεταλλευθούμε ειδικές ιδιότητες των κλειδιών Έστω N κλειδιά με διακεκριμένες τιμές από 0 έως N-1 for (i = 0; i < N; i++) b[a[i].key] = a[i]; Καταμέτρηση με αριθμοδείκτη κλειδιού Έστω N κλειδιά που παίρνουν τιμές 0 ή 1 Πρώτη διέλευση: μέτρηση των στοιχείων με κλειδί 0 και αντίστοιχα με κλειδί 1 Χρήση πίνακα μετρητών με 2 στοιχεία, cnt[0], cnt[1] και πίνακα b με Ν στοιχεία cnt[0]: δείχνει αρχικά την θέση που πρέπει να μπει το πρώτο 0 στον b cnt[1]: θέση που πρέπει να μπει το πρώτο στοιχείο με κλειδί 1 στον b Δεύτερη διέλευση στον πίνακα: μεταφέρουμε κάθε κλειδί στη σωστή θέση στον b και αυξάνουμε τον αντίστοιχο μετρητή for (i = 0; i < N; i++) b[cnt[a[i]]++] = a[i]; Δομές Δεδομένων

Καταμέτρηση με αριθμοδείκτη Γενίκευση σε μεγαλύτερο αριθμό κλειδιών Έστω N κλειδιά με τιμές 0 έως M-1 Το M πολύ μικρότερο από το N Πιθανόν πολλά κλειδιά με ίδιες τιμές Πρώτη διέλευση: μετράμε το πλήθος κλειδιών για κάθε τιμή Χρήση ενός πίνακα μετρητών cnt[] M στοιχείων Χρήση πίνακα b για προσωρινή αποθήκευση των στοιχείων Μετατροπή των μετρητών σε αθροιστικούς, π.χ. cnt[k] = πόσα στοιχεία έχουν κλειδί μικρότερο από k = θέση που πρέπει να μπει το πρώτο στοιχείο με κλειδί k Δεύτερη διέλευση: μεταφέρουμε κάθε κλειδί στη σωστή θέση Ο αντίστοιχος μετρητής αυξάνεται Η θέση για το επόμενο θα δίνεται πάντα από τον μετρητή Στο τέλος μεταφέρουμε τα στοιχεία πίσω στον a Δομές Δεδομένων

Καταμέτρηση με αριθμοδείκτη Σειρά περασμάτων στους πίνακες 1ο: αρχικοποίηση M μετρητών 2ο: μέτρηση κλειδιών 3ο: μετατροπή M μετρητών σε αθροιστικούς 4ο: μεταφορά N κλειδιών στις σωστές θέσεις 5ο: επαναφορά N κλειδιών στον αρχικό πίνακα static void distCount(int a[], int p, int r) { int i, j, cnt[] = new int[M]; int b[] = new int[a.length]; for (j = 0; j < M; j++) cnt[j] = 0; for (i = p; i <= r; i++) cnt[a[i]+1]++; for (j = 1; j < M; j++) cnt[j] += cnt[j-1]; for (i = p; i <= r; i++) b[cnt[a[i]]++] = a[i]; for (i = p; i <= r; i++) a[i] = b[i-p]; } Δομές Δεδομένων

Καταμέτρηση με αριθμοδείκτη Πόσο εξοικονομούμε με την ταξινόμηση με αριθμοδείκτη? Θεώρημα: Η καταμέτρηση με αριθμοδείκτη γίνεται σε χρόνο Ο(Ν) υπό την προϋπόθεση ότι το πλήθος των διαφορετικών τιμών των κλειδιών Μ είναι Ο(Ν) Αρκεί να δούμε τις πράξεις στους 5 βρόχους Κάθε βρόχος εκτελείται σε Ο(Μ) ή σε Ο(Ν) Συνολική πολυπλοκότητα είναι Ο(Μ+Ν), άρα Ο(Ν) Δομές Δεδομένων

Ταξινόμηση με συγχώνευση Κεφάλαιο 8 Ταξινόμηση με συγχώνευση Αλγόριθμος Mergesort Δομές Δεδομένων

Ταξινόμηση με συγχώνευση Βασική ιδέα αλγορίθμων συγχώνευσης: Διαίρει και βασίλευε Χωρισμός σε 2 υποαρχεία Χωριστή ταξινόμηση σε κάθε αρχείο Συγχώνευση των 2 υποαρχείων σε ένα ταξινομημένο αρχείο Υλοποίηση συνήθως με αναδρομή (μπορούμε και χωρίς αναδρομή) Ευσταθής μεθοδος αν είμαστε λίγο προσεκτικοί Ακολουθιακή πρόσβαση στα δεδομένα, κατάλληλη για μηχανηματα υψηλής απόδοσης με γρήγορη πρόσβαση σε δεδομένα 1η υλοποίηση: von Neumann στον υπολογιστή EDVAC (1945) Δομές Δεδομένων

Ταξινόμηση με συγχώνευση Αλγόριθμος Mergesort Αναλυτική (top-down) ταξινόμηση με συγχώνευση 2 αναδρομικές κλήσεις σε αρχεία με το μισό αρχικό μέγεθος Αναδρομή τελειώνει όταν το αρχείο έχει μόνο ένα στοιχείο Χρησιμοποιεί τη μέθοδο merge στο τέλος για να συγχωνεύσει τους 2 υποπίνακες static void mergesort(ITEM[] a, int p, int r) { if (r <= p) return; int m = (r+p)/2; mergesort(a, p, m); mergesort(a, m+1, r); merge(a, p, m, r);/*συγχωνεύει τους ταξινομημένους υποπίνακες a[p..m] και a[m+1..r]*/ } Δομές Δεδομένων

Ταξινόμηση με συγχώνευση Δομές Δεδομένων

Ταξινόμηση με συγχώνευση Δέντρα «διαίρει και βασίλευε» Μας δείχνουν πώς αποσυντίθεται το αρχικό πρόβλημα σε υποπροβλήματα μικρότερου μεγέθους Στη Mergesort, είναι ανεξάρτητα από δεδομένα εισόδου Δομές Δεδομένων

Υλοποίηση συγχώνευσης Τελικό βήμα της Mergesort Θα δούμε πρώτα μία πιο γενική υλοποίηση Είσοδος: 2 ταξινομημένοι πίνακες a και b Έξοδος: Συγχώνευση των a, b σε ένα ταξινομημένο πίνακα c Σε κάθε βήμα: Εντοπίζουμε το μικρότερο στοιχείο στους a, b Το αντιγράφουμε στο νέο πίνακα Ενημερώνουμε τους δείκτες Προσοχή στα όρια των πινάκων! Δομές Δεδομένων

Υλοποίηση συγχώνευσης Πίνακες εισόδου: a με όρια ap, ar, και b με όρια bp br Πίνακας εξόδου: c με αρχικό δείκτη cp Μέγεθος του c πρέπει να είναι τουλάχιστον cp + (ar- ap +1) + (br- bp +1) static void mergeAB(ITEM[] c, int cp, ITEM[] a, int ap, int ar, ITEM[] b, int bp, int br ) { int i = ap, j = bp; for (int k = cp; k < cp+ar-ap+br-bp+1; k++) { if (i > ar) { c[k] = b[j++]; continue; } if (j > br) { c[k] = a[i++]; continue; } c[k] = less(a[i], b[j]) ? a[i++] : b[j++]; } } Δομές Δεδομένων

Αφηρημένη επιτόπου συγχώνευση 2η υλοποίηση: Συγχώνευση απευθείας στον πίνακα εισόδου Οι δύο υποπίνακες βρίσκονται στον πίνακα εισόδου Αρκεί να ξέρουμε σε ποιον δείκτη m χωρίζονται a[p] έως a[m] και a[m+1] έως a[r] Η έξοδος θα είναι και αυτή στον πίνακα εισόδου Αποφυγή των ελέγχων τερματισμού Σε κάθε βήμα ελέγχουμε αν τελείωσε κάθε υποπίνακας Πώς μπορούμε να αποφύγουμε τους ελέγχους; Ιδέα: αντιστροφή δεύτερου υποπίνακα Τα δύο μεγαλύτερα στοιχεία γειτονεύουν Το μεγαλύτερο από τα δύο χρησιμεύει ως φρουρός! Δομές Δεδομένων

Αφηρημένη επιτόπου συγχώνευση Υλοποίηση επιτόπου συγχώνευσης Χρησιμοποιεί τον βοηθητικό πίνακα aux Ο δεύτερος υποπίνακας αντιστρέφεται Το μέγιστο στοιχείο είναι στο a[m] ή στο a[m+1] static void merge(ITEM[] a, int p, int m, int r) { int i, j; for (i = m+1; i > p; i--) aux[i-1] = a[i-1];//στο τέλος i=p for (j = m; j < r; j++) aux[j+1] = a[r+m-j];//στο τέλος j=r for (int k = p; k <= r; k++) if (less(aux[j], aux[i])) a[k] = aux[j--]; else a[k] = aux[i++]; } Δομές Δεδομένων

Ταξινόμηση με συγχώνευση Ανάλυση της πολυπλοκότητας Ν = r-p+1 Ανάλυση πρώτα της merge: 1ος βρόχος: Ο(Ν) 2ος βρόχος: Ο(Ν) 3ος βρόχος: Ο(Ν) Συνολικά: Ο(Ν) Τελικά συνολικός χρόνος που απαιτείται: ΤN=2ΤN/2 + Ο(Ν), Τ1 = Ο(1) Δομές Δεδομένων

Ταξινόμηση με συγχώνευση Επίλυση της αναδρομικής εξίσωσης ΤN = 2ΤN/2 + Ν, Τ1 = 1 Θα δούμε τη λύση για δυνάμεις του 2. Έστω Ν = 2n Αναπτύσσουμε την εξίσωση Όταν k = logN, TN = NT1 + NlogN = O(NlogN) Όταν το Ν δεν είναι δύναμη του 2, αποδεικνύεται το ίδιο με επαγωγή Δομές Δεδομένων

Ταξινόμηση με συγχώνευση Αρχικά συμπεράσματα: Ο(NlogN): Πολύ καλύτερη πολυπλοκότητα από τις στοιχειώδεις μεθόδους ταξινόμησης Δεν σταματάει άμεσα όμως σε ταξινομημένα αρχεία Δομή αναδρομικών κλήσεων Η διαίρεση του αρχείου στα δύο οδηγεί σε ισοζυγισμένο δένδρο Πρόσθετος χώρος O(N) Απαιτεί δεύτερο πίνακα Απαιτήσεις σε χώρο και χρόνο δεν επηρεάζονται από την αρχική διάταξη των δεδομένων Μπορεί να γίνει ευσταθής αν έχουμε διπλά κλειδιά Δομές Δεδομένων

Συνθετική ταξινόμηση Συνθετική (bottom-up) ταξινόμηση με συγχώνευση Μη αναδρομική υλοποίηση! Ιδέα: διαφορετικός τρόπος διάσχισης του δέντρου διαίρει και βασίλευε Η αναδρομική υλοποίηση επεξεργάζεται πρώτα το δεξιό και το αριστερό υποδέντρο και μετά πάει αμέσως στο πιο πάνω επίπεδο. Οποιαδήποτε άλλη διάσχιση που διατρέχει τα υποδέντρα κάποιου κόμβου πριν επισκεφτεί τον κόμβο είναι επίσης σωστή Μπορούμε π.χ. να διασχίσουμε πρώτα το κατώτερο επίπεδο του δέντρου, μετά το επόμενο επίπεδο κ.ο.κ. Αρχικά κάθε στοιχείο είναι υποπίνακας Σε κάθε βήμα συγχωνεύονται γειτονικοί υποπίνακες Το μέγεθος των πινάκων είναι m = 1, 2, 4, 8, … Πρώτα γίνονται όλες οι 1x1 συγχωνεύσεις, μετά οι 2x2, μετά οι 4x4,... Δομές Δεδομένων

Συνθετική ταξινόμηση Μη αναδρομική υλοποίηση: static int min(int A, int B) {return (A < B)? A: B; } static void mergesort(ITEM[] a, int p, int r) { if (r <= p) return; aux = new ITEM[a.length]; for (int m = 1; m <= r-p; m = m+m)/* m= 1, 2, 4,… για κάθε m κάνουμε συγχωνεύσεις m επί m μέχρι να φτάσουμε στο δεξιό όριο r*/ for (int i = p; i <= r-m; i += m+m) merge(a, i, i+m-1, min(i+m+m-1, r)); } Δομές Δεδομένων

Συνθετική ταξινόμηση Δομή κλήσεων (όχι αναδρομικών!) Όταν το Ν είναι δύναμη του 2 το δέντρο είναι ίδιο με τον αναδρομικό αλγόριθμο Όταν το Ν δεν είναι δύναμη του 2 έχουμε διαφορετικό δέντρο Σε κάθε επανάληψη το μέγεθος των υποπινάκων που συγχωνεύονται είναι δυνάμεις του 2 εκτός ίσως από τον τελευταίο υποπίνακα. Δομές Δεδομένων

Σύγκριση των 2 υλοποιήσεων Ίδιο κόστος χρόνου χειρότερης περίπτωσης O(NlοgN) και πρόσθετος χώρος O(N) Δεν χρειάζεται όμως στοίβα αναδρομής στη συνθετική ταξινόμηση Κατάλληλες και οι 2 υλοποιήσεις όταν μας ενδιαφέρει περισσότερο ο χρόνος και οχι οι απαιτήσεις μνήμης Δομές Δεδομένων

Χαρακτηριστικά επιδόσεων Βελτιώσεις απόδοσης Ο mergesort δεν είναι ιδιαίτερα αποδοτικός για μικρό Ν Χρήση Insertion Sort για μικρούς υποπίνακες Λύση που χρησιμοποιείται και σε άλλες ταξινομήσεις Μείωση χρόνου κατά 15% περίπου Εξάλειψη των διπλών αντιγραφών σε κάθε βήμα Χρήση δύο πινάκων και εναλλαγή κλήσεων Απλή σχετικά λύση, αποφεύγει τη μία αντιγραφή Εξάλειψη του πρόσθετου πίνακα Αρκετά πιο περίπλοκη λύση, κέρδος μάλλον οριακό Δομές Δεδομένων

Χαρακτηριστικά επιδόσεων Α: Αναδρομικός αλγόριθμος Α*: Αναδρομικός με Insertion Sort για μικρά υποαρχεία Σ: συνθετικός αλγόριθμος Σ*: συνθετικός με Insertion Sort για μικρά υποαρχεία Αναλυτικός ή συνθετικός; Ο αναλυτικός είναι λίγο πιο γρήγορος (περίπου 10%) Ν Α Α* Σ Σ* 12500 27 16 30 20 25000 43 34 42 36 50000 91 79 92 77 100000 199 164 204 175 200000 421 352 455 396 400000 904 764 992 873 800000 1910 1629 2106 1871 Δομές Δεδομένων

Υλοποίηση με λίστες Χρησιμοποιώντας λίστες μπορούμε να αποφύγουμε τη χρήση του βοηθητικού πίνακα. Θέλουμε όμως παραπάνω μνήμη για τους δείκτες Αναδρομική εκδοχή: θέλουμε και μία αρχική διέλευση όλης της λίστας για να βρούμε τη μέση static Node mergesort(Node c) { if (c == null || c.next == null) return c; Node a = c, b = c.next; while ((b != null) && (b.next != null)) { c = c.next; b = (b.next).next; }//εύρεση μέσης b = c.next; c.next = null; return merge(mergesort(a), mergesort(b)); } Δομές Δεδομένων

Υλοποίηση με λίστες Υλοποίηση της merge: static Node merge(Node a, Node b) { Node dummy = new Node(); Node head = dummy, c = head; while ((a != null) && (b != null)) if (less(a.item, b.item)) { c.next = a; c = a; a = a.next; } else { c.next = b; c = b; b = b.next; } c.next = (a == null) ? b : a; return head.next; } Δομές Δεδομένων

Μειονεκτήματα της Mergesort Δεν σταματά άμεσα σε ταξινομημένο αρχείο Ο αριθμός των διελεύσεων εξαρτάται από το μέγεθος του πίνακα, και όχι από τη μορφή των δεδομένων εισόδου Ίδιος αριθμός βημάτων σε τυχαία δεδομένα, Gaussian, μερικώς ταξινομημένα, αντίστροφα ταξινομημένα,... Δομές Δεδομένων