Skip to content
Prev Previous commit
Implement reverse bisect in Python
  • Loading branch information
Rémi Lapeyre
Rémi Lapeyre committed Jun 8, 2019
commit 6bfe7bce87531cddfdc83542821555de0bb61b2e
36 changes: 36 additions & 0 deletions Lib/bisect.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,15 @@ def bisect_right(a, x, lo=0, hi=None, *, key=None, reverse=False):
hi = len(a)

if key is None:
if reverse:
while lo < hi:
mid = (lo+hi)//2
if x > a[mid]:
hi = mid
else:
lo = mid+1
return lo

while lo < hi:
mid = (lo+hi)//2
if x < a[mid]:
Expand All @@ -45,6 +54,15 @@ def bisect_right(a, x, lo=0, hi=None, *, key=None, reverse=False):

x_value = key(x)

if reverse:
while lo < hi:
mid = (lo+hi)//2
if x_value > key(a[mid]):
hi = mid
else:
lo = mid+1
return lo

while lo < hi:
mid = (lo+hi)//2
if x_value < key(a[mid]):
Expand Down Expand Up @@ -89,6 +107,15 @@ def bisect_left(a, x, lo=0, hi=None, *, key=None, reverse=False):
hi = len(a)

if key is None:
if reverse:
while lo < hi:
mid = (lo+hi)//2
if a[mid] > x:
lo = mid+1
else:
hi = mid
return lo

while lo < hi:
mid = (lo+hi)//2
if a[mid] < x:
Expand All @@ -99,6 +126,15 @@ def bisect_left(a, x, lo=0, hi=None, *, key=None, reverse=False):

x_value = key(x)

if reverse:
while lo < hi:
mid = (lo+hi)//2
if key(a[mid]) > x_value:
lo = mid+1
else:
hi = mid
return lo

while lo < hi:
mid = (lo+hi)//2
if key(a[mid]) < x_value:
Expand Down