8 06 Quicksort
8 06 Quicksort
Quicksort
ece.uwaterloo.ca
[email protected]
Outline
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
6
7.6.1 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: Q(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
Recall that merge sort always divides a list into two equal halves:
1
ln
– The median-of-three will require 2 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
13
7.6.3 Median-of-three
Tmedian of 3 n
Tmedian n
Quicksort
14
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
19
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
21
7.6.5 Implementation
array[last – 1] = array[low];
array[low] = pivot;
quicksort( array, first, low );
quicksort( array, high, last );
}
}
Quicksort
22
7.6.5 Quicksort example
We will call insertion sort if the list being sorted of size N = 6 or less
Quicksort
23
7.6.5 Quicksort example
quicksort( array, 0, 25 )
Quicksort
24
7.6.5 Quicksort example
quicksort( array, 0, 25 )
Quicksort
25
7.6.5 Quicksort example
quicksort( array, 0, 25 )
Quicksort
26
7.6.5 Quicksort example
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
27
7.6.5 Quicksort example
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
28
7.6.5 Quicksort example
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
29
7.6.5 Quicksort example
Continue searching
low = 4;
high = 20;
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
30
7.6.5 Quicksort example
Continue searching
low = 4;
high = 20;
Swap them
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
31
7.6.5 Quicksort example
Continue searching
low = 6;
high = 19;
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
32
7.6.5 Quicksort example
Continue searching
low = 6;
high = 19;
Swap them
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
33
7.6.5 Quicksort example
Continue searching
low = 8;
high = 18;
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
34
7.6.5 Quicksort example
Continue searching
low = 8;
high = 18;
Swap them
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
35
7.6.5 Quicksort example
Continue searching
low = 10;
high = 17;
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
36
7.6.5 Quicksort example
Continue searching
low = 10;
high = 17;
Swap them
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
37
7.6.5 Quicksort example
Continue searching
low = 12;
high = 15;
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
38
7.6.5 Quicksort example
Continue searching
low = 12;
high = 15;
Swap them
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
39
7.6.5 Quicksort example
Continue searching
low = 13;
high = 14;
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
40
7.6.5 Quicksort example
Continue searching
low = 13;
high = 14;
Swap them
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
41
7.6.5 Quicksort example
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
Continue searching
low = 14;
high = 13;
Now, low > high, so we stop
pivot = 57;
quicksort( array, 0, 25 )
Quicksort
43
7.6.5 Quicksort example
quicksort( array, 0, 25 )
Quicksort
44
7.6.5 Quicksort example
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
45
7.6.5 Quicksort example
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
46
7.6.5 Quicksort example
pivot = 17;
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
47
7.6.5 Quicksort example
pivot = 17;
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
48
7.6.5 Quicksort example
pivot = 17;
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
49
7.6.5 Quicksort example
pivot = 17;
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
50
7.6.5 Quicksort example
pivot = 17;
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
51
7.6.5 Quicksort example
pivot = 17;
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
52
7.6.5 Quicksort example
pivot = 17;
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
53
7.6.5 Quicksort example
pivot = 17;
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
54
7.6.5 Quicksort example
pivot = 17;
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
55
7.6.5 Quicksort example
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
56
7.6.5 Quicksort example
quicksort( array, 0, 4 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
57
7.6.5 Quicksort example
insertion_sort( array, 0, 4 )
quicksort( array, 0, 4 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
58
7.6.5 Quicksort example
insertion_sort( array, 0, 4 )
quicksort( array, 0, 4 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
59
7.6.5 Quicksort example
quicksort( array, 0, 4 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
60
7.6.5 Quicksort example
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
61
7.6.5 Quicksort example
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
62
7.6.5 Quicksort example
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
63
7.6.5 Quicksort example
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
64
7.6.5 Quicksort example
pivot = 48;
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
65
7.6.5 Quicksort example
pivot = 48;
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
66
7.6.5 Quicksort example
pivot = 48;
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
67
7.6.5 Quicksort example
Continue searching
low = 8;
high = 11;
pivot = 48;
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
68
7.6.5 Quicksort example
Continue searching
low = 8;
high = 11;
Swap them
pivot = 48;
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
69
7.6.5 Quicksort example
Continue searching
low = 8;
high = 11;
pivot = 48;
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
70
7.6.5 Quicksort example
Continue searching
low = 8;
high = 11;
Swap them
pivot = 48;
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
71
7.6.5 Quicksort example
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
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
73
7.6.5 Quicksort example
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
74
7.6.5 Quicksort example
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
75
7.6.5 Quicksort example
quicksort( array, 5, 10 )
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
76
7.6.5 Quicksort example
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
insertion_sort( array, 5, 10 )
quicksort( array, 5, 10 )
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
78
7.6.5 Quicksort example
quicksort( array, 5, 10 )
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
79
7.6.5 Quicksort example
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
80
7.6.5 Quicksort example
quicksort( array, 6, 14 )
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
81
7.6.5 Quicksort example
quicksort( array, 5, 14 )
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
85
7.6.5 Quicksort example
quicksort( array, 0, 14 )
quicksort( array, 0, 25 )
Quicksort
86
7.6.5 Quicksort example
quicksort( array, 0, 25 )
Quicksort
87
7.6.5 Quicksort example
pivot = 62;
pivot = 89;
pivot = 89;
pivot = 89;
pivot = 89;
quicksort( array, 0, 25 )
Quicksort
118
7.6.5 Quicksort example
x
Fmedian of 3 x 3! 1 d 3x 2 2 x 3
0
f median of medians x 3!3x 2 2 x 3 1 3x 2 2 x 3 3! x 1 x
1
2
469
2 x f median of medians x dx 0.3664
0
1280
Quicksort
124
7.6.7 Further modifications
Tmedian of medians n
Tmedian n
Quicksort
125
7.6.7 Further modifications
• Copy the equal entries to the center and only recurs on either side
Summary
References
Wikipedia, http://en.wikipedia.org/wiki/Quicksort
[1] Donald E. Knuth, The Art of Computer Programming, Volume 3: Sorting and
Searching, 2nd Ed., Addison Wesley, 1998, §5.1, 2, 3.
[2] Cormen, Leiserson, and Rivest, Introduction to Algorithms, McGraw Hill, 1990,
p.137-9 and §9.1.
[3] Weiss, Data Structures and Algorithm Analysis in C++, 3rd Ed., Addison Wesley,
§7.1, p.261-2.
[4] Gruber, Holzer, and Ruepp, Sorting the Slow Way: An Analysis of Perversely Awful
Randomized Sorting Algorithms, 4th International Conference on Fun with
Algorithms, Castiglioncello, Italy, 2007.
These slides are provided for the ECE 250 Algorithms and Data Structures course. The
material in it reflects Douglas W. Harder’s best judgment in light of the information available to
him at the time of preparation. Any reliance on these course slides by any party for any other
purpose are the responsibility of such parties. Douglas W. Harder accepts no responsibility for
damages, if any, suffered by any party as a result of decisions made or actions based on these
course slides for any other purpose than that for which it was intended.