You are on page 1of 18

Merge Sort

7 29 4  2 4 7 9

72  2 7 94  4 9

77 22 99 44

Οι διαφάνειες είναι βασισμένες στο βιβλίο "Data Structures and Algorithms in C++" των Michael T. Goodrich, Roberto Tamassia και David M. Mount

Merge Sort 1
Outline
Η αρχή του «Διαίρει και Βασίλευε»(§10.1.1)
Merge-sort (§10.1)
 Αλγόριθμος
 Συνενώνοντας 2 ταξινομημένες ακολουθίες
 Δένδρο Merge-sort
 Παράδειγμα εκτέλεσης
 Ανάλυση
Γενικές πράξεις συνένωσης και συνόλων
(§10.2)
Περίληψη αλγορίθμων ταξινόμησης

Merge Sort 2
Διαίρει και Βασίλευε
Η μέθοδος του «Διαίρει και Ο Merge-sort είναι ένας
Βασίλευε» είναι μια γενική αρχή αλγόριθμος ταξινόμησης
σχεδιασμού αλγορίθμων : βασισμένος στην αρχή του
 Divide: Διαίρεσε τα δεδομένα «Διαίρει και Βασίλευε»
εισόδου S σε 2 ή περισσότερα Όπως και ο heap-sort
ανεξάρτητα σύνολα S1, S2, …  Χρησιμοποιεί συγκριτή
 Recur: λύσε το υποπροβλήματα  Έχει χρόνο εκτέλεσης O(n log
που σχετίζονται με τα S1 και S2 n)
 Conquer: συνδύασε τις λύσεις Αντίθετα με τον heap-sort
για S1 και S2 σε μια λύση για τοS  Δε χρησιμοποιεί βοηθητική
Η βασική περίπτωση για την ουρά προτεαιότητας
αναδρομή είναι υποπροβλήματα  Αποκτά πρόσβαση στα
μεγέθους 0 ή 1 δεδομένα σειριακά
(κατάλληλα για ταξινόμηση
στοιχείων σε δίσκο)

Merge Sort 3
Merge-Sort
Ο Merge-sort σε Αλγόριθμος mergeSort(S, C)
ακολουθία εισόδου S με Είσοδος ακολουθία S με n
n στοιχεία αποτελείται στοιχεία, συγκριτής C
από 3 βήματα: Έξοδος ακολουθία S
ταξινομημένη σύμφωνα με τοC
 Divide: χώρισε το S σε 2
ακολουθίες S1 και S2 if S.size() > 1
περίπου n2 στοιχείων η (S1, S2)  partition(S, n/2)
καθεμία mergeSort(S1, C)
 Recur: ταξινόμησε mergeSort(S2, C)
αναδρομικά τα S1 και S2
S  merge(S1, S2)
 Conquer: συνένωσε τα S1
και S2 σε μια μοναδική
ταξινομημένη ακολουθία

Merge Sort 4
Merging Two Sorted Sequences
Το βήμα conquer Αλγόριθμος merge(A, B)
του merge-sort Είσοδος ακολουθίες A και B με
αποτελείται από τη n2 στοιχεία η καθεμία
συνένωση των
ταξινομημένων A και Έξοδος ταξινομημένη ακολουθία του A  B
B σε μια S  empty sequence
ταξινομημένη
ακολουθία S που while A.isEmpty() B.isEmpty()
περιέχει την ένωση if A.first().element() <
των στοιχείων των A B.first().element()
και B S.insertLast(A.remove(A.first()))
Merging two sorted else
sequences, each S.insertLast(B.remove(B.first()))
with n2 elements
και implemented by while A.isEmpty()
means of a doubly S.insertLast(A.remove(A.first()))
linked list, takes while B.isEmpty()
O(n) time S.insertLast(B.remove(B.first()))
return S
Merge Sort 5
Δένδρο Merge-Sort
Μια εκτέλεση του merge-sort απεικονίζεται από ένα δυαδικό
δένδρο
 Κάθε κόμβος αναπαριστά μια αναδρομική κλήση του merge-sort και
αποθηκεύει
 Μη ταξινομημένη ακολουθία πριν την εκτέλεση και το διαχωρισμό της
 Ταξινομημένη ακολουθία στο τέλος της εκτέλεσης
 Η ρίζα είναι η αρχική κλήση
 Τα φύλλα είναι κλήσεις σε υποακολουθίες μεγέθους 0 ή 1

7 2  9 4  2 4 7 9

7  2  2 7 9  4  4 9

77 22 99 44


Merge Sort 6
Παράδειγμα Εκτέλεσης
Διαχωρισμός
7 2 9 43 8 6 1  1 2 3 4 6 7 8 9

7 2 9 4  2 4 7 9 3 8 6 1  1 3 8 6

7 2  2 7 9 4  4 9 3 8  3 8 6 1  1 6

77 22 99 44 33 88 66 11

Merge Sort 7
Παράδειγμα Εκτέλεσης (συνέχεια)
Αναδρομική κλήση, διαχωρισμός
7 2 9 43 8 6 1  1 2 3 4 6 7 8 9

7 29 4 2 4 7 9 3 8 6 1  1 3 8 6

7 2  2 7 9 4  4 9 3 8  3 8 6 1  1 6

77 22 99 44 33 88 66 11

Merge Sort 8
Παράδειγμα Εκτέλεσης (συνέχεια)
Αναδρομική κλήση, διαχωρισμός
7 2 9 43 8 6 1  1 2 3 4 6 7 8 9

7 29 4 2 4 7 9 3 8 6 1  1 3 8 6

722 7 9 4  4 9 3 8  3 8 6 1  1 6

77 22 99 44 33 88 66 11

Merge Sort 9
Παράδειγμα Εκτέλεσης (συνέχεια)
Αναδρομική κλήση, βασική περίπτωση
7 2 9 43 8 6 1  1 2 3 4 6 7 8 9

7 29 4 2 4 7 9 3 8 6 1  1 3 8 6

722 7 9 4  4 9 3 8  3 8 6 1  1 6

77 22 99 44 33 88 66 11

Merge Sort 10
Παράδειγμα Εκτέλεσης (συνέχεια)
Αναδρομική κλήση, βασική περίπτωση
7 2 9 43 8 6 1  1 2 3 4 6 7 8 9

7 29 4 2 4 7 9 3 8 6 1  1 3 8 6

722 7 9 4  4 9 3 8  3 8 6 1  1 6

77 22 99 44 33 88 66 11

Merge Sort 11
Παράδειγμα Εκτέλεσης (συνέχεια)
Συνένωση
7 2 9 43 8 6 1  1 2 3 4 6 7 8 9

7 29 4 2 4 7 9 3 8 6 1  1 3 8 6

722 7 9 4  4 9 3 8  3 8 6 1  1 6

77 22 99 44 33 88 66 11

Merge Sort 12
Παράδειγμα Εκτέλεσης (συνέχεια)
Αναδρομική κλήση, …, βασική περίπτωση, συνένωση

7 2 9 43 8 6 1  1 2 3 4 6 7 8 9

7 29 4 2 4 7 9 3 8 6 1  1 3 8 6

722 7 9 4  4 9 3 8  3 8 6 1  1 6

77 22 99 44 33 88 66 11

Merge Sort 13
Παράδειγμα Εκτέλεσης (συνέχεια)
Συνένωση
7 2 9 43 8 6 1  1 2 3 4 6 7 8 9

7 29 4 2 4 7 9 3 8 6 1  1 3 8 6

722 7 9 4  4 9 3 8  3 8 6 1  1 6

77 22 99 44 33 88 66 11

Merge Sort 14
Παράδειγμα Εκτέλεσης (συνέχεια)
Αναδρομική κλήση, …, συνένωση, συνένωση

7 2 9 43 8 6 1  1 2 3 4 6 7 8 9

7 29 4 2 4 7 9 3 8 6 1  1 3 6 8

722 7 9 4  4 9 3 8  3 8 6 1  1 6

77 22 99 44 33 88 66 11

Merge Sort 15
Παράδειγμα Εκτέλεσης (συνέχεια)
Συνένωση
7 2 9 43 8 6 1  1 2 3 4 6 7 8 9

7 29 4 2 4 7 9 3 8 6 1  1 3 6 8

722 7 9 4  4 9 3 8  3 8 6 1  1 6

77 22 99 44 33 88 66 11

Merge Sort 16
Ανάλυση του Merge-Sort
Το ύψος h του δένδρου του merge-sort είναι O(log n)
 Σε κάθε αναδρομική κλήση διαιρούμε την ακολουθία στα 2,
Η συνολική δουλειά που γίνεται στους κόμβους βάθους i είναι O(n)
 Διαχωρίζουμε και συνενώνουμε 2i ακολουθίες μεγέθους n2i
 Εκτελούμε 2i1 αναδρομικές κλήσεις
Έτσι, ο συνολικός χρόνος εκτέλεσης του merge-sort είναι O(n log n)

βάθος #ακολ. μέγεθος


0 1 n

1 2 n2

i 2i n2i

… … …

Merge Sort 17
Περίληψη Αλγορίθμων
Ταξινόμησης
Αλγόριθμος Χρόνος Παρατηρήσεις
αργός
selection-sort O(n2) in-place
για μικρά σύνολα εισόδου (< 1K)
αργός
insertion-sort O(n2) in-place
για μικρά σύνολα εισόδου (< 1K)
ταχύς
in-place
heap-sort O(n log n)
για μεγάλα σύνολα εισόδου
(1K — 1M)
ταχύς
σειριακή πρόσβαση δεδομένων
merge-sort O(n log n)
για πολύ μεγάλα σύνολα εισόδου18
Merge Sort
(> 1M)

You might also like