Merge Sort Is Usually Described Recursively

Merge Sort Is Usually Described Recursively

Basics Merge sort is usually described recursively. The recursive calls work on smaller and smaller Merge Sort part of the list. Idea: 1. Split the list into two halves. 2. Recursively sort each half. 3. “Merge” the two halves into a single sorted list. Example Example Merge 0 1 2 3 4 5 6 7 8 9 10 11 12 17 8 75 23 14 95 29 87 74 -1 -2 37 81 0 1 2 3 4 5 6 7 8 9 10 11 12 8 14 17 23 29 75 95 -2 -1 37 74 81 87 1. Split: 0 1 2 3 4 5 6 7 8 9 10 11 12 17 8 75 23 14 95 29 87 74 -1 -2 37 81 0 1 2 3 4 5 6 7 8 9 10 11 12 2. Recursively sort: -2 -1 8 14 17 23 29 37 74 75 81 87 95 0 1 2 3 4 5 6 7 8 9 10 11 12 8 14 17 23 29 75 95 -2 -1 37 74 81 87 Must put the next-smallest element into the 3. Merge? merged list at each step. each “next-smallest” could come from either half Merge Sort Algorithm Merge Algorithm (incorrect) merge(array, first, mid, last): mergeSort(array, first, last): // merge array[first to mid-1] and array[mid to last-1] // sort array[first] to array[last-1] leftpos = first rightpos = mid if last - first ≤ 1: for newpos from 0 to last-first: return // arrays of length 0, 1 are already sorted if array[leftpos] ≤ array[rightpos]: mid = (first + last)/2 newarray[newpos] = array[leftpos] mergeSort(array, first, mid) // recursive call 1 leftpos++ else: mergeSort(array, mid, last) // recursive call 2 newarray[newpos] = array[rightpos] merge(array, first, mid, last) rightpos++ copy newarray to array[first to last-1] 1 Problem? Solution This algorithm starts correctly, but has an error Must prevent this: we can only look at the as it finishes. correct parts of the array. Eventually, one of the halves will empty. So, compare only until we reach the end of one Then, the “if” will compare against ??? half. the element past the end of one of the halves Then, just copy the rest over. one of: 38 43 ?? leftpos rightpos ?? 52 leftpos rightpos Corrected Merge Algorithm (1) Corrected Merge Algorithm (2) merge(array, first, mid, last): merge(array, first, mid, last): leftpos = first … // code from last slide rightpos = mid newpos = 0 while leftpos < mid: // copy rest of left half (if any) while leftpos < mid and rightpos ≤ last-1: newarray[newpos] = array[leftpos] if array[leftpos] ≤ array[rightpos]: leftpos++; newpos++ newarray[newpos] = array[leftpos] while rightpos ≤ last-1: // copy rest of right half (if any) leftpos++; newpos++ newarray[newpos] = array[rightpos] else: rightpos++; newpos++ newarray[newpos] = array[rightpos] rightpos++; newpos++ copy newarray to array[first to (last-1)] (continues) Example 1 Example 2 merge(array, 3, 7, 11): merge(array, 8, 12, 15): 3 4 5 6 7 8 9 10 8 9 10 11 12 13 14 15 array: 10 20 40 50 30 40 60 70 array: 50 60 70 80 10 20 30 40 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 newarray: 10 20 30 40 40 50 60 70 newarray: 10 20 30 40 50 60 70 80 leftpos: 3 4 5 6 7 leftpos: 8 9 10 11 12 rightpos: 7 8 9 10 11 rightpos: 12 13 14 15 16 newpos: 0 1 2 3 4 5 6 7 8 newpos: 0 1 2 3 4 5 6 7 8 compare loop left fill right fill compare loop left fill right fill 2 R unning Time Merge Sort Recursive Calls W3hat is merge sort’s running time? n elements recursive calls − work per call? n/2 n/2 yes, but overly-simplified. n/4 n/4 n/4 n/4 … … … W ork per call changes. … W e know: the merge algorithm takes O(m) work to merge a total of m elements. 1 1 1 1 1 … 1 1 1 1 Each level has a total of n elements. Running Time In-place Sorting O(n) total time to merge each level Merging requires extra storage. O(log n) levels an extra array with n elements (can be reused by all merges) Total time for merge sort: O(n·log n) Insertion sort requires no extra storage (except a few Much faster than insertion sort, which takes O(n2). numeric variables). In general, no sorting algorithm can do better An algorithm that uses at most O(1) extra thanO(n·log n). thanO(n·log n). storage is called “in-place”. There are some algorithms that are faster for Insertion sort is in-place; merge sort isn’t. limited cases. Stable Sorting In merge sort,equal elements are kept in-order. Think of sorting a spreadsheet with other columns. Rows with equal values in the sort column stay in order. A “stable” sorting algorithm has this properly. Our implementations of insertionsort & merge sort are both stable. 3.

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    3 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us