(les03)-quicksort(2)
TRANSCRIPT
-
7/25/2019 (les03)-quicksort(2)
1/28
Algoritmen & Datastructuren2014 2015
Quicksort
Philip Dutr
Dept. of Computer Science, K.U.Leuven
-
7/25/2019 (les03)-quicksort(2)
2/28
Overview Lecture
Copyright Ph.Dutr, Spring 20152
Quicksort Quicksort partitioning
Variant 1
Variant 2
Variant 3
Running Times
Performance Analysis Worst
Best
Average
Optimizations
Summary
-
7/25/2019 (les03)-quicksort(2)
3/28
Sorting algorithms so far
Copyright Ph.Dutr, Spring 20153
Insertion sort: ~n2
/4 comparisons average case In-place sorting
Selection sort: ~n2/2 comparisons
In-place sorting
Merge sort: ~n.log2n comparisons
Not in-place (additional memory needed)
http://www.youtube.com/watch?v=k4RRi_ntQc8&feature=related
http://www.youtube.com/watch?v=k4RRi_ntQc8&feature=relatedhttp://www.youtube.com/watch?v=k4RRi_ntQc8&feature=related -
7/25/2019 (les03)-quicksort(2)
4/28
How fast can sorting algorithms go?
Copyright Ph.Dutr, Spring 20154
Comparison sorts Sort by comparing two elements
Any comparison sort needs at least ~n. log2n comparisons
Merge sort is asymptotically optimal!
Non-comparison sorts, in linear (~ n) time:
Counting sort
Radix sort
Bucket sort See next lecture!
-
7/25/2019 (les03)-quicksort(2)
5/28
Quicksort (section 2.3)
Copyright Ph.Dutr, Spring 20155
Most widely used sorting algorithm (e.g. Java) In-place
No additional memory needed
~1.39.n.log2n on average
Mergesort:
Recurse first (trivial), then merge (do real work) Quicksort:
Partition first (do real work), then recurse (trivial)
-
7/25/2019 (les03)-quicksort(2)
6/28
Quicksort
Copyright Ph.Dutr, Spring 20156
Partitioning of elements: Choose pivot element, e.g. a[j]
Elements a[lo] a[j-1] a[j]
Elements a[j+1] a[hi] a[j]
-
7/25/2019 (les03)-quicksort(2)
7/28
Quicksort
Copyright Ph.Dutr, Spring 20157
public class Quick
{ // Quicksort.
public static void sort(Comparable[] a) {
StdRandom.shuffle(a);
sort(a, 0, a.length - 1);
}
private static void sort(Comparable[] a, intlo, inthi) {
if(hi
-
7/25/2019 (les03)-quicksort(2)
8/28
Quicksort
Copyright Ph.Dutr, Spring 20158
-
7/25/2019 (les03)-quicksort(2)
9/28
Quicksort
Copyright Ph.Dutr, Spring 20159
Charles Hoare (1934)
Quicksort: 1960
ACM Turing Award 1980
1972 Edsger W. Dijkstra
1974 Donald E. Knuth
1988 Ivan Sutherland
2003 Alan Kay
-
7/25/2019 (les03)-quicksort(2)
10/28
Quicksort
Copyright Ph.Dutr, Spring 201510
http://www.youtube.com/watch?v=2HjspVV0jK4
http://www.youtube.com/watch?v=2HjspVV0jK4http://www.youtube.com/watch?v=2HjspVV0jK4 -
7/25/2019 (les03)-quicksort(2)
11/28
Quicksort: partitioning, variant 1
Copyright Ph.Dutr, Spring 201511
Choose pivot element (e.g. first element)
Create 2 arrays: l ef t [ ] and r i ght [ ]
Loop over all elements
If element < pivot, put into l ef t [ ]
If element > pivot, put into r i ght [ ]
(if element == pivot, left or right)
Concatenate l ef t [ ] + pi vot + r i ght [ ]
n-1 number of comparisons
-
7/25/2019 (les03)-quicksort(2)
12/28
Quicksort: partitioning, variant 2
Copyright Ph.Dutr, Spring 201512
private static intpartition(Comparable[] a, intlo, inthi)
{ // Partition into a[lo..i-1], a[i], a[i+1..hi].
inti = lo, j = hi+1; // left and right scan indices
Comparable v = a[lo]; // partitioning value
while(true)
{ // Scan right - left, check for scan complete, and exchange
while(less(a[++i], v)) if(i == hi)break;
while(less(v, a[--j])) if(j == lo)break;if(i >= j)break;
exch(a, i, j);
}
exch(a, lo, j); // Put v = a[j] into position
returnj; // with a[lo..j-1]
-
7/25/2019 (les03)-quicksort(2)
13/28
Quicksort: partitioning, variant 2
Copyright Ph.Dutr, Spring 201513
-
7/25/2019 (les03)-quicksort(2)
14/28
Quicksort: partitioning, variant 3 (Lomuto)
Copyright Ph.Dutr, Spring 201514
-
7/25/2019 (les03)-quicksort(2)
15/28
Copyright Ph.Dutr, Spring 201515
-
7/25/2019 (les03)-quicksort(2)
16/28
Copyright Ph.Dutr, Spring 201516
-
7/25/2019 (les03)-quicksort(2)
17/28
Quicksort: partitioning, variant 3 (Lomuto)
Copyright Ph.Dutr, Spring 201517
private static intpartition(Comparable[] a, intlo, inthi)
{ // Partition into a[lo..i], a[i+1], a[i+1..hi].
inti = lo-1; // scan index
Comparable v = a[hi]; // partitioning value
for (int j = lo; j
-
7/25/2019 (les03)-quicksort(2)
18/28
Running times
Copyright Ph.Dutr, Spring 201518
Home PC executes 108compares/second.
Supercomputer executes 1012compares/second
Lesson 1: Good algorithms are a better investment thansupercomputers.
Lesson 2: Great algorithms are better than good ones.
-
7/25/2019 (les03)-quicksort(2)
19/28
Performance of quicksort
Copyright Ph.Dutr, Spring 201519
Worst case 0 elements in one subarray and
n 1 elements in the other
T(n) = T(n 1) +T (0) + partitioning(n)
= T(n 1) + (n-1)= ~ n2/2
worst-case running time occurs if array is already sorted
insertion sort runs in ~n time in this case
-
7/25/2019 (les03)-quicksort(2)
20/28
Worst case
Copyright Ph.Dutr, Spring 201520
-
7/25/2019 (les03)-quicksort(2)
21/28
Performance of quicksort
Copyright Ph.Dutr, Spring 201521
Best Case Split is balanced
T(n) = 2T(n/2) + partitioning(n)
= ~n . log2n
Suppose split is at 9/10
T(n) = T(9n/10) +T(n/10)+ partitioning(n)
= ~c . n . log2n
Suppose split is at 99/100, 999/1000,
T(n) =~c . n . log2n
-
7/25/2019 (les03)-quicksort(2)
22/28
Best case
Copyright Ph.Dutr, Spring 201522
-
7/25/2019 (les03)-quicksort(2)
23/28
Copyright Ph.Dutr, Spring 201523
-
7/25/2019 (les03)-quicksort(2)
24/28
Performance of quicksort:
Intuition for the average case
Copyright Ph.Dutr, Spring 201524
Any permutation of elements can form the initial array Some splits will be good, others will be bad
-
7/25/2019 (les03)-quicksort(2)
25/28
Performance: average case
Copyright Ph.Dutr, Spring 201525
(mathematical derivation on blackboard)
-
7/25/2019 (les03)-quicksort(2)
26/28
Optimizations
Copyright Ph.Dutr, Spring 201526
Cuttoff to insertion sort Practice: ~ 10 elements
Median of 3 values for pivot
Better probability of splitting in half
Many similar values 3-way partitioning (less, equal, greater)
-
7/25/2019 (les03)-quicksort(2)
27/28
Optimizations
Copyright Ph.Dutr, Spring 201527
-
7/25/2019 (les03)-quicksort(2)
28/28
Summary of performance
Copyright Ph.Dutr, Spring 201528
Worst case
Number of compares is quadratic
But youll win the lottery first!
Average case
Number of compares is ~ 1.39 n log2n
39% more compares than mergesort But faster than mergesort in practice because of less data
movement.
Random shuffle
Probabilistic guarantee against worst case
Basis for math model that can be validated with experiments.
Many textbook implementations go quadratic if array
Is sorted or reverse sorted
Has many duplicates (even if randomized!)