Page 1
Average Case Analysis ofJava 7’s Dual Pivot Quicksort
Sebastian Wild Markus E. Nebel[s_wild, nebel] @cs.uni-kl.de
Computer Science DepartmentUniversity of Kaiserslautern
September 11, 201220th European Symposium on Algorithms
Talk slides with original audio are available on slideshare:http://www.slideshare.net/sebawild/
average-case-analysis-of-java-7s-dual-pivot-quicksort
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 1 / 15
Page 2
Classic Quicksort
Classic Quicksort with Hoare’s Crossing Pointer Technique
2 9 5 4 1 7 8 3 6
. . . by example
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 2 / 15
Page 3
Classic Quicksort
Classic Quicksort with Hoare’s Crossing Pointer Technique
2 9 5 4 1 7 8 3 6
Select one element as pivot.
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 2 / 15
Page 4
Classic Quicksort
Classic Quicksort with Hoare’s Crossing Pointer Technique
2 9 5 4 1 7 8 3 6
Only value relative to pivot counts.
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 2 / 15
Page 5
Classic Quicksort
Classic Quicksort with Hoare’s Crossing Pointer Technique
2 9 5 4 1 7 8 3 6
Left pointer scans until first large element.
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 2 / 15
Page 6
Classic Quicksort
Classic Quicksort with Hoare’s Crossing Pointer Technique
2 9 5 4 1 7 8 3 6
Right pointer scans until first small element.
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 2 / 15
Page 7
Classic Quicksort
Classic Quicksort with Hoare’s Crossing Pointer Technique
2 9 5 4 1 7 8 3 6
Swap out-of-order pair.
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 2 / 15
Page 8
Classic Quicksort
Classic Quicksort with Hoare’s Crossing Pointer Technique
2 3 5 4 1 7 8 9 6
Swap out-of-order pair.
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 2 / 15
Page 9
Classic Quicksort
Classic Quicksort with Hoare’s Crossing Pointer Technique
2 3 5 4 1 7 8 9 6
Left pointer scans until first large element.
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 2 / 15
Page 10
Classic Quicksort
Classic Quicksort with Hoare’s Crossing Pointer Technique
2 3 5 4 1 7 8 9 6
Right pointer scans until first small element.
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 2 / 15
Page 11
Classic Quicksort
Classic Quicksort with Hoare’s Crossing Pointer Technique
2 3 5 4 1 7 8 9 6
The pointers have crossed!
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 2 / 15
Page 12
Classic Quicksort
Classic Quicksort with Hoare’s Crossing Pointer Technique
2 3 5 4 1 7 8 9 6
Swap pivot to final position.
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 2 / 15
Page 13
Classic Quicksort
Classic Quicksort with Hoare’s Crossing Pointer Technique
2 3 5 4 1 6 8 9 7
Partitioning done!
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 2 / 15
Page 14
Classic Quicksort
Classic Quicksort with Hoare’s Crossing Pointer Technique
2 3 5 4 1 6 8 9 7
Recursively sort two sublists.
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 2 / 15
Page 15
Classic Quicksort
Classic Quicksort with Hoare’s Crossing Pointer Technique
1 2 3 4 5 6 7 8 9
Done.
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 2 / 15
Page 16
Dual Pivot Quicksort
“new” idea: use two pivots p < q
3 5 1 8 4 7 2 9 6p q
How to do partitioning?
1 For each element x, determine its class
small for x < p
medium for p < x < q
large for q < x
by comparing x to p and/or q
2 Arrange elements according to classes p q
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 3 / 15
Page 17
Dual Pivot Quicksort
“new” idea: use two pivots p < q
3 5 1 8 4 7 2 9 6p q
How to do partitioning?
1 For each element x, determine its class
small for x < p
medium for p < x < q
large for q < x
by comparing x to p and/or q
2 Arrange elements according to classes p q
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 3 / 15
Page 18
Dual Pivot Quicksort – Previous Work
Robert Sedgewick, 1975in-place dual pivot Quicksort implementationmore comparisons and swaps than classic Quicksort
Pascal Hennequin, 1991comparisons for list-based Quicksort with r pivots
r = 2 same #comparisons as classic Quicksortin one partitioning step: 5
3 comparisons per element
r > 2 very small savings, but complicated partitioning
Using two pivots does not pay.
Vladimir Yaroslavskiy, 2009new implementation of dual pivot Quicksortnow used in Java 7’s runtime libraryruntime studies, no rigorous analysis
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 4 / 15
Page 19
Dual Pivot Quicksort – Previous Work
Robert Sedgewick, 1975in-place dual pivot Quicksort implementationmore comparisons and swaps than classic Quicksort
Pascal Hennequin, 1991comparisons for list-based Quicksort with r pivots
r = 2 same #comparisons as classic Quicksortin one partitioning step: 5
3 comparisons per element
r > 2 very small savings, but complicated partitioning
Using two pivots does not pay.
Vladimir Yaroslavskiy, 2009new implementation of dual pivot Quicksortnow used in Java 7’s runtime libraryruntime studies, no rigorous analysis
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 4 / 15
Page 20
Dual Pivot Quicksort – Previous Work
Robert Sedgewick, 1975in-place dual pivot Quicksort implementationmore comparisons and swaps than classic Quicksort
Pascal Hennequin, 1991comparisons for list-based Quicksort with r pivots
r = 2 same #comparisons as classic Quicksortin one partitioning step: 5
3 comparisons per element
r > 2 very small savings, but complicated partitioning
Using two pivots does not pay.
Vladimir Yaroslavskiy, 2009new implementation of dual pivot Quicksortnow used in Java 7’s runtime libraryruntime studies, no rigorous analysis
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 4 / 15
Page 21
Dual Pivot Quicksort – Comparison Costs
How many comparisons to determine classes ( small , medium or large ) ?
Assume, we first compare with p. small elements need 1, others 2 comparisons
on average: 13 of all elements are small
13 · 1+ 2
3 · 2 = 53 comparisons per element
if inputs are uniform random permutations,classes of x and y are independent
Any partitioning method needs at least53(n- 2) s 20
12n comparisons on average?
No! (Stay tuned . . . )
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 5 / 15
Page 22
Dual Pivot Quicksort – Comparison Costs
How many comparisons to determine classes ( small , medium or large ) ?
Assume, we first compare with p. small elements need 1, others 2 comparisons
on average: 13 of all elements are small
13 · 1+ 2
3 · 2 = 53 comparisons per element
if inputs are uniform random permutations,classes of x and y are independent
Any partitioning method needs at least53(n- 2) s 20
12n comparisons on average?
No! (Stay tuned . . . )
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 5 / 15
Page 23
Beating the “Lower Bound”
s 2012n comparisons only needed,
if there is one comparison location,then checks for x and y independent
But: Can have several comparison locations!Here: Assume two locations C1 and C2 s. t.
C1 first compares with p.C2 first compares with q.
C1 executed often, iff p is large.C2 executed often, iff q is small.
C1 executed ofteniff many small elementsiff good chance that C1 needs only one comparison(C2 similar)
less comparisons than 53 per elements on average
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 6 / 15
Page 24
Yaroslavskiy’s Quicksort – Example
Yaroslavskiy’s Dual Pivot Quicksort(used in Oracle’s Java 7 Arrays.sort(int[]))
p q
3 5 1 8 4 7 2 9 6
Select two elements as pivots.
Invariant: < p
`
!> q
g
p 6 � 6 q
k
!?
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 7 / 15
Page 25
Yaroslavskiy’s Quicksort – Example
Yaroslavskiy’s Dual Pivot Quicksort(used in Oracle’s Java 7 Arrays.sort(int[]))
p q
3 5 1 8 4 7 2 9 6
Only value relative to pivot counts.
Invariant: < p
`
!> q
g
p 6 � 6 q
k
!?
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 7 / 15
Page 26
Yaroslavskiy’s Quicksort – Example
Yaroslavskiy’s Dual Pivot Quicksort(used in Oracle’s Java 7 Arrays.sort(int[]))
3 5 1 8 4 7 2 9 6
k
A[k] is medium go on
Invariant: < p
`
!> q
g
p 6 � 6 q
k
!?
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 7 / 15
Page 27
Yaroslavskiy’s Quicksort – Example
Yaroslavskiy’s Dual Pivot Quicksort(used in Oracle’s Java 7 Arrays.sort(int[]))
3 5 1 8 4 7 2 9 6
` k
A[k] is small Swap to left
Invariant: < p
`
!> q
g
p 6 � 6 q
k
!?
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 7 / 15
Page 28
Yaroslavskiy’s Quicksort – Example
Yaroslavskiy’s Dual Pivot Quicksort(used in Oracle’s Java 7 Arrays.sort(int[]))
3 5 1 8 4 7 2 9 6
` k
Swap small element to left end.
Invariant: < p
`
!> q
g
p 6 � 6 q
k
!?
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 7 / 15
Page 29
Yaroslavskiy’s Quicksort – Example
Yaroslavskiy’s Dual Pivot Quicksort(used in Oracle’s Java 7 Arrays.sort(int[]))
3 1 5 8 4 7 2 9 6
` k
Swap small element to left end.
Invariant: < p
`
!> q
g
p 6 � 6 q
k
!?
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 7 / 15
Page 30
Yaroslavskiy’s Quicksort – Example
Yaroslavskiy’s Dual Pivot Quicksort(used in Oracle’s Java 7 Arrays.sort(int[]))
3 1 5 8 4 7 2 9 6
` k
A[k] is large Find swap partner.
Invariant: < p
`
!> q
g
p 6 � 6 q
k
!?
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 7 / 15
Page 31
Yaroslavskiy’s Quicksort – Example
Yaroslavskiy’s Dual Pivot Quicksort(used in Oracle’s Java 7 Arrays.sort(int[]))
3 1 5 8 4 7 2 9 6
g` k
A[k] is large Find swap partner:g skips over large elements.
Invariant: < p
`
!> q
g
p 6 � 6 q
k
!?
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 7 / 15
Page 32
Yaroslavskiy’s Quicksort – Example
Yaroslavskiy’s Dual Pivot Quicksort(used in Oracle’s Java 7 Arrays.sort(int[]))
3 1 5 8 4 7 2 9 6
g` k
A[k] is large Swap
Invariant: < p
`
!> q
g
p 6 � 6 q
k
!?
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 7 / 15
Page 33
Yaroslavskiy’s Quicksort – Example
Yaroslavskiy’s Dual Pivot Quicksort(used in Oracle’s Java 7 Arrays.sort(int[]))
3 1 5 2 4 7 8 9 6
g` k
A[k] is large Swap
Invariant: < p
`
!> q
g
p 6 � 6 q
k
!?
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 7 / 15
Page 34
Yaroslavskiy’s Quicksort – Example
Yaroslavskiy’s Dual Pivot Quicksort(used in Oracle’s Java 7 Arrays.sort(int[]))
3 1 5 2 4 7 8 9 6
g` k
A[k] is old A[g], small Swap to left
Invariant: < p
`
!> q
g
p 6 � 6 q
k
!?
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 7 / 15
Page 35
Yaroslavskiy’s Quicksort – Example
Yaroslavskiy’s Dual Pivot Quicksort(used in Oracle’s Java 7 Arrays.sort(int[]))
3 1 2 5 4 7 8 9 6
g` k
A[k] is old A[g], small Swap to left
Invariant: < p
`
!> q
g
p 6 � 6 q
k
!?
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 7 / 15
Page 36
Yaroslavskiy’s Quicksort – Example
Yaroslavskiy’s Dual Pivot Quicksort(used in Oracle’s Java 7 Arrays.sort(int[]))
3 1 2 5 4 7 8 9 6
g` k
A[k] is medium go on
Invariant: < p
`
!> q
g
p 6 � 6 q
k
!?
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 7 / 15
Page 37
Yaroslavskiy’s Quicksort – Example
Yaroslavskiy’s Dual Pivot Quicksort(used in Oracle’s Java 7 Arrays.sort(int[]))
3 1 2 5 4 7 8 9 6
g` k
A[k] is large Find swap partner.
Invariant: < p
`
!> q
g
p 6 � 6 q
k
!?
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 7 / 15
Page 38
Yaroslavskiy’s Quicksort – Example
Yaroslavskiy’s Dual Pivot Quicksort(used in Oracle’s Java 7 Arrays.sort(int[]))
3 1 2 5 4 7 8 9 6
g` k
A[k] is large Find swap partner:g skips over large elements.
Invariant: < p
`
!> q
g
p 6 � 6 q
k
!?
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 7 / 15
Page 39
Yaroslavskiy’s Quicksort – Example
Yaroslavskiy’s Dual Pivot Quicksort(used in Oracle’s Java 7 Arrays.sort(int[]))
3 1 2 5 4 7 8 9 6
g` k
g and k have crossed!Swap pivots in place
Invariant: < p
`
!> q
g
p 6 � 6 q
k
!?
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 7 / 15
Page 40
Yaroslavskiy’s Quicksort – Example
Yaroslavskiy’s Dual Pivot Quicksort(used in Oracle’s Java 7 Arrays.sort(int[]))
2 1 3 5 4 6 8 9 7
g` k
g and k have crossed!Swap pivots in place
Invariant: < p
`
!> q
g
p 6 � 6 q
k
!?
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 7 / 15
Page 41
Yaroslavskiy’s Quicksort – Example
Yaroslavskiy’s Dual Pivot Quicksort(used in Oracle’s Java 7 Arrays.sort(int[]))
2 1 3 5 4 6 8 9 7
Partitioning done!
Invariant: < p
`
!> q
g
p 6 � 6 q
k
!?
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 7 / 15
Page 42
Yaroslavskiy’s Quicksort – Example
Yaroslavskiy’s Dual Pivot Quicksort(used in Oracle’s Java 7 Arrays.sort(int[]))
2 1 3 5 4 6 8 9 7
Recursively sort three sublists.
Invariant: < p
`
!> q
g
p 6 � 6 q
k
!?
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 7 / 15
Page 43
Yaroslavskiy’s Quicksort – Example
Yaroslavskiy’s Dual Pivot Quicksort(used in Oracle’s Java 7 Arrays.sort(int[]))
1 2 3 4 5 6 7 8 9
Done.
Invariant: < p
`
!> q
g
p 6 � 6 q
k
!?
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 7 / 15
Page 44
Yaroslavskiy’s QuicksortDUALPIVOTQUICKSORTYAROSLAVSKIY(A, left, right)
1 if right - left > 12 p := A[left]; q := A[right]3 if p > q then Swap p and q end if4 ` := left + 1; g := right - 1; k := `5 while k 6 g6 if A[k] < p7 Swap A[k] and A[`] ; ` := `+ 18 else if A[k] > q9 while A[g] > q and k < g do g := g- 1 end while
10 Swap A[k] and A[g] ; g := g- 111 if A[k] < p12 Swap A[k] and A[`] ; ` := `+ 113 end if14 end if15 k := k+ 116 end while17 ` := `- 1; g := g+ 118 Swap A[left] and A[`] ; Swap A[right] and A[g]19 DUALPIVOTQUICKSORTYAROSLAVSKIY(A, left , `- 1)20 DUALPIVOTQUICKSORTYAROSLAVSKIY(A, `+ 1,g- 1)21 DUALPIVOTQUICKSORTYAROSLAVSKIY(A,g+ 1, right )22 end if
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 8 / 15
Page 45
Yaroslavskiy’s QuicksortDUALPIVOTQUICKSORTYAROSLAVSKIY(A, left, right)
1 if right - left > 12 p := A[left]; q := A[right]3 if p > q then Swap p and q end if4 ` := left + 1; g := right - 1; k := `5 while k 6 g6 Ck if A[k] < p7 Swap A[k] and A[`] ; ` := `+ 18 elseC0
k if A[k] > q9 Cg while A[g] > q and k < g do g := g- 1 end while
10 Swap A[k] and A[g] ; g := g- 111 C0
g if A[k] < p12 Swap A[k] and A[`] ; ` := `+ 113 end if14 end if15 k := k+ 116 end while17 ` := `- 1; g := g+ 118 Swap A[left] and A[`] ; Swap A[right] and A[g]19 DUALPIVOTQUICKSORTYAROSLAVSKIY(A, left , `- 1)20 DUALPIVOTQUICKSORTYAROSLAVSKIY(A, `+ 1,g- 1)21 DUALPIVOTQUICKSORTYAROSLAVSKIY(A,g+ 1, right )22 end if
2 comparison locations
Ck handles pointer kCg handles pointer g
Ck first checks < p
C
0k if needed > q
Cg first checks > q
C
0g if needed < p
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 8 / 15
Page 46
Analysis of Yaroslavskiy’s Algorithm
In this talk:only number of comparisons (swaps similar)only leading term asymptotics
9=
;all exact results
in the papersome marginal cases excluded
Cn expected #comparisons to sort random permutation of {1, . . . , n}
Cn satisfies recurrence relation
Cn = cn + 2n(n-1)
X
16p<q6n
�Cp-1 + Cq-p-1 + Cn-q
�,
with cn expected #comparisons in first partitioning step
recurrence solvable by standard methods
linear cn s a · n yields Cn s 65a · n lnn.
need to compute cn
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 9 / 15
Page 47
Analysis of Yaroslavskiy’s Algorithm
first comparison for all elements (at Ck or Cg ) s n comparisons
second comparison for some elements at C0k resp. C0
g
. . . but how often are C
0k resp. C
0g reached?
C
0k : all non- small elements reached by pointer k.
C
0g : all non- large elements reached by pointer g.
second comparison for medium elements not avoidable s 1
3n comparisons in expectation
it remains to count:large elements reached by k andsmall elements reached by g.
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 10 / 15
Page 48
Analysis of Yaroslavskiy’s Algorithm
Second comparisons for small and large elements?Depends on location!
C
0k l@K: number of large elements at positions K.
C
0g s@G: number of small elements at positions G.
Recall invariant: < p
`
!> q
g
p 6 � 6 q
k
!?
k and g cross at (rank of) q
p q
positions K = {2, . . . , q- 1} G = {q, . . . , n- 1}
l@K = 3 s@G = 2
for given p and q, l@K hypergeometrically distributed E [l@K |p, q] = (n- q)q-2
n-2
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 11 / 15
Page 49
Analysis of Yaroslavskiy’s Algorithm
law of total expectation:
E [l@K] =X
16p<q6n
Pr[pivots (p, q)] · (n- q)q-2n-2 s 1
6n
Similarly: E [s@G] s 112n.
Summing up contributions:
cn s n first comparisons
+ 13n medium elements
+ 16n large elements at C
0k
+ 112n small elements at C
0g
= 1912 n
Recall: “lower bound” was 2012n.
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 12 / 15
Page 50
Results
Comparisons:Yaroslavskiy needs s 6
5 ·1912 n lnn = 1.9n lnn on average.
Classic Quicksort needs s 2n lnn comparisons!
Swaps:s 0.6n lnn swaps for Yaroslavskiy’s algorithm vs.
s 0.3n lnn swaps for classic Quicksort
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 13 / 15
Page 51
Summary
We can exploit asymmetries to save comparisons!Many extra swaps might hurt.However, runtime studies favor dual pivot Quicksort:more than 10% faster!
0 0.5 1 1.5 2
·106
7
7.5
8
n
time
10-6·n
lnn
Classic QuicksortYaroslavskiy
Normalized Java runtimes (in ms).Average and standard deviationof 1000 random permutationsper size.
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 14 / 15
Page 52
Open Questions
Closer look at runtime: Why is Yaroslavskiy so fast in practice?
experimental studies?
Input distributions other than random permutations
equal elementspresorted lists
Variances of Costs, Limiting Distributions?
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 15 / 15
Page 53
Lower Bound on Comparisons
How clever can dual pivot paritioning be?
For lower bound, assume
random permutation modelpivots are selected uniformlyan oracle tells us, whether more small or more large elements occur
1 comparison for frequent extreme elements2 comparisons for middle and rare extreme elements
(n- 2) + 2n(n-1)
X
16p<q6n
�(q- p- 1) + min{p- 1, n- q}
�
s 32n = 18
12n
Even with unrealistic oracle, not much better than Yaroslavskiy
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 16 / 15
Page 54
Counting Primitive Instructions à la Knuth
for implementations MMIX and Java bytecodedetermine exact expected overall costs
MMIX: processor cycles “oops” � and memory accesses “mems” µ
Bytecode: #executed instructions
divide program code into basic blocks
count cost contribution for blocks
determine expected execution frequencies of blocks
in first partitioning step total frequency via recurrence relation
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 17 / 15
Page 55
Counting Primitive Instructions à la Knuth
Results:
Algorithm total expected costs
MMIX Classic (11�+2.6µ)(n+1)Hn+(11�+3.7µ)n+(-11.5�-4.5µ)
MMIX Yaroslavskiy(13.1�+2.8µ)(n+ 1)Hn + (-1.695�+ 1.24µ)n
+ (-1.6783�- 1.793µ)
Bytecode Classic 18(n+ 1)Hn + 2n- 15
BytecodeYaroslavskiy
23.8(n+ 1)Hn - 8.71n- 4.743
Classic Quicksort significantly better in both measures . . .Why is Yaroslavskiy faster in practice?
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 18 / 15
Page 56
Pivot Sampling
Idea: choose pivots from random sample of list
median for classic Quicksort
tertiles for dual pivot Quicksort
or asymmetric order statistics?
Here: sample of constant size k
choose pivots, such that t1 elements < p,t2 elements between p and q,t3 = k- 2- t1 - t2 larger > q
Allows to “push” pivot towards desired order statistic of list
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 19 / 15
Page 57
Pivot Sampling
Idea: choose pivots from random sample of list
median for classic Quicksort
tertiles for dual pivot Quicksort?
or asymmetric order statistics?
Here: sample of constant size k
choose pivots, such that t1 elements < p,t2 elements between p and q,t3 = k- 2- t1 - t2 larger > q
Allows to “push” pivot towards desired order statistic of list
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 19 / 15
Page 58
Pivot Sampling
leading n lnn term coefficient ofComparisons for k = 11
tertiles(t1, t2, t3) = (3, 3, 3)s 1.609n lnnminimum(t1, t2, t3) = (4, 2, 3)s 1.585n lnn
asymmetric orderstatistics are better!
Sebastian Wild Java 7’s Dual Pivot Quicksort 2012/09/11 20 / 15