1 / 22

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. Merge Sort. Divide-and-conquer ( 分治演算法 ) is a general algorithm design paradigm: Divide : divide the input data S in two disjoint subsets S 1 and S 2

cfree
Download Presentation

Merge Sort

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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 Merge Sort

  2. Divide-and-conquer (分治演算法) is a general algorithm design paradigm: Divide: divide the input data S in two disjoint subsets S1and S2 Conquer: solve the subproblems associated with S1and S2 Combine: combine the solutions for S1and S2 into a solution for S Merge-sort: A sorting algorithm based on divide and conquer Like heap-sort It uses a comparator It has O(n log n) running time Unlike heap-sort It does not use an auxiliary priority queue It accesses data in a sequential/local manner (suitable to sort data on a disk) Divide-and-Conquer (§ 10.1.1) 化整為零 各個擊破 Some don’t! Good for external sorting Merge Sort

  3. Merge Sort • Merge sort • A divide-and-conquer algorithm • Invented by John von Neumann in 1945 約翰·馮·紐曼(John von Neumann,1903年12月28日-1957年2月8日),出生於匈牙利的美國籍猶太人數學家,現代電腦創始人之一。他在電腦科學、經濟、物理學中的量子力學及幾乎所有數學領域都作過重大貢獻,被譽為「電腦之父」。(圖及說明摘自維基百科) Merge Sort

  4. Three steps of merge-sort on an input sequence S with n elements: Divide: partition S into two sequences S1and S2 of about n/2 elements each Conquer: recursively sort S1and S2 Combine: merge S1and S2 into a sorted sequence Merge-Sort (§ 10.1) AlgorithmmergeSort(S, C) Inputsequence S with n elements, comparator C Outputsequence S sorted according to C ifS.size() > 1 (S1, S2)partition(S, n/2) mergeSort(S1, C) mergeSort(S2, C) Smerge(S1, S2) Key step! Merge Sort

  5. Merging Two Sorted Sequences Algorithmmerge(A, B) Inputsequences A and B withn/2 elements each Outputsorted sequence of A  B S empty sequence whileA.empty() B.empty() ifA.front()<B.front() S.addBack(A.front()); A.eraseFront(); else S.addBack(B.front()); B.eraseFront(); whileA.empty() S.addBack(A.front()); A.eraseFront(); whileB.empty() S.addBack(B.front()); B.eraseFront(); return S • Merging two sorted sequences (implemented as linked lists) with n/2 elements each, takes O(n) time. Merge Sort

  6. To Merge 2 Sorted Sequences Properties Need extra space to store the sorted results  Not an in-place sort Total time = O(|A|+|B|) = O(m+n) A B Also good for singly linked lists 6

  7. Merge-Sort Tree • An execution of merge-sort is depicted by a binary tree • each node represents a recursive call of merge-sort and stores • unsorted sequence before the execution and its partition • sorted sequence at the end of the execution • the root is the initial call • the leaves are calls on subsequences of size 0 or 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

  8. 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 Execution Example • Partition 7 2 9 4  3 8 6 11 2 3 4 6 7 8 9 Merge Sort

  9. 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 Execution Example (cont.) • Recursive call, partition 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 Merge Sort

  10. 7  7 2  2 9  9 4  4 3  3 8  8 6  6 1  1 Execution Example (cont.) • Recursive call, partition 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 Merge Sort

  11. 7  2 2 7 9 4  4 9 3 8  3 8 6 1  1 6 Execution Example (cont.) • Recursive call, base case 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7 2  2 9  9 4  4 3  3 8  8 6  6 1  1 Merge Sort

  12. Execution Example (cont.) • Recursive call, base case 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. Execution Example (cont.) • Merge 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. Execution Example (cont.) • Recursive call, …, base case, merge 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

  15. Execution Example (cont.) • Merge 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

  16. Execution Example (cont.) • Recursive call, …, merge, merge 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

  17. Execution Example (cont.) • Merge 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

  18. Merge Sort: Example divide merge 18

  19. Why Merge Sort Is Stable? 50 63 Same relative positions after merging!

  20. Resources on Merge Sort • Numerous resources on merge sort • Wiki • Animation by sorting a vector • Animation by dots • Youtube • Detailed explanation with pseudo code Merge Sort

  21. Analysis of Merge-Sort • The height h of the merge-sort tree is O(log n) • at each recursive call we divide in half the sequence, • The overall amount or work done at the nodes of depth i is O(n) • we partition and merge 2i sequences of size n/2i • we make 2i+1 recursive calls • Thus, the total running time of merge-sort is O(n log n) O(n) O(n/2) O(n/4) Merge Sort

  22. Summary of Sorting Algorithms Merge Sort

More Related