Why Binary Search and What Sorted Order Gives You in DSA Python - Performance Analysis
We want to understand why searching in a sorted list is faster with binary search.
How does sorting help us find items quicker than checking one by one?
Analyze the time complexity of the following binary search code.
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
This code searches for a target value in a sorted list by repeatedly dividing the search range in half.
Look at what repeats as the code runs.
- Primary operation: Checking the middle element of the current search range.
- How many times: The search range halves each time, so the number of checks grows slowly as the list grows.
Each step cuts the search area in half, so the number of steps grows very slowly compared to the list size.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 4 checks |
| 100 | About 7 checks |
| 1000 | About 10 checks |
Pattern observation: Doubling the list size adds only one extra check.
Time Complexity: O(log n)
This means the number of steps grows slowly, making binary search very fast for large sorted lists.
[X] Wrong: "Binary search works on any list, sorted or not."
[OK] Correct: Without sorting, the middle element tells us nothing about where the target might be, so binary search won't work correctly.
Knowing why binary search is fast and requires sorted data helps you explain your choices clearly and shows you understand efficient searching.
"What if the list was not sorted but we still used binary search? How would the time complexity and correctness change?"
Practice
Solution
Step 1: Understand binary search method
Binary search works by repeatedly dividing the list into halves and deciding which half to search next based on order.Step 2: Importance of sorted order
If the list is not sorted, we cannot decide which half to discard, so binary search fails.Final Answer:
Because it divides the search space based on order to find elements quickly -> Option AQuick Check:
Binary search needs sorted list = Because it divides the search space based on order to find elements quickly [OK]
- Thinking binary search works on unsorted lists
- Confusing binary search with linear search
- Believing binary search guesses randomly
bisect module on a sorted list arr to find position of x?Solution
Step 1: Recall bisect module functions
The bisect module providesbisect_leftto find insertion position forxin sortedarr.Step 2: Check options for correct function
Onlybisect_leftis valid; others likesearch,find,indexdo not exist in bisect.Final Answer:
pos = bisect.bisect_left(arr, x) -> Option CQuick Check:
bisect_left finds position = pos = bisect.bisect_left(arr, x) [OK]
- Using non-existent bisect functions
- Confusing bisect with list methods
- Trying to use bisect on unsorted lists
arr = [2, 4, 6, 8, 10]
left, right = 0, len(arr) - 1
x = 6
while left <= right:
mid = (left + right) // 2
if arr[mid] == x:
print(mid)
break
elif arr[mid] < x:
left = mid + 1
else:
right = mid - 1
else:
print(-1)Solution
Step 1: Trace binary search steps
Initial left=0, right=4, mid=2 (value 6). Since arr[mid] == x, print mid=2 and break.Step 2: Confirm output
The loop breaks after printing 2, so output is 2.Final Answer:
2 -> Option AQuick Check:
Index of 6 in arr is 2 [OK]
- Miscomputing mid index
- Confusing index with value
- Forgetting to break loop on find
nums to find target. What is the error?def binary_search(nums, target):
left, right = 0, len(nums)
while left <= right:
mid = (left + right) // 2
if nums[mid] == target:
return mid
elif nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1Solution
Step 1: Check initialization of right pointer
right is set to len(nums), which is out of index range since list indices go from 0 to len(nums)-1.Step 2: Correct right initialization
right should be len(nums) - 1 to avoid index error when accessing nums[mid].Final Answer:
right should be initialized as len(nums) - 1 -> Option BQuick Check:
Index max = len(nums)-1 [OK]
- Setting right to length causes index error
- Changing left start incorrectly
- Wrong mid calculation formula
books = [101, 203, 305, 407, 509]. You want to find the position to insert a new book ID 400 so the list remains sorted. Which approach correctly finds the insertion index using binary search logic?Solution
Step 1: Understand binary search insertion logic
Binary search narrows down where to insert by comparing middle element with target and adjusting pointers.Step 2: Apply logic to find insertion index
When left pointer passes right, left is the correct insertion index to keep list sorted.Final Answer:
Check middle element; if less than 400, move right pointer; else move left pointer until left > right, then insert at left -> Option DQuick Check:
Binary search insertion index = Check middle element; if less than 400, move right pointer; else move left pointer until left > right, then insert at left [OK]
- Inserting at wrong fixed position
- Using linear search instead of binary
- Not updating pointers correctly
Ready to prove it?
Pass the test and this pattern moves unknown
