1 / 56

Analysis of Quicksort

Analysis of Quicksort. Quicksort Algorithm. Given an array of n elements (e.g., integers): If array only contains one element, return Else pick one element to use as pivot. Partition elements into two sub-arrays: Elements less than or equal to pivot Elements greater than pivot

Download Presentation

Analysis of Quicksort

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. Analysis of Quicksort

  2. Quicksort Algorithm Given an array of n elements (e.g., integers): • If array only contains one element, return • Else • pick one element to use as pivot. • Partition elements into two sub-arrays: • Elements less than or equal to pivot • Elements greater than pivot • Quicksort two sub-arrays • Return results

  3. Example We are given array of n integers to sort: 40 20 10 80 60 50 7 30 100

  4. Pick Pivot Element There are a number of ways to pick the pivot element. In this example, we will use the first element in the array: 40 20 10 80 60 50 7 30 100

  5. Partitioning Array Given a pivot, partition the elements of the array such that the resulting array consists of: • One sub-array that contains elements >= pivot • Another sub-array that contains elements < pivot The sub-arrays are stored in the original data array. Partitioning loops through, swapping elements below/above pivot.

  6. 40 20 10 80 60 50 7 30 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  7. While data[too_big_index] <= data[pivot] • ++too_big_index 40 20 10 80 60 50 7 30 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  8. While data[too_big_index] <= data[pivot] • ++too_big_index 40 20 10 80 60 50 7 30 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  9. While data[too_big_index] <= data[pivot] • ++too_big_index 40 20 10 80 60 50 7 30 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  10. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index 40 20 10 80 60 50 7 30 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  11. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index 40 20 10 80 60 50 7 30 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  12. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index • If too_big_index < too_small_index • swap data[too_big_index] and data[too_small_index] 40 20 10 80 60 50 7 30 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  13. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index • If too_big_index < too_small_index • swap data[too_big_index] and data[too_small_index] 40 20 10 30 60 50 7 80 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  14. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index • If too_big_index < too_small_index • swap data[too_big_index] and data[too_small_index] • While too_small_index > too_big_index, go to 1. 40 20 10 30 60 50 7 80 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  15. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index • If too_big_index < too_small_index • swap data[too_big_index] and data[too_small_index] • While too_small_index > too_big_index, go to 1. 40 20 10 30 60 50 7 80 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  16. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index • If too_big_index < too_small_index • swap data[too_big_index] and data[too_small_index] • While too_small_index > too_big_index, go to 1. 40 20 10 30 60 50 7 80 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  17. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index • If too_big_index < too_small_index • swap data[too_big_index] and data[too_small_index] • While too_small_index > too_big_index, go to 1. 40 20 10 30 60 50 7 80 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  18. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index • If too_big_index < too_small_index • swap data[too_big_index] and data[too_small_index] • While too_small_index > too_big_index, go to 1. 40 20 10 30 60 50 7 80 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  19. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index • If too_big_index < too_small_index • swap data[too_big_index] and data[too_small_index] • While too_small_index > too_big_index, go to 1. 40 20 10 30 60 50 7 80 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  20. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index • If too_big_index < too_small_index • swap data[too_big_index] and data[too_small_index] • While too_small_index > too_big_index, go to 1. 40 20 10 30 7 50 60 80 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  21. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index • If too_big_index < too_small_index • swap data[too_big_index] and data[too_small_index] • While too_small_index > too_big_index, go to 1. 40 20 10 30 7 50 60 80 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  22. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index • If too_big_index < too_small_index • swap data[too_big_index] and data[too_small_index] • While too_small_index > too_big_index, go to 1. 40 20 10 30 7 50 60 80 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  23. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index • If too_big_index < too_small_index • swap data[too_big_index] and data[too_small_index] • While too_small_index > too_big_index, go to 1. 40 20 10 30 7 50 60 80 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  24. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index • If too_big_index < too_small_index • swap data[too_big_index] and data[too_small_index] • While too_small_index > too_big_index, go to 1. 40 20 10 30 7 50 60 80 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  25. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index • If too_big_index < too_small_index • swap data[too_big_index] and data[too_small_index] • While too_small_index > too_big_index, go to 1. 40 20 10 30 7 50 60 80 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  26. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index • If too_big_index < too_small_index • swap data[too_big_index] and data[too_small_index] • While too_small_index > too_big_index, go to 1. 40 20 10 30 7 50 60 80 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  27. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index • If too_big_index < too_small_index • swap data[too_big_index] and data[too_small_index] • While too_small_index > too_big_index, go to 1. 40 20 10 30 7 50 60 80 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  28. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index • If too_big_index < too_small_index • swap data[too_big_index] and data[too_small_index] • While too_small_index > too_big_index, go to 1. 40 20 10 30 7 50 60 80 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  29. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index • If too_big_index < too_small_index • swap data[too_big_index] and data[too_small_index] • While too_small_index > too_big_index, go to 1. • Swap data[too_small_index] and data[pivot_index] 40 20 10 30 7 50 60 80 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  30. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index • If too_big_index < too_small_index • swap data[too_big_index] and data[too_small_index] • While too_small_index > too_big_index, go to 1. • Swap data[too_small_index] and data[pivot_index] 7 20 10 30 40 50 60 80 100 pivot_index = 4 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  31. Partition Result 7 20 10 30 40 50 60 80 100 [0] [1] [2] [3] [4] [5] [6] [7] [8] <= data[pivot] > data[pivot]

  32. Recursion: Quicksort Sub-arrays 7 20 10 30 40 50 60 80 100 [0] [1] [2] [3] [4] [5] [6] [7] [8] <= data[pivot] > data[pivot]

  33. Quicksort Analysis • Assume that keys are random, uniformly distributed. • What is best case running time?

  34. Quicksort Analysis • Assume that keys are random, uniformly distributed. • What is best case running time? • Recursion: • Partition splits array in two sub-arrays of size n/2 • Quicksort each sub-array

  35. Quicksort Analysis • Assume that keys are random, uniformly distributed. • What is best case running time? • Recursion: • Partition splits array in two sub-arrays of size n/2 • Quicksort each sub-array • Depth of recursion tree?

  36. Quicksort Analysis • Assume that keys are random, uniformly distributed. • What is best case running time? • Recursion: • Partition splits array in two sub-arrays of size n/2 • Quicksort each sub-array • Depth of recursion tree? O(log2n)

  37. Quicksort Analysis • Assume that keys are random, uniformly distributed. • What is best case running time? • Recursion: • Partition splits array in two sub-arrays of size n/2 • Quicksort each sub-array • Depth of recursion tree? O(log2n) • Number of accesses in partition?

  38. Quicksort Analysis • Assume that keys are random, uniformly distributed. • What is best case running time? • Recursion: • Partition splits array in two sub-arrays of size n/2 • Quicksort each sub-array • Depth of recursion tree? O(log2n) • Number of accesses in partition? O(n)

  39. Quicksort Analysis • Assume that keys are random, uniformly distributed. • Best case running time: O(n log2n)

  40. Quicksort Analysis • Assume that keys are random, uniformly distributed. • Best case running time: O(n log2n) • Worst case running time?

  41. Quicksort: Worst Case • Assume first element is chosen as pivot. • Assume we get array that is already in order: 2 4 10 12 13 50 57 63 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  42. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index • If too_big_index < too_small_index • swap data[too_big_index] and data[too_small_index] • While too_small_index > too_big_index, go to 1. • Swap data[too_small_index] and data[pivot_index] 2 4 10 12 13 50 57 63 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  43. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index • If too_big_index < too_small_index • swap data[too_big_index] and data[too_small_index] • While too_small_index > too_big_index, go to 1. • Swap data[too_small_index] and data[pivot_index] 2 4 10 12 13 50 57 63 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  44. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index • If too_big_index < too_small_index • swap data[too_big_index] and data[too_small_index] • While too_small_index > too_big_index, go to 1. • Swap data[too_small_index] and data[pivot_index] 2 4 10 12 13 50 57 63 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  45. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index • If too_big_index < too_small_index • swap data[too_big_index] and data[too_small_index] • While too_small_index > too_big_index, go to 1. • Swap data[too_small_index] and data[pivot_index] 2 4 10 12 13 50 57 63 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  46. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index • If too_big_index < too_small_index • swap data[too_big_index] and data[too_small_index] • While too_small_index > too_big_index, go to 1. • Swap data[too_small_index] and data[pivot_index] 2 4 10 12 13 50 57 63 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  47. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index • If too_big_index < too_small_index • swap data[too_big_index] and data[too_small_index] • While too_small_index > too_big_index, go to 1. • Swap data[too_small_index] and data[pivot_index] 2 4 10 12 13 50 57 63 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index

  48. While data[too_big_index] <= data[pivot] • ++too_big_index • While data[too_small_index] > data[pivot] • --too_small_index • If too_big_index < too_small_index • swap data[too_big_index] and data[too_small_index] • While too_small_index > too_big_index, go to 1. • Swap data[too_small_index] and data[pivot_index] 2 4 10 12 13 50 57 63 100 pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] <= data[pivot] > data[pivot]

  49. Quicksort Analysis • Assume that keys are random, uniformly distributed. • Best case running time: O(n log2n) • Worst case running time? • Recursion: • Partition splits array in two sub-arrays: • one sub-array of size 0 • the other sub-array of size n-1 • Quicksort each sub-array • Depth of recursion tree?

  50. Quicksort Analysis • Assume that keys are random, uniformly distributed. • Best case running time: O(n log2n) • Worst case running time? • Recursion: • Partition splits array in two sub-arrays: • one sub-array of size 0 • the other sub-array of size n-1 • Quicksort each sub-array • Depth of recursion tree? O(n)

More Related