@@ -164,6 +164,10 @@ same thing as `partialsort!` but leaving `v` unmodified.
164
164
partialsort (v:: AbstractVector , k:: Union{Integer,OrdinalRange} ; kws... ) =
165
165
partialsort! (copymutable (v), k; kws... )
166
166
167
+ # This implementation of `midpoint` is performance-optimized but safe
168
+ # only if `lo <= hi`.
169
+ midpoint (lo:: T , hi:: T ) where T<: Integer = lo + ((hi - lo) >>> 0x01 )
170
+ midpoint (lo:: Integer , hi:: Integer ) = midpoint (promote (lo, hi)... )
167
171
168
172
# reference on sorted binary search:
169
173
# http://www.tbray.org/ongoing/When/200x/2003/03/22/Binary
@@ -175,7 +179,7 @@ function searchsortedfirst(v::AbstractVector, x, lo::T, hi::T, o::Ordering) wher
175
179
lo = lo - u
176
180
hi = hi + u
177
181
@inbounds while lo < hi - u
178
- m = (lo + hi) >>> 1
182
+ m = midpoint (lo, hi)
179
183
if lt (o, v[m], x)
180
184
lo = m
181
185
else
@@ -192,7 +196,7 @@ function searchsortedlast(v::AbstractVector, x, lo::T, hi::T, o::Ordering) where
192
196
lo = lo - u
193
197
hi = hi + u
194
198
@inbounds while lo < hi - u
195
- m = (lo + hi) >>> 1
199
+ m = midpoint (lo, hi)
196
200
if lt (o, x, v[m])
197
201
hi = m
198
202
else
@@ -210,7 +214,7 @@ function searchsorted(v::AbstractVector, x, ilo::T, ihi::T, o::Ordering) where T
210
214
lo = ilo - u
211
215
hi = ihi + u
212
216
@inbounds while lo < hi - u
213
- m = (lo + hi) >>> 1
217
+ m = midpoint (lo, hi)
214
218
if lt (o, v[m], x)
215
219
lo = m
216
220
elseif lt (o, x, v[m])
487
491
488
492
@inline function selectpivot! (v:: AbstractVector , lo:: Integer , hi:: Integer , o:: Ordering )
489
493
@inbounds begin
490
- mi = (lo+ hi)>>> 1
494
+ mi = midpoint (lo, hi)
491
495
492
496
# sort v[mi] <= v[lo] <= v[hi] such that the pivot is immediately in place
493
497
if lt (o, v[lo], v[mi])
@@ -552,7 +556,7 @@ function sort!(v::AbstractVector, lo::Integer, hi::Integer, a::MergeSortAlg, o::
552
556
@inbounds if lo < hi
553
557
hi- lo <= SMALL_THRESHOLD && return sort! (v, lo, hi, SMALL_ALGORITHM, o)
554
558
555
- m = (lo+ hi)>>> 1
559
+ m = midpoint (lo, hi)
556
560
(length (t) < m- lo+ 1 ) && resize! (t, m- lo+ 1 )
557
561
558
562
sort! (v, lo, m, a, o, t)
0 commit comments