Lecture 25: Quick Sort
description
Transcript of Lecture 25: Quick Sort
LECTURE 25:QUICK SORT
CSC 213 – Large Scale Programming
or
Today’s Goals
Begin by discussing basic approach of quick sort Divide-and-conquer used, but how does
this help? Merge sort also divides-and-conquers, what
differs? Show execution tree & discuss meaning for
quick sort Consider selection and important of the
pivot Quick sort rocks for which pivots and why? If we get really unlucky, when would quick
sort suck? How can we affect choice to insure we get
lucky Given all these facts: is quick sort
worth the risk?
Quick (ungraded) Quiz
For what cases does quick sort suck?
When would quick sort execute fastest?
How does quick sort use divide-and-conquer?
Divide-and-Conquer
Like all recursive algorithms, need base case Has immediate solution to a simple
problem Work is not easy and sorting 2+ items takes
work Already sorted 1 item since it cannot be out
of order Sorting a list with 0 items even easer
Recursive step simplifies problem & combines it Begins by splitting data into two Sequences Combine subSequences once they are
sorted
Quick Sort
Divide: Partition by pivot L has values <= p G uses values >= p
Recur: Sort L and G Conquer: Merge L, p, G
p
Quick Sort
Divide: Partition by pivot L has values <= p G uses values >= p
Recur: Sort L and G Conquer: Merge L, p, G
p
Quick Sort
Divide: Partition by pivot L has values <= p G uses values >= p
Recur: Sort L and G Conquer: Merge L, p, G
p
L G
p
Quick Sort
Divide: Partition by pivot L has values <= p G uses values >= p
Recur: Sort L and G Conquer: Merge L, p, G
p
p
L G
p
Quick Sort v. Merge Sort
Quick Sort Merge Sort Work mostly splitting
data Cannot guarantee even
split Should skip some
comparisons
Does not need extra space Less work allocating
arrays
Blindly merges all the data Data already in sorted
order!
Blindly splits data in half Always gets even split
Needs* to use other arrays Wastes time in allocation Complex workaround
exists
Work mostly in merge step Combines two (sorted)
halves Always skips some
comparisons
Execution Tree
Depicts divide-and-conquer execution Recursive call represented by each oval
node Original Sequence shown at start At the end of the oval, sorted Sequence
shown Initial call at root of the (binary) tree
Bottom of the tree has leaves for base cases
Execution Example
Each call starts by selecting the pivot7 2 9 4 3 7 6 1 1 2 3 4 6 7 7
9
Execution Example
Each call starts by selecting the pivot7 2 9 4 3 7 6 1 1 2 3 4 6 7 7
9
Execution Example
Split into L & G partitions around pivot7 2 9 4 3 7 6 1 1 2 3 4 6 7 7
9
Execution Example
Split into L & G partitions around pivot7 2 9 4 3 7 6 1 1 2 3 4 6 7 7
9
Execution Example
Recursively solve L partition first7 2 9 4 3 7 6 1 1 2 3 4 6 7 7
9
Execution Example
Recursively solve L partition first
2 4 3 1 1 2 3 4
7 2 9 4 3 7 6 1 1 2 3 4 6 7 7 9
Execution Example
Select new pivot and split into L & G partitions
2 4 3 1 1 2 3 4
7 2 9 4 3 7 6 1 1 2 3 4 6 7 7 9
Execution Example
Recursively solve for L
1 1
2 4 3 1 1 2 3 4
7 2 9 4 3 7 6 1 1 2 3 4 6 7 7 9
Execution Example
Recursively solve for L & enjoy base case
1 1
2 4 3 1 1 2 3 4
7 2 9 4 3 7 6 1 1 2 3 4 6 7 7 9
Execution Example
Now solve for G partition and select pivot
4 3 3 41 1
2 4 3 1 1 2 3 4
7 2 9 4 3 7 6 1 1 2 3 4 6 7 7 9
Execution Example
Recursively solve for L
4 3 3 4
1 1
2 4 3 1 1 2 3 4
7 2 9 4 3 7 6 1 1 2 3 4 6 7 7 9
Execution Example
Recursively solve for L & enjoy base case
4 3 3 4
1 1
2 4 3 1 1 2 3 4
7 2 9 4 3 7 6 1 1 2 3 4 6 7 7 9
Execution Example
Now solve for G & enjoy base case
4 4
4 3 3 4
1 1
2 4 3 1 1 2 3 4
7 2 9 4 3 7 6 1 1 2 3 4 6 7 7 9
Execution Example
Add L, pivot, & G to complete previous call
4 3 3 4
1 1
2 4 3 1 1 2 3 4
7 2 9 4 3 7 6 1 1 2 3 4 6 7 7 9
4 4
Execution Example
Add L, pivot, & G to complete previous call
4 3 3 4
1 1
2 4 3 1 1 2 3 4
7 2 9 4 3 7 6 1 1 2 3 4 6 7 7 9
4 4
Execution Example
Recursively sort G from original call
4 3 3 4
1 1
2 4 3 1 1 2 3 4
7 2 9 4 3 7 6 1 1 2 3 4 6 7 7 9
4 4
Execution Example
Recursively sort G from original call
4 3 3 4
1 1
2 4 3 1 1 2 3 4
7 2 9 4 3 7 6 1 1 2 3 4 6 7 7 9
4 4
7 9 7 7 7 9
Execution Example
Select pivot & partition into L & G
4 3 3 4
1 1
2 4 3 1 1 2 3 4
7 2 9 4 3 7 6 1 1 2 3 4 6 7 7 9
4 4
7 9 7 7 7 9
Execution Example
Solve L recursively via base case & move to G
4 3 3 4
1 1
2 4 3 1 1 2 3 4
7 2 9 4 3 7 6 1 1 2 3 4 6 7 7 9
4 4
7 9 7 7 7 9
7 9 7 9
Execution Example
Select pivot & partition into L & G
4 3 3 4
1 1
2 4 3 1 1 2 3 4
7 2 9 4 3 7 6 1 1 2 3 4 6 7 7 9
4 4
7 9 7 7 7 9
7 9 7 9
Execution Example
Solve through two base cases in L & G
9 9
4 3 3 4
1 1
2 4 3 1 1 2 3 4
7 2 9 4 3 7 6 1 1 2 3 4 6 7 7 9
4 4
7 9 7 7 7 9
7 9 7 9
Execution Example
Add L, pivot, & G to complete the call
9 9
4 3 3 4
1 1
2 4 3 1 1 2 3 4
7 2 9 4 3 7 6 1 1 2 3 4 6 7 7 9
4 4
7 9 7 7 7 9
7 9 7 9
Execution Example
Add L, pivot, & G to complete the call
9 9
4 3 3 4
1 1
2 4 3 1 1 2 3 4
7 2 9 4 3 7 6 1 1 2 3 4 6 7 7 9
4 4
7 9 7 7 7 9
7 9 7 9
Execution Example
Add L, pivot, & G to complete final call7 2 9 4 3 7 6 1 1 2 3 4 6 7 7
9
9 9
4 3 3 4
1 1
2 4 3 1 1 2 3 4
4 4
7 9 7 7 7 9
7 9 7 9
Execution Example
Sorts data, but only as good as pivot choice7 2 9 4 3 7 6 1 1 2 3 4 6 7 7
9
4 3 3 4
1 1
2 4 3 1 1 2 3 4
4 4
7 9 7 7 7 9
7 9 7 9
9 9
QUICK-SORT’S Pivot
Can select any element as pivot Pivot's existence required only, not where
or what it is QUICK-SORT'S ideal pivot is median
element Equal-sized L & G when median element
selected Makes complexity equal to MERGE-SORT Must sort data first to find the median,
however Smallest (or largest element) worst
pivot G (or L) holds all elements & other partition
empty Complexity becomes equal to INSERTION-
SORT
Simple Pivot Selection
Could use first (or last) element as pivot It’s easy to code… …but also makes sorted data the worst
case… …which is common so this is a really bad
idea Could choose random element as pivot
Little harder to code, but expected to work well
Best is median of first, mid, & last items in list Nearly eliminates worst case, but much
harder to code
For Next Lecture
Week #9 assignment posted so get working
Keep reviewing requirements for program #2 2nd preliminary deadline coming up so get
started Time developing good tests saves coding
time later Reading on radix sort for Monday
Is it possible to sort without comparisons? How is radix sort faster than O(n log n) lower
bound?