Lesson 24 / 42
Binary Search
Halve a sorted range each step to find a target in O(log n).
Discard half every step
On a sorted array, compare the target to the middle element. If the target is larger, the whole left half (including mid) is irrelevant — move left past it. Otherwise drop the right half. Each step halves the search space: O(log n).
Iterative template
Use left <= right and mid = left + (right-left)//2 to avoid overflow in other languages.
def binary_search(arr, target):
lo, hi = 0, len(arr) - 1
while lo <= hi:
mid = lo + (hi - lo) // 2
if arr[mid] == target:
return mid
if arr[mid] < target:
lo = mid + 1 # target in right half
else:
hi = mid - 1 # target in left half
return -1
Output:
binary_search([10,20,30,40,50,60,70,80], 60) -> 5
Dry run: find 60
[10 20 30 40 50 60 70 80]
- Step 1: lo=0 hi=7 mid=3 → arr[3]=40 < 60 → lo=4
- Step 2: lo=4 hi=7 mid=5 → arr[5]=60 → found at index 5
Quick check: Binary search requires the data to be...
- Sorted (or monotonic on the predicate)
- Stored in a hash map
- Of prime length
Answer
Sorted (or monotonic on the predicate) — Discarding half only works if one side is guaranteed to not contain the target — that needs order.