Quick Sort
Quick Sort
QuickSort
Strategy
Quicksort
Quicksort
we can select the middle entry, 44, and sort the remaining entries
into two groups, those less than 44 and those greater than 44:
38 10 26 12 43 3 44 80 95 84 66 79 87 96 81
Notice that 44 is now in the correct location if the list was sorted
– Proceed by applying the algorithm to the first six and last eight entries
Quicksort
5
Run-time analysis
In the best case, the list will be split into two approximately equal
sub-lists, and thus, the run time could be very similar to that of
merge sort: Θ(n ln(n))
Our goal is to choose the median element in the list as our pivot:
80 38 95 84 66 10 79 2 26 87 96 12 43 81 3
1 3x 2
2
5
2 ∫ x ⋅ ( 6 x (1 − x ) ) dx = =0.3125 3! x (1 − x )
0
16
– Ratio 1:2.2 on average
– 90 % of the time, the width will have a
ratio of 1:6.388 or better
Quicksort
11
7.6.3 Median-of-three
Recall that merge sort always divides a list into two equal halves:
1
ln
2
– The median-of-three will require ≈ 1.8499 or 85 % more recursive
steps 11
ln
16
1
ln
– A single random pivot will require 2 ≈ 2.4094 or 141 % more
recursive steps 3
ln
4
Quicksort
12
7.6.3 Median-of-three
Tmedian of 3 ( n )
Tmedian ( n )
Quicksort
13
7.6.4 Implementation
First, we have already examined the first, middle, and last entries
and chosen the median of these to be the pivot
In addition, we can:
– move the smallest entry to the first entry
– move the largest entry to the middle entry
Quicksort
18
7.6.5 Implementation
Next, recall that our goal is to partition all remaining elements based
on whether they are smaller than or greater than the pivot
Continue doing so until the appropriate entries you find are actually
in order
The index to the larger entry we found would be the first large entry
in the list (as seen from the left)
Therefore, we could move this entry into the last entry of the list
We can fill this spot with the pivot
Quicksort
20
Implementation
array[last – 1] = array[low]
array[low] = pivot
quicksort( array, first, low )
quicksort( array, high, last )
Quicksort
21
Quicksort example
13 77 49 35 61 48 73 23 95 3 89 37 57 99 17 32 94 28 15 55 7 51 88 97 62
We will call insertion sort if the list being sorted of size N = 6 or less
Quicksort
22
7.6.5 Quicksort example
13 77 49 35 61 48 73 23 95 3 89 37 57 99 17 32 94 28 15 55 7 51 88 97 62
quicksort( array, 0, 25 )
Quicksort
23
7.6.5 Quicksort example
13 77 49 35 61 48 73 23 95 3 89 37 57 99 17 32 94 28 15 55 7 51 88 97 62
quicksort( array, 0, 25 )
Quicksort
24
7.6.5 Quicksort example
13 77 49 35 61 48 73 23 95 3 89 37 62 99 17 32 94 28 15 55 7 51 88 97
quicksort( array, 0, 25 )
Quicksort
25
7.6.5 Quicksort example
13 77 49 35 61 48 73 23 95 3 89 37 62 99 17 32 94 28 15 55 7 51 88 97
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
26
7.6.5 Quicksort example
13 77 49 35 61 48 73 23 95 3 89 37 62 99 17 32 94 28 15 55 7 51 88 97
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
27
7.6.5 Quicksort example
13 51 49 35 61 48 73 23 95 3 89 37 62 99 17 32 94 28 15 55 7 77 88 97
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
28
7.6.5 Quicksort example
13 51 49 35 61 48 73 23 95 3 89 37 62 99 17 32 94 28 15 55 7 77 88 97
Continue searching
low = 4;
high = 20;
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
29
7.6.5 Quicksort example
13 51 49 35 7 48 73 23 95 3 89 37 62 99 17 32 94 28 15 55 61 77 88 97
Continue searching
low = 4;
high = 20;
Swap them
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
30
7.6.5 Quicksort example
13 51 49 35 7 48 73 23 95 3 89 37 62 99 17 32 94 28 15 55 61 77 88 97
Continue searching
low = 6;
high = 19;
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
31
7.6.5 Quicksort example
13 51 49 35 7 48 55 23 95 3 89 37 62 99 17 32 94 28 15 73 61 77 88 97
Continue searching
low = 6;
high = 19;
Swap them
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
32
7.6.5 Quicksort example
13 51 49 35 7 48 55 23 95 3 89 37 62 99 17 32 94 28 15 73 61 77 88 97
Continue searching
low = 8;
high = 18;
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
33
7.6.5 Quicksort example
13 51 49 35 7 48 55 23 15 3 89 37 62 99 17 32 94 28 95 73 61 77 88 97
Continue searching
low = 8;
high = 18;
Swap them
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
34
7.6.5 Quicksort example
13 51 49 35 7 48 55 23 15 3 89 37 62 99 17 32 94 28 95 73 61 77 88 97
Continue searching
low = 10;
high = 17;
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
35
7.6.5 Quicksort example
13 51 49 35 7 48 55 23 15 3 28 37 62 99 17 32 94 89 95 73 61 77 88 97
Continue searching
low = 10;
high = 17;
Swap them
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
36
7.6.5 Quicksort example
13 51 49 35 7 48 55 23 15 3 28 37 62 99 17 32 94 89 95 73 61 77 88 97
Continue searching
low = 12;
high = 15;
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
37
7.6.5 Quicksort example
13 51 49 35 7 48 55 23 15 3 28 37 32 99 17 62 94 89 95 73 61 77 88 97
Continue searching
low = 12;
high = 15;
Swap them
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
38
7.6.5 Quicksort example
13 51 49 35 7 48 55 23 15 3 28 37 32 99 17 62 94 89 95 73 61 77 88 97
Continue searching
low = 13;
high = 14;
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
39
7.6.5 Quicksort example
13 51 49 35 7 48 55 23 15 3 28 37 32 17 99 62 94 89 95 73 61 77 88 97
Continue searching
low = 13;
high = 14;
Swap them
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
40
7.6.5 Quicksort example
13 51 49 35 7 48 55 23 15 3 28 37 32 17 99 62 94 89 95 73 61 77 88 97
Continue searching
low = 14;
high = 13;
Now, low > high, so we stop
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
41
7.6.5 Quicksort example
13 51 49 35 7 48 55 23 15 3 28 37 32 17 57 62 94 89 95 73 61 77 88 97 99
Continue searching
low = 14;
high = 13;
Now, low > high, so we stop
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
42
7.6.5 Quicksort example
13 51 49 35 7 48 55 23 15 3 28 37 32 17 57 62 94 89 95 73 61 77 88 97 99
quicksort( array, 0, 25 )
Quicksort
43
7.6.5 Quicksort example
13 51 49 35 7 48 55 23 15 3 28 37 32 17 57 62 94 89 95 73 61 77 88 97 99
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
44
7.6.5 Quicksort example
13 51 49 35 7 48 55 23 15 3 28 37 32 17 57 62 94 89 95 73 61 77 88 97 99
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
45
7.6.5 Quicksort example
13 51 49 35 7 48 55 23 15 3 28 37 32 57 62 94 89 95 73 61 77 88 97 99
pivot = 17;
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
46
7.6.5 Quicksort example
13 51 49 35 7 48 55 23 15 3 28 37 32 57 62 94 89 95 73 61 77 88 97 99
pivot = 17;
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
47
7.6.5 Quicksort example
13 51 49 35 7 48 55 23 15 3 28 37 32 57 62 94 89 95 73 61 77 88 97 99
pivot = 17;
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
48
7.6.5 Quicksort example
13 3 49 35 7 48 55 23 15 51 28 37 32 57 62 94 89 95 73 61 77 88 97 99
pivot = 17;
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
49
7.6.5 Quicksort example
13 3 49 35 7 48 55 23 15 51 28 37 32 57 62 94 89 95 73 61 77 88 97 99
pivot = 17;
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
50
7.6.5 Quicksort example
13 3 15 35 7 48 55 23 49 51 28 37 32 57 62 94 89 95 73 61 77 88 97 99
pivot = 17;
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
51
7.6.5 Quicksort example
13 3 15 35 7 48 55 23 49 51 28 37 32 57 62 94 89 95 73 61 77 88 97 99
pivot = 17;
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
52
7.6.5 Quicksort example
13 3 15 7 35 48 55 23 49 51 28 37 32 57 62 94 89 95 73 61 77 88 97 99
pivot = 17;
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
53
7.6.5 Quicksort example
13 3 15 7 35 48 55 23 49 51 28 37 32 57 62 94 89 95 73 61 77 88 97 99
pivot = 17;
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
54
7.6.5 Quicksort example
13 3 15 7 17 48 55 23 49 51 28 37 32 35 57 62 94 89 95 73 61 77 88 97 99
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
55
7.6.5 Quicksort example
13 3 15 7 17 48 55 23 49 51 28 37 32 35 57 62 94 89 95 73 61 77 88 97 99
quicksort( array, 0, 4 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
56
7.6.5 Quicksort example
13 3 15 7 17 48 55 23 49 51 28 37 32 35 57 62 94 89 95 73 61 77 88 97 99
insertion_sort( array, 0, 4 )
quicksort( array, 0, 4 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
57
7.6.5 Quicksort example
3 7 13 15 17 48 55 23 49 51 28 37 32 35 57 62 94 89 95 73 61 77 88 97 99
insertion_sort( array, 0, 4 )
quicksort( array, 0, 4 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
58
7.6.5 Quicksort example
3 7 13 15 17 48 55 23 49 51 28 37 32 35 57 62 94 89 95 73 61 77 88 97 99
quicksort( array, 0, 4 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
59
7.6.5 Quicksort example
3 7 13 15 17 48 55 23 49 51 28 37 32 35 57 62 94 89 95 73 61 77 88 97 99
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
60
7.6.5 Quicksort example
3 7 13 15 17 48 55 23 49 51 28 37 32 35 57 62 94 89 95 73 61 77 88 97 99
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
61
7.6.5 Quicksort example
3 7 13 15 17 48 55 23 49 51 28 37 32 35 57 62 94 89 95 73 61 77 88 97 99
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
62
7.6.5 Quicksort example
3 7 13 15 17 35 55 23 49 51 28 37 32 57 62 94 89 95 73 61 77 88 97 99
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
63
7.6.5 Quicksort example
3 7 13 15 17 35 55 23 49 51 28 37 32 57 62 94 89 95 73 61 77 88 97 99
pivot = 48;
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
64
7.6.5 Quicksort example
3 7 13 15 17 35 55 23 49 51 28 37 32 57 62 94 89 95 73 61 77 88 97 99
pivot = 48;
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
65
7.6.5 Quicksort example
3 7 13 15 17 35 32 23 49 51 28 37 55 57 62 94 89 95 73 61 77 88 97 99
pivot = 48;
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
66
7.6.5 Quicksort example
3 7 13 15 17 35 32 23 49 51 28 37 55 57 62 94 89 95 73 61 77 88 97 99
Continue searching
low = 8;
high = 11;
pivot = 48;
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
67
7.6.5 Quicksort example
3 7 13 15 17 35 32 23 37 51 28 49 55 57 62 94 89 95 73 61 77 88 97 99
Continue searching
low = 8;
high = 11;
Swap them
pivot = 48;
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
68
7.6.5 Quicksort example
3 7 13 15 17 35 32 23 37 51 28 49 55 57 62 94 89 95 73 61 77 88 97 99
Continue searching
low = 8;
high = 11;
pivot = 48;
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
69
7.6.5 Quicksort example
3 7 13 15 17 35 32 23 37 28 51 49 55 57 62 94 89 95 73 61 77 88 97 99
Continue searching
low = 8;
high = 11;
Swap them
pivot = 48;
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
70
7.6.5 Quicksort example
3 7 13 15 17 35 32 23 37 28 51 49 55 57 62 94 89 95 73 61 77 88 97 99
Continue searching
low = 8;
high = 11;
Now, low > high, so we stop
pivot = 48;
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
71
7.6.5 Quicksort example
3 7 13 15 17 35 32 23 37 28 48 49 55 51 57 62 94 89 95 73 61 77 88 97 99
Continue searching
low = 8;
high = 11;
Now, low > high, so we stop
pivot = 48;
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
72
7.6.5 Quicksort example
3 7 13 15 17 35 32 23 37 28 48 49 55 51 57 62 94 89 95 73 61 77 88 97 99
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
73
7.6.5 Quicksort example
3 7 13 15 17 35 32 23 37 28 48 49 55 51 57 62 94 89 95 73 61 77 88 97 99
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
74
7.6.5 Quicksort example
3 7 13 15 17 35 32 23 37 28 48 49 55 51 57 62 94 89 95 73 61 77 88 97 99
quicksort( array, 5, 10 )
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
75
7.6.5 Quicksort example
3 7 13 15 17 35 32 23 37 28 48 49 55 51 57 62 94 89 95 73 61 77 88 97 99
insertion_sort( array, 5, 10 )
quicksort( array, 5, 10 )
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
76
7.6.5 Quicksort example
3 7 13 15 17 23 28 32 35 37 48 49 55 51 57 62 94 89 95 73 61 77 88 97 99
insertion_sort( array, 5, 10 )
quicksort( array, 5, 10 )
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
77
7.6.5 Quicksort example
3 7 13 15 17 23 28 32 35 37 48 49 55 51 57 62 94 89 95 73 61 77 88 97 99
quicksort( array, 5, 10 )
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
78
7.6.5 Quicksort example
3 7 13 15 17 23 28 32 35 37 48 49 55 51 57 62 94 89 95 73 61 77 88 97 99
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
79
7.6.5 Quicksort example
3 7 13 15 17 23 28 32 35 37 48 49 55 51 57 62 94 89 95 73 61 77 88 97 99
quicksort( array, 6, 14 )
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
80
7.6.5 Quicksort example
3 7 13 15 17 23 28 32 35 37 48 49 55 51 57 62 94 89 95 73 61 77 88 97 99
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 62 94 89 95 73 61 77 88 97 99
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 62 94 89 95 73 61 77 88 97 99
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 62 94 89 95 73 61 77 88 97 99
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
84
7.6.5 Quicksort example
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 62 94 89 95 73 61 77 88 97 99
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
85
7.6.5 Quicksort example
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 62 94 89 95 73 61 77 88 97 99
quicksort( array, 0, 25 )
Quicksort
86
7.6.5 Quicksort example
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 62 94 89 95 73 61 77 88 97 99
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 94 89 95 73 99 77 88 97
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 94 89 95 73 99 77 88 97
pivot = 62;
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 89 95 73 99 77 88 97 94
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 89 95 73 99 77 88 97 94
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 89 95 73 99 77 88 97 94
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 89 95 73 99 77 88 97 94
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 89 95 73 99 77 88 97 94
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 89 95 73 99 77 88 97 94
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 89 95 73 99 77 88 97 94
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 89 95 73 99 77 88 97 94
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 89 95 73 99 77 88 97 94
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 77 95 73 99 94 88 97
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 77 95 73 99 94 88 97
pivot = 89;
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 77 88 73 99 94 95 97
pivot = 89;
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 77 88 73 99 94 95 97
pivot = 89;
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 77 88 73 89 94 95 97 99
pivot = 89;
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 77 88 73 89 94 95 97 99
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 77 88 73 89 94 95 97 99
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 77 88 73 89 94 95 97 99
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 73 77 88 89 94 95 97 99
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 73 77 88 89 94 95 97 99
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 73 77 88 89 94 95 97 99
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 73 77 88 89 94 95 97 99
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 73 77 88 89 94 95 97 99
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 73 77 88 89 94 95 97 99
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 73 77 88 89 94 95 97 99
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 73 77 88 89 94 95 97 99
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 73 77 88 89 94 95 97 99
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 73 77 88 89 94 95 97 99
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 73 77 88 89 94 95 97 99
quicksort( array, 0, 25 )
Quicksort
117
7.6.5 Quicksort example
3 7 13 15 17 23 28 32 35 37 48 49 51 55 57 61 62 73 77 88 89 94 95 97 99