def binarySearch(arr, low, high, item):
if high < low:
return -1
mid = int(low + (high - low) / 2) # Overflow Safe version of (low + high) / 2
if item == arr[mid]:
return mid
if item > arr[mid]:
return binarySearch(arr, (mid + 1), high, item)
return binarySearch(arr, low, (mid - 1), item)
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
arr
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
binarySearch(arr, 0, len(arr), 3)
2
With unknown pivot point
def binSearch(arr, low, high, item):
if high < low:
return -1
mid = int(low + (high - low) / 2)
if item == arr[mid]:
return mid
# if first half is sorted
if arr[low] <= arr[mid]:
# check if the element might lie within
if item >= arr[low] and item <= arr[mid]:
return binSearch(arr, low, mid - 1, item)
return binSearch(arr, mid + 1, high, item)
# else second half must be sorted, check if item might lie within
if item >= arr[mid] and item <= arr[high]:
return binSearch(arr, mid + 1, high, item)
return binSearch(arr, low, mid - 1, item)
arr = [4, 5, 6, 7, 8, 9, 10, 1, 2, 3]
arr
[4, 5, 6, 7, 8, 9, 10, 1, 2, 3]
binSearch(arr, 0, len(arr) - 1, 3)
9