sorting divide and conquer
play

Sorting Divide and Conquer 1 Searching an n -element Array Linear - PowerPoint PPT Presentation

Sorting Divide and Conquer 1 Searching an n -element Array Linear Search Binary Search Check an element Check an element If not found, If not found, search an (n-1) -element array search an (n/2) -element array log n n Huge


  1. Sorting

  2. Divide and Conquer 1

  3. Searching an n -element Array Linear Search Binary Search  Check an element  Check an element  If not found,  If not found, search an (n-1) -element array search an (n/2) -element array log n n Huge benefit by dividing problem (in half ) O(n) O(log n) 2

  4. Sorting an n -element Array  Can we do the same for sorting an array?  This time, we need to work on two half-problems o and combine their results log n n  This is a general technique called divide and conquer Term variously attributed to Ceasar, Macchiavelli, Napoleon, Sun Tzu, and many others 3

  5. Sorting an n -element Array Naïve Divide and Conquer algorithm algorithm Linear search Binary search Searching O(n) O(log n) Selection Sort ??? sort Sorting O(n 2 ) O(??) 4

  6. Recall Selection Sort void selection_sort(int[] A, int lo, int hi) //@requires 0 <= lo && lo <= hi && hi <= \length(A); //@ensures is_sorted(A, lo, hi); { for (int i = lo; i < hi; i++) //@loop_invariant lo <= i && i <= hi; //@loop_invariant is_sorted(A, lo, i); //@loop_invariant le_segs(A, lo, i, A, i, hi); { int min = find_min(A, i, hi); swap(A, i, min); } } O(n 2 ) 5

  7. Towards Mergesort 6

  8. Using Selection Sort lo hi A: Selection sort lo hi A: SORTED  If hi - lo = n  the length of array segment A[lo, hi) o cost is O(n 2 ) o let’s say n 2  But (n/2) 2 = n 2 /4 o What if we sort the two halves of the array? 7

  9. Using Selection Sort Cleverly (n/2) 2 + (n/2) 2 lo mid hi = n 2 /4 + n 2 /4 A: = n 2 /2 Selection sort on each half lo mid hi A: SORTED SORTED o Sorting each half costs n 2 /4 o altogether that’s n 2 /2 o that’s a saving of half over using selection sort on the whole array!  But the overall array is not sorted o If we can turn two sorted halves into a sorted whole for less than n 2 /2 , we are doing better than plain selection sort 8

  10. Using Selection Sort Cleverly lo mid hi Costs about A: n 2 /2 Selection sort on each half lo mid hi Costs hopefully A: SORTED SORTED less than n 2 /2 Merge lo hi A: SORTED  merge: turns two sorted half arrays into a sorted array o (cheaply) 9

  11. Implementation  Computing mid We learned this void sort(int[] A, int lo, int hi) from //@requires 0 <= lo && lo <= hi && hi <= \length(A); binary search //@ensures is_sorted(A, lo, hi); { int mid = lo + (hi - lo) / 2; //@assert lo <= mid && mid <= hi; // … call selection sort on each half … // … merge the two halves … } if hi == lo, then mid == hi This was not possible in the code for binary search lo mid hi A: 10

  12. void selection_sort(int[] A, int lo, int hi) //@requires 0 <= lo && lo <= hi && hi <= \length(A); Implementation //@ensures is_sorted(A, lo, hi);  Calling selection_sort on each half 1. void sort(int[] A, int lo, int hi) 2. //@requires 0 <= lo && lo <= hi && hi <= \length(A); 3. //@ensures is_sorted(A, lo, hi); To show : 0 ≤ lo ≤ mid ≤ \length(A) • 0 ≤ lo 4. { by line 2 • lo ≤ mid by line 6 int mid = lo + (hi - lo) / 2; 5. • mid ≤ hi by line 6 //@assert lo <= mid && mid <= hi; 6. hi ≤ \length(A) by line 2 selection_sort(A, lo, mid); 7. mid ≤ \length(A) by math selection_sort(A, mid, hi); 8. // … merge the two halves 9. 10. } To show : 0 ≤ mid ≤ hi ≤ \length(A) Left as exercise   Is this code safe so far?  Since selection_sort is correct, its postcondition holds  A[lo, mid) sorted lo mid hi  A[mid, hi) sorted A: SORTED SORTED 11

  13. void selection_sort(int[] A, int lo, int hi) //@requires 0 <= lo && lo <= hi && hi <= \length(A); Implementation //@ensures is_sorted(A, lo, hi); void sort(int[] A, int lo, int hi) //@requires 0 <= lo && lo <= hi && hi <= \length(A); //@ensures is_sorted(A, lo, hi); { int mid = lo + (hi - lo) / 2; //@assert lo <= mid && mid <= hi; selection_sort(A, lo, mid); //@assert is_sorted(A, lo, mid); selection_sort(A, mid, hi); //@assert is_sorted(A, mid, hi); // … merge the two halves }  We are left with implementing merge 12

  14. Implementation lo mid hi A: Selection sort on each half lo mid hi Turns two A: SORTED SORTED sorted half arrays segments into a sorted array segment Merge lo hi A: SORTED Assume we have an implementation void merge(int[] A, int lo, int mid, int hi) //@requires 0 <= lo && lo <= mid && mid <= hi && hi <= \length(A); //@requires is_sorted(A, lo, mid) && is_sorted(A, mid, hi); //@ensures is_sorted(A, lo, hi); 13

  15. void selection_sort(int[] A, int lo, int hi) //@requires 0 <= lo && lo <= hi && hi <= \length(A); Implementation //@ensures is_sorted(A, lo, hi); void merge(int[] A, int lo, int mid, int hi) //@requires 0 <= lo && lo <= mid && mid <= hi && hi <= \length(A); //@requires is_sorted(A, lo, mid) && is_sorted(A, mid, hi); //@ensures is_sorted(A, lo, hi); void sort(int[] A, int lo, int hi) //@requires 0 <= lo && lo <= hi && hi <= \length(A); //@ensures is_sorted(A, lo, hi); { int mid = lo + (hi - lo) / 2; //@assert lo <= mid && mid <= hi; selection_sort(A, lo, mid); //@assert is_sorted(A, lo, mid); selection_sort(A, mid, hi); //@assert is_sorted(A, mid, hi); merge(A, lo, mid, hi); To show : 0 ≤ lo ≤ mid ≤ hi ≤ \length(A) } Left as exercise  To show : A[lo, mid) sorted and A[mid, hi) sorted  Is this code safe? • by the postconditions of selection_sort  if merge is correct, its postcondition holds  A[lo, hi) sorted lo hi A: SORTED 14

  16. void selection_sort(int[] A, int lo, int hi) //@requires 0 <= lo && lo <= hi && hi <= \length(A); Implementation //@ensures is_sorted(A, lo, hi); void merge(int[] A, int lo, int mid, int hi) //@requires 0 <= lo && lo <= mid && mid <= hi && hi <= \length(A); //@requires is_sorted(A, lo, mid) && is_sorted(A, mid, hi); //@ensures is_sorted(A, lo, hi); void sort(int[] A, int lo, int hi) //@requires 0 <= lo && lo <= hi && hi <= \length(A); //@ensures is_sorted(A, lo, hi); { int mid = lo + (hi - lo) / 2; //@assert lo <= mid && mid <= hi; selection_sort(A, lo, mid); //@assert is_sorted(A, lo, mid); selection_sort(A, mid, hi); //@assert is_sorted(A, mid, hi); merge(A, lo, mid, hi); //@assert is_sorted(A, lo, hi) }  A[lo, hi) sorted is the postcondition of sort o sort is correct  lo hi A: SORTED 15

  17. Implementation lo mid hi A: Selection sort on each half lo mid hi A: SORTED SORTED Merge lo hi A: SORTED  But how does merge work? 16

  18. merge lo mid hi A: SORTED SORTED TMP: SORTED  Scan the two half array segments from left to right  At each step, copy the smaller element in a temporary array  Copy the temporary array back into A[lo, hi) See code online 17

  19. Example merge lo mid hi A: TMP: 3 6 7 2 2 5 2 2 lo mid hi A: TMP: 3 6 7 2 2 5 2 2 2 lo mid hi A: TMP: 3 6 7 2 2 5 3 2 2 3 lo mid hi A: TMP: 3 6 7 2 2 5 5 2 2 3 5 lo mid hi A: TMP: 3 6 7 2 2 5 3 2 2 3 5 6 lo mid hi A: TMP: 3 6 7 2 2 5 7 2 2 3 5 6 7 lo hi A: TMP: 2 2 3 5 6 7 2 2 3 5 6 7 18

  20. merge lo mid hi A: SORTED SORTED TMP: SORTED  Cost of merge? o if A[lo, hi) has n elements, o we copy one element to TMP at each step O(n)  n steps o we copy all n elements back to A at the end  That’s cheaper then n 2 /2 19

  21. merge lo mid hi A: SORTED SORTED TMP: SORTED  Algorithms that do not use temporary storage are called in-place  merge uses lots of temporary storage o array TMP -- same size as A[lo, hi) o merge is not in-place  In-place algorithms for merge are more expensive 20

  22. Using Selection Sort Cleverly lo mid hi Costs about A: n 2 /2 Selection sort on each half lo mid hi Costs about A: SORTED SORTED n Merge lo hi A: SORTED  Overall cost about n 2 /2 + n o better than plain selection sort -- n 2 o but still O(n 2 ) 21

  23. Mergesort 22

  24. void selection_sort(int[] A, int lo, int hi) //@requires 0 <= lo && lo <= hi && hi <= \length(A); //@ensures is_sorted(A, lo, hi); Reflection void sort(int[] A, int lo, int hi) //@requires 0 <= lo && lo <= hi && hi <= \length(A); //@ensures is_sorted(A, lo, hi); { int mid = lo + (hi - lo) / 2; //@assert lo <= mid && mid <= hi; selection_sort(A, lo, mid); //@assert is_sorted(A, lo, mid); selection_sort(A, mid, hi); //@assert is_sorted(A, mid, hi); merge(A, lo, mid, hi); //@assert is_sorted(A, lo, hi) }  selection_sort and sort are interchangeable o they solve the same problem — sorting an array segment o they have the same contracts o both are correct 23

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend