0% found this document useful (0 votes)
6 views

2_2 Quick sort

Uploaded by

Ravi Rane
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
6 views

2_2 Quick sort

Uploaded by

Ravi Rane
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 32

CS 332: Algorithms

Quicksort
Review: Quicksort
 Sorts in place
 Sorts O(n lg n) in the average case
 Sorts O(n2) in the worst case
 But in practice, it’s quick
 And the worst case doesn’t happen often (but more
on this later…)
Quicksort
 Another divide-and-conquer algorithm
 The array A[p..r] is partitioned into two non-
empty subarrays A[p..q] and A[q+1..r]
 Invariant: All elements in A[p..q] are less than all
elements in A[q+1..r]
 The subarrays are recursively sorted by calls to
quicksort
 Unlike merge sort, no combining step: two
subarrays form an already-sorted array
Quicksort Code
Quicksort(A, p, r)
{
if (p < r)
{
q = Partition(A, p, r);
Quicksort(A, p, q);
Quicksort(A, q+1, r);
}
}
Partition
 Clearly, all the action takes place in the
partition() function
 Rearranges the subarray in place
 End result:
 Two subarrays
 All values in first subarray  all values in second
 Returns the index of the “pivot” element
separating the two subarrays
 How do you suppose we implement this?
Partition In Words
 Partition(A, p, r):
 Select an element to act as the “pivot” (which?)
 Grow two regions, A[p..i] and A[j..r]
 All elements in A[p..i] <= pivot
 All elements in A[j..r] >= pivot
 Increment i until A[i] >= pivot
 Decrement j until A[j] <= pivot
 Swap A[i] and A[j]
 Repeat until i >= j
Note: slightly different from
 Return j book’s partition()
Partition Code
Partition(A, p, r)
x = A[p];
i = p - 1; Illustrate on
j = r + 1; A = {5, 3, 2, 6, 4, 1, 3, 7};
while (TRUE)
repeat
j--;
until A[j] <= x;
repeat
What is the running time of
i++;
partition()?
until A[i] >= x;
if (i < j)
Swap(A, i, j);
else
return j;
Partition Code
Partition(A, p, r)
x = A[p];
i = p - 1;
j = r + 1;
while (TRUE)
repeat
j--;
until A[j] <= x;
repeat
i++; partition() runs in O(n) time
until A[i] >= x;
if (i < j)
Swap(A, i, j);
else
return j;
Analyzing Quicksort
 What will be the worst case for the algorithm?
 Partition is always unbalanced
 What will be the best case for the algorithm?
 Partition is perfectly balanced
 Which is more likely?
 The latter, by far, except...
 Will any particular input elicit the worst case?
 Yes: Already-sorted input
Analyzing Quicksort
 In the worst case:
T(1) = (1)
T(n) = T(n - 1) + (n)
 Works out to
T(n) = (n2)
Analyzing Quicksort
 In the best case:
T(n) = 2T(n/2) + (n)
 What does this work out to?
T(n) = (n lg n)
Improving Quicksort
 The real liability of quicksort is that it runs in
O(n2) on already-sorted input
 Book discusses two solutions:
 Randomize the input array, OR
 Pick a random pivot element
 How will these solve the problem?
 By insuring that no particular input can be chosen
to make quicksort run in O(n2) time
Analyzing Quicksort: Average Case
 Assuming random input, average-case running
time is much closer to O(n lg n) than O(n 2)
 First, a more intuitive explanation/example:
 Suppose that partition() always produces a 9-to-1
split. This looks quite unbalanced!
 The recurrence is thus: Use n instead of O(n)
for convenience (how?)
T(n) = T(9n/10) + T(n/10) + n
 How deep will the recursion go? (draw it)
Analyzing Quicksort: Average Case
 Intuitively, a real-life run of quicksort will
produce a mix of “bad” and “good” splits
 Randomly distributed among the recursion tree
 Pretend for intuition that they alternate between
best-case (n/2 : n/2) and worst-case (n-1 : 1)
 What happens if we bad-split root node, then
good-split the resulting size (n-1) node?
Analyzing Quicksort: Average Case
 Intuitively, a real-life run of quicksort will
produce a mix of “bad” and “good” splits
 Randomly distributed among the recursion tree
 Pretend for intuition that they alternate between
best-case (n/2 : n/2) and worst-case (n-1 : 1)
 What happens if we bad-split root node, then
good-split the resulting size (n-1) node?
 We fail English
Analyzing Quicksort: Average Case
 Intuitively, a real-life run of quicksort will
produce a mix of “bad” and “good” splits
 Randomly distributed among the recursion tree
 Pretend for intuition that they alternate between best-
case (n/2 : n/2) and worst-case (n-1 : 1)
 What happens if we bad-split root node, then good-
split the resulting size (n-1) node?
 We end up with three subarrays, size 1, (n-1)/2, (n-1)/2
 Combined cost of splits = n + n -1 = 2n -1 = O(n)
 No worse than if we had good-split the root node!
Analyzing Quicksort: Average Case
 Intuitively, the O(n) cost of a bad split
(or 2 or 3 bad splits) can be absorbed
into the O(n) cost of each good split
 Thus running time of alternating bad and good
splits is still O(n lg n), with slightly higher
constants
 How can we be more rigorous?
Analyzing Quicksort: Average Case
 For simplicity, assume:
 All inputs distinct (no repeats)
 Slightly different partition() procedure
 partition around a random element, which is not included
in subarrays
 all splits (0:n-1, 1:n-2, 2:n-3, … , n-1:0) equally likely
 What is the probability of a particular split
happening?
 Answer: 1/n
Analyzing Quicksort: Average Case
 So partition generates splits
(0:n-1, 1:n-2, 2:n-3, … , n-2:1, n-1:0)
each with probability 1/n
 If T(n) is the expected running time,

1 n 1
T n    T k  T n  1  k   n 
n k 0
 What is each term under the summation for?
 What is the (n) term for?
Analyzing Quicksort: Average Case
 So…
1 n 1
T n    T k  T n  1  k   n 
n k 0

2 n 1 Write it on
  T k  n  the board
n k 0
 Note: this is just like the book’s recurrence (p166),
except that the summation starts with k=0
 We’ll take care of that in a second
Analyzing Quicksort: Average Case
 We can solve this recurrence using the dreaded
substitution method
 Guess the answer
 Assume that the inductive hypothesis holds
 Substitute it in for some value < n
 Prove that it follows for n
Analyzing Quicksort: Average Case
 We can solve this recurrence using the dreaded
substitution method
 Guess the answer
 What’s the answer?
 Assume that the inductive hypothesis holds
 Substitute it in for some value < n
 Prove that it follows for n
Analyzing Quicksort: Average Case
 We can solve this recurrence using the dreaded
substitution method
 Guess the answer
 T(n) = O(n lg n)
 Assume that the inductive hypothesis holds
 Substitute it in for some value < n
 Prove that it follows for n
Analyzing Quicksort: Average Case
 We can solve this recurrence using the dreaded
substitution method
 Guess the answer
 T(n) = O(n lg n)
 Assume that the inductive hypothesis holds
 What’s the inductive hypothesis?
 Substitute it in for some value < n
 Prove that it follows for n
Analyzing Quicksort: Average Case
 We can solve this recurrence using the dreaded
substitution method
 Guess the answer
 T(n) = O(n lg n)
 Assume that the inductive hypothesis holds
 T(n)  an lg n + b for some constants a and b
 Substitute it in for some value < n
 Prove that it follows for n
Analyzing Quicksort: Average Case
 We can solve this recurrence using the dreaded
substitution method
 Guess the answer
 T(n) = O(n lg n)
 Assume that the inductive hypothesis holds
 T(n)  an lg n + b for some constants a and b
 Substitute it in for some value < n
 What value?
 Prove that it follows for n
Analyzing Quicksort: Average Case
 We can solve this recurrence using the dreaded
substitution method
 Guess the answer
 T(n) = O(n lg n)
 Assume that the inductive hypothesis holds
 T(n)  an lg n + b for some constants a and b
 Substitute it in for some value < n
 The value k in the recurrence
 Prove that it follows for n
Analyzing Quicksort: Average Case
 We can solve this recurrence using the dreaded
substitution method
 Guess the answer
 T(n) = O(n lg n)
 Assume that the inductive hypothesis holds
 T(n)  an lg n + b for some constants a and b
 Substitute it in for some value < n
 The value k in the recurrence
 Prove that it follows for n
 Grind through it…
Analyzing Quicksort: Average Case
2 n 1
T n    T k  n  The recurrence to be solved
n k 0
2 n 1
  ak lg k  b  n  Plug
What
in inductive
are we doing
hypothesis
here?
n k 0
n 1
2 
  b   ak lg k  b   n  Expand
Whatout
arethe
we k=0 case
doing here?
n k 1 
2 n 1 2b
  ak lg k  b   n  2b/n is just a constant,
What are we doing here?
so fold it into (n)
n k 1 n
2 n 1
  ak lg k  b  n  Note: leaving the same
recurrence as the book
n k 1
Analyzing Quicksort: Average Case

2 n 1
T n    ak lg k  b  n  The recurrence to be solved
n k 1
2 n 1 2 n 1
  ak lg k   b  n  Distribute
What arethewe
summation
doing here?
n k 1 n k 1
2a n  1 2b
  k lg k  (n  1)  n  Evaluate the summation:
What are we doing here?
b+b+…+b = b (n-1)
n k 1 n
2a n  1
  k lg k  2b  n  Since n-1<n,
What 2b(n-1)/n
are we < 2b
doing here?
n k 1
This summation gets its own set of slides later
Analyzing Quicksort: Average Case

2a n  1
T n    k lg k  2b  n  The recurrence to be solved
n k 1
2a  1 2 1 2
  n lg n  n   2b  n  What We’llthe
prove this later
hell?
n 2 8 
a
 an lg n  n  2b  n  Distribute
What arethewe(2a/n)
doingterm
here?
4
 a 
 an lg n  b   n  b  n  Remember, our goal is to get
What are we doing here?
 4  T(n)  an lg n + b
 an lg n  b Pick a large enough that
How did we do this?
an/4 dominates (n)+b
Analyzing Quicksort: Average Case
 So T(n)  an lg n + b for certain a and b
 Thus the induction holds
 Thus T(n) = O(n lg n)
 Thus quicksort runs in O(n lg n) time on average
(phew!)
 Oh yeah, the summation…

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy