Introduction to Algorithms/Quicksort
- Hoare 1962
- Divide and conquer Divide-and-Conquer Algorithm
- sorts “in place”
- very practical (with tunning)
Steps
steps:
- Divide: partition array in to 2 subarrays around pivot $x$ s.t. elems in lower array $\leqslant x \leqslant$ elems in upper array
- Conquer: recursively sort 2 subarrays
- Combine: trival
Key: linear time ($\Theta(n)$) partitioning subroutine.
def partition(A, p, q) # A[p,...,q]
x = A[p] # pivot
i = p
for j in range(p+1,q+1):
if A[j] <= x:
i = i + 1
swap(A[i], A[j])
swap(A[p],A[i])
return i
def quicksort(A, p, q):
if p < q:
r = partition(A, p, q)
quicksort(A, p, r - 1)
quicksort(A, r + 1, q)
Analysis
assume all elems distinct
worst time:
- input sorted or reverse sorted. one side of partitions has no elems \(T(n) = T(0) + T(n-1) + \Theta(n) = \Theta(n^2)\)
best case:
- partition splits the array $\frac{n}{2}: \frac{n}{2}$ \(T(n)=2T\left( \frac{n}{2} \right)+\Theta(n)=\Theta(n\log n)\)
Randomized quicksort
- running time independent of input ordering
- no assumptions about input distribution
- no specific input elicits the worst behavior(only by RNG)
pivot on rand elem
$T(n) =$ r,v for running time assuming the random numbers are independent
for $k=0,1,\dots,n-1$ let
\[X_{k} = \begin{cases} 1, & \text{if partition generates} \ k:n-k-1 \ \text{split} \newline 0, & \text{otherwise} \end{cases}\]\[E[X_{k}] = \frac{1}{n}\] \[T(n)=\begin{cases} T(0)+T(n-1)+\Theta(n) ,&\text{if}\ 0:n-1 \ \text{split} \newline &\vdots \newline T(n-1)+T(0)+\Theta(n) ,&\text{if}\ n-1:0 \ \text{split} \end{cases}\] \[T(n)=\sum_{k=0}^{n-1}X_{k}(T(k)+T(n-1-k)+\Theta(n))\] \[\begin{align} E(T(n)) &= E\left[ \sum_{k=0}^{n-1}X_{k}(T(k)+T(n-1-k)+\Theta(n)) \right] \newline &= \sum_{k=0}^{n-1}E[X_{k}(T(k)+T(n-1-k)+\Theta(n))] \newline &= \sum_{k=0}^{n-1}E[X_{k}]\cdot E[T(k)+T(n-1-k)+\Theta(n)] \newline &= \frac{1}{n}\sum_{k=0}^{n-1}E[T(k)]+\frac{1}{n}\sum_{k=0}^{n-1}E[T(n-1-k)]+\Theta(n) \newline &= \frac{2}{n}\sum_{k=0}^{n-1}E[T(k)]+\Theta(n) \newline &= \frac{2}{n}\sum_{k=2}^{n-1}E[T(k)]+\Theta(n) \end{align}\]Indicator random variable
Prove $E[T(n)]\leqslant an\lg n$ for some $a>0$: Base case: choose $a$ big enough s.t. $an\lg n\geqslant E[T(n)]$ for small $n$ Use fact: $\sum_{k=2}^{n-1}k\lg k \leqslant \frac{1}{2} n^2 \lg n -\frac{1}{8}n^2$ Substitution:
\[\begin{align} E[T(n)] & \leqslant \frac{2}{n} \sum_{k=2}^{n-1}ak\lg k+\Theta(n) \newline & \leqslant an\lg n - \frac{a}{4}n+\Theta(n) \newline & \leqslant an\lg n \quad \text{if} \ a\geqslant 4 \end{align}\]
Comments