Skip to content

Instantly share code, notes, and snippets.

@pyrocat101
Last active December 28, 2015 15:19
Show Gist options
  • Save pyrocat101/7521440 to your computer and use it in GitHub Desktop.
Save pyrocat101/7521440 to your computer and use it in GitHub Desktop.
Binary Search on Rotated Array
# non-recursive version
def rot_bsearch(xs, val, lo=0, hi=None):
"""
Binary Search on rotated sorted array.
>>> rot_bsearch([8,1,2,3,4,5], 5)
5
>>> rot_bsearch([], 42)
-1
>>> rot_bsearch([1], -1)
-1
>>> rot_bsearch([42], 42)
0
"""
if hi is None: hi = len(xs)
while lo < hi:
mid = lo + (hi - lo) / 2
if xs[mid] == val:
return mid
elif xs[mid] >= xs[lo]:
# A is sorted
if xs[lo] <= val < xs[mid]:
hi = mid
else:
lo = mid + 1
else:
# B is sorted
if xs[mid] < val <= xs[hi - 1]:
lo = mid + 1
else:
hi = mid
return -1
# recursive version
def rot_bsearch_recur(xs, val, lo=0, hi=None):
"""
Binary Search on rotated sorted array.
>>> rot_bsearch_recur([8,1,2,3,4,5], 5)
5
>>> rot_bsearch_recur([], 42)
-1
>>> rot_bsearch_recur([1], -1)
-1
>>> rot_bsearch_recur([42], 42)
0
"""
if hi is None: hi = len(xs)
if lo >= hi: return -1
mid = lo + (hi - lo) / 2
if xs[mid] == val:
return mid
elif xs[mid] >= xs[lo]:
# A is sorted
if xs[lo] <= val < xs[mid]:
return rot_bsearch_recur(xs, val, lo, mid)
else:
return rot_bsearch_recur(xs, val, mid + 1, hi)
else:
# B is sorted
if xs[mid] < val <= xs[hi - 1]:
return rot_bsearch_recur(xs, val, mid + 1, hi)
else:
return rot_bsearch_recur(xs, val, lo, mid - 1)
if __name__ == '__main__':
import doctest
doctest.testmod()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment