KEMBAR78
Quick sort | PPT
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]
Quicksort Analysis
 Assume that keys are random, uniformly
distributed.
 What is best case running time?
Quicksort Analysis
 Assume that keys are random, uniformly
distributed.
 What is best case running time?
 Recursion:
1. Partition splits array in two sub-arrays of size n/2
2. Quicksort each sub-array
Quicksort Analysis
 Assume that keys are random, uniformly
distributed.
 What is best case running time?
 Recursion:
1. Partition splits array in two sub-arrays of size n/2
2. Quicksort each sub-array
 Depth of recursion tree?
Quicksort Analysis
 Assume that keys are random, uniformly
distributed.
 What is best case running time?
 Recursion:
1. Partition splits array in two sub-arrays of size n/2
2. Quicksort each sub-array
 Depth of recursion tree? O(log2n)
Quicksort Analysis
 Assume that keys are random, uniformly
distributed.
 What is best case running time?
 Recursion:
1. Partition splits array in two sub-arrays of size n/2
2. Quicksort each sub-array
 Depth of recursion tree? O(log2n)
 Number of accesses in partition?
Quicksort Analysis
 Assume that keys are random, uniformly
distributed.
 What is best case running time?
 Recursion:
1. Partition splits array in two sub-arrays of size n/2
2. Quicksort each sub-array
 Depth of recursion tree? O(log2n)
 Number of accesses in partition? O(n)
Quicksort Analysis
 Assume that keys are random, uniformly
distributed.
 Best case running time: O(n log2n)
Quicksort Analysis
 Assume that keys are random, uniformly
distributed.
 Best case running time: O(n log2n)
 Worst case running time?
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 100pivot_index = 0
[0] [1] [2] [3] [4] [5] [6] [7] [8]
too_big_index too_small_index
1. While data[too_big_index] <= data[pivot]
++too_big_index
2. While data[too_small_index] > data[pivot]
--too_small_index
3. If too_big_index < too_small_index
swap data[too_big_index] and data[too_small_index]
4. While too_small_index > too_big_index, go to 1.
5. Swap data[too_small_index] and data[pivot_index]
2 4 10 12 13 50 57 63 100pivot_index = 0
[0] [1] [2] [3] [4] [5] [6] [7] [8]
too_big_index too_small_index
1. While data[too_big_index] <= data[pivot]
++too_big_index
2. While data[too_small_index] > data[pivot]
--too_small_index
3. If too_big_index < too_small_index
swap data[too_big_index] and data[too_small_index]
4. While too_small_index > too_big_index, go to 1.
5. Swap data[too_small_index] and data[pivot_index]
2 4 10 12 13 50 57 63 100pivot_index = 0
[0] [1] [2] [3] [4] [5] [6] [7] [8]
too_big_index too_small_index
1. While data[too_big_index] <= data[pivot]
++too_big_index
2. While data[too_small_index] > data[pivot]
--too_small_index
3. If too_big_index < too_small_index
swap data[too_big_index] and data[too_small_index]
4. While too_small_index > too_big_index, go to 1.
5. Swap data[too_small_index] and data[pivot_index]
2 4 10 12 13 50 57 63 100pivot_index = 0
[0] [1] [2] [3] [4] [5] [6] [7] [8]
too_big_index too_small_index
1. While data[too_big_index] <= data[pivot]
++too_big_index
2. While data[too_small_index] > data[pivot]
--too_small_index
3. If too_big_index < too_small_index
swap data[too_big_index] and data[too_small_index]
4. While too_small_index > too_big_index, go to 1.
5. Swap data[too_small_index] and data[pivot_index]
2 4 10 12 13 50 57 63 100pivot_index = 0
[0] [1] [2] [3] [4] [5] [6] [7] [8]
too_big_index too_small_index
1. While data[too_big_index] <= data[pivot]
++too_big_index
2. While data[too_small_index] > data[pivot]
--too_small_index
3. If too_big_index < too_small_index
swap data[too_big_index] and data[too_small_index]
4. While too_small_index > too_big_index, go to 1.
5. Swap data[too_small_index] and data[pivot_index]
2 4 10 12 13 50 57 63 100pivot_index = 0
[0] [1] [2] [3] [4] [5] [6] [7] [8]
too_big_index too_small_index
1. While data[too_big_index] <= data[pivot]
++too_big_index
2. While data[too_small_index] > data[pivot]
--too_small_index
3. If too_big_index < too_small_index
swap data[too_big_index] and data[too_small_index]
4. While too_small_index > too_big_index, go to 1.
5. Swap data[too_small_index] and data[pivot_index]
2 4 10 12 13 50 57 63 100pivot_index = 0
[0] [1] [2] [3] [4] [5] [6] [7] [8]
too_big_index too_small_index
1. While data[too_big_index] <= data[pivot]
++too_big_index
2. While data[too_small_index] > data[pivot]
--too_small_index
3. If too_big_index < too_small_index
swap data[too_big_index] and data[too_small_index]
4. While too_small_index > too_big_index, go to 1.
5. Swap data[too_small_index] and data[pivot_index]
2 4 10 12 13 50 57 63 100pivot_index = 0
[0] [1] [2] [3] [4] [5] [6] [7] [8]
> data[pivot]<= data[pivot]
Quicksort Analysis
 Assume that keys are random, uniformly
distributed.
 Best case running time: O(n log2n)
 Worst case running time?
 Recursion:
1. Partition splits array in two sub-arrays:
• one sub-array of size 0
• the other sub-array of size n-1
1. Quicksort each sub-array
 Depth of recursion tree?
Quicksort Analysis
 Assume that keys are random, uniformly
distributed.
 Best case running time: O(n log2n)
 Worst case running time?
 Recursion:
1. Partition splits array in two sub-arrays:
• one sub-array of size 0
• the other sub-array of size n-1
1. Quicksort each sub-array
 Depth of recursion tree? O(n)
Quicksort Analysis
 Assume that keys are random, uniformly
distributed.
 Best case running time: O(n log2n)
 Worst case running time?
 Recursion:
1. Partition splits array in two sub-arrays:
• one sub-array of size 0
• the other sub-array of size n-1
1. Quicksort each sub-array
 Depth of recursion tree? O(n)
 Number of accesses per partition?
Quicksort Analysis
 Assume that keys are random, uniformly
distributed.
 Best case running time: O(n log2n)
 Worst case running time?
 Recursion:
1. Partition splits array in two sub-arrays:
• one sub-array of size 0
• the other sub-array of size n-1
1. Quicksort each sub-array
 Depth of recursion tree? O(n)
 Number of accesses per partition? O(n)
Quicksort Analysis
 Assume that keys are random, uniformly
distributed.
 Best case running time: O(n log2n)
 Worst case running time: O(n2
)!!!
Quicksort Analysis
 Assume that keys are random, uniformly
distributed.
 Best case running time: O(n log2n)
 Worst case running time: O(n2
)!!!
 What can we do to avoid worst case?
Improved Pivot Selection
Pick median value of three elements from data
array:
data[0], data[n/2], and data[n-1].
Use this median value as pivot.
Improving Performance of
Quicksort
 Improved selection of pivot.
 For sub-arrays of size 3 or less, apply brute
force search:
 Sub-array of size 1: trivial
 Sub-array of size 2:
 if(data[first] > data[second]) swap them
 Sub-array of size 3: left as an exercise.

Quick sort

  • 2.
    Recursion: Quicksort Sub- arrays 720 10 30 40 50 60 80 100 [0] [1] [2] [3] [4] [5] [6] [7] [8] <= data[pivot] > data[pivot]
  • 3.
    Quicksort Analysis  Assumethat keys are random, uniformly distributed.  What is best case running time?
  • 4.
    Quicksort Analysis  Assumethat keys are random, uniformly distributed.  What is best case running time?  Recursion: 1. Partition splits array in two sub-arrays of size n/2 2. Quicksort each sub-array
  • 5.
    Quicksort Analysis  Assumethat keys are random, uniformly distributed.  What is best case running time?  Recursion: 1. Partition splits array in two sub-arrays of size n/2 2. Quicksort each sub-array  Depth of recursion tree?
  • 6.
    Quicksort Analysis  Assumethat keys are random, uniformly distributed.  What is best case running time?  Recursion: 1. Partition splits array in two sub-arrays of size n/2 2. Quicksort each sub-array  Depth of recursion tree? O(log2n)
  • 7.
    Quicksort Analysis  Assumethat keys are random, uniformly distributed.  What is best case running time?  Recursion: 1. Partition splits array in two sub-arrays of size n/2 2. Quicksort each sub-array  Depth of recursion tree? O(log2n)  Number of accesses in partition?
  • 8.
    Quicksort Analysis  Assumethat keys are random, uniformly distributed.  What is best case running time?  Recursion: 1. Partition splits array in two sub-arrays of size n/2 2. Quicksort each sub-array  Depth of recursion tree? O(log2n)  Number of accesses in partition? O(n)
  • 9.
    Quicksort Analysis  Assumethat keys are random, uniformly distributed.  Best case running time: O(n log2n)
  • 10.
    Quicksort Analysis  Assumethat keys are random, uniformly distributed.  Best case running time: O(n log2n)  Worst case running time?
  • 11.
    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 100pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index
  • 12.
    1. While data[too_big_index]<= data[pivot] ++too_big_index 2. While data[too_small_index] > data[pivot] --too_small_index 3. If too_big_index < too_small_index swap data[too_big_index] and data[too_small_index] 4. While too_small_index > too_big_index, go to 1. 5. Swap data[too_small_index] and data[pivot_index] 2 4 10 12 13 50 57 63 100pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index
  • 13.
    1. While data[too_big_index]<= data[pivot] ++too_big_index 2. While data[too_small_index] > data[pivot] --too_small_index 3. If too_big_index < too_small_index swap data[too_big_index] and data[too_small_index] 4. While too_small_index > too_big_index, go to 1. 5. Swap data[too_small_index] and data[pivot_index] 2 4 10 12 13 50 57 63 100pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index
  • 14.
    1. While data[too_big_index]<= data[pivot] ++too_big_index 2. While data[too_small_index] > data[pivot] --too_small_index 3. If too_big_index < too_small_index swap data[too_big_index] and data[too_small_index] 4. While too_small_index > too_big_index, go to 1. 5. Swap data[too_small_index] and data[pivot_index] 2 4 10 12 13 50 57 63 100pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index
  • 15.
    1. While data[too_big_index]<= data[pivot] ++too_big_index 2. While data[too_small_index] > data[pivot] --too_small_index 3. If too_big_index < too_small_index swap data[too_big_index] and data[too_small_index] 4. While too_small_index > too_big_index, go to 1. 5. Swap data[too_small_index] and data[pivot_index] 2 4 10 12 13 50 57 63 100pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index
  • 16.
    1. While data[too_big_index]<= data[pivot] ++too_big_index 2. While data[too_small_index] > data[pivot] --too_small_index 3. If too_big_index < too_small_index swap data[too_big_index] and data[too_small_index] 4. While too_small_index > too_big_index, go to 1. 5. Swap data[too_small_index] and data[pivot_index] 2 4 10 12 13 50 57 63 100pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index
  • 17.
    1. While data[too_big_index]<= data[pivot] ++too_big_index 2. While data[too_small_index] > data[pivot] --too_small_index 3. If too_big_index < too_small_index swap data[too_big_index] and data[too_small_index] 4. While too_small_index > too_big_index, go to 1. 5. Swap data[too_small_index] and data[pivot_index] 2 4 10 12 13 50 57 63 100pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] too_big_index too_small_index
  • 18.
    1. While data[too_big_index]<= data[pivot] ++too_big_index 2. While data[too_small_index] > data[pivot] --too_small_index 3. If too_big_index < too_small_index swap data[too_big_index] and data[too_small_index] 4. While too_small_index > too_big_index, go to 1. 5. Swap data[too_small_index] and data[pivot_index] 2 4 10 12 13 50 57 63 100pivot_index = 0 [0] [1] [2] [3] [4] [5] [6] [7] [8] > data[pivot]<= data[pivot]
  • 19.
    Quicksort Analysis  Assumethat keys are random, uniformly distributed.  Best case running time: O(n log2n)  Worst case running time?  Recursion: 1. Partition splits array in two sub-arrays: • one sub-array of size 0 • the other sub-array of size n-1 1. Quicksort each sub-array  Depth of recursion tree?
  • 20.
    Quicksort Analysis  Assumethat keys are random, uniformly distributed.  Best case running time: O(n log2n)  Worst case running time?  Recursion: 1. Partition splits array in two sub-arrays: • one sub-array of size 0 • the other sub-array of size n-1 1. Quicksort each sub-array  Depth of recursion tree? O(n)
  • 21.
    Quicksort Analysis  Assumethat keys are random, uniformly distributed.  Best case running time: O(n log2n)  Worst case running time?  Recursion: 1. Partition splits array in two sub-arrays: • one sub-array of size 0 • the other sub-array of size n-1 1. Quicksort each sub-array  Depth of recursion tree? O(n)  Number of accesses per partition?
  • 22.
    Quicksort Analysis  Assumethat keys are random, uniformly distributed.  Best case running time: O(n log2n)  Worst case running time?  Recursion: 1. Partition splits array in two sub-arrays: • one sub-array of size 0 • the other sub-array of size n-1 1. Quicksort each sub-array  Depth of recursion tree? O(n)  Number of accesses per partition? O(n)
  • 23.
    Quicksort Analysis  Assumethat keys are random, uniformly distributed.  Best case running time: O(n log2n)  Worst case running time: O(n2 )!!!
  • 24.
    Quicksort Analysis  Assumethat keys are random, uniformly distributed.  Best case running time: O(n log2n)  Worst case running time: O(n2 )!!!  What can we do to avoid worst case?
  • 25.
    Improved Pivot Selection Pickmedian value of three elements from data array: data[0], data[n/2], and data[n-1]. Use this median value as pivot.
  • 26.
    Improving Performance of Quicksort Improved selection of pivot.  For sub-arrays of size 3 or less, apply brute force search:  Sub-array of size 1: trivial  Sub-array of size 2:  if(data[first] > data[second]) swap them  Sub-array of size 3: left as an exercise.