Binary search is faster than linear search—everyone knows that. But faster doesn't always mean better. Sometimes linear search is the right choice.
Understanding when to use each requires more than knowing Big-O notation. You need to consider: data structure, search frequency, implementation complexity, and practical performance on real hardware.
This guide provides a complete comparison, decision criteria, the breakeven point, and real-world examples to help you choose correctly every time.
TL;DR
Use binary search when:
- Data is sorted (or you can sort it)
- Multiple searches on same data
- Large dataset (n > 100)
- O(log n) matters for your use case
Use linear search when:
- Data is unsorted and can't be sorted
- Single search operation
- Small dataset (n < 20)
- Simplicity matters more than speed
Breakeven point: ~10-20 elements (depends on constants)
Quick Comparison Table
| Aspect | Linear Search | Binary Search |
|---|---|---|
| Time (search) | O(n) | O(log n) |
| Time (preprocess) | O(1) | O(n log n) if sorting |
| Space | O(1) | O(1) iterative, O(log n) recursive |
| Requirement | None | Sorted data |
| Implementation | Simple | Moderate (easy to bug) |
| Best for | Small/unsorted data, single search | Large sorted data, multiple searches |
Linear Search Explained
How It Works
Check every element sequentially until you find the target or reach the end.
def linear_search(arr, target):
for i in range(len(arr)):
if arr[i] == target:
return i
return -1
# Time: O(n)
# Space: O(1)Time and Space Complexity
Time:
- Best case: O(1) — target is first element
- Average case: O(n/2) = O(n) — target in middle
- Worst case: O(n) — target is last or not found
Space: O(1) — only uses index variable
When to Use
✅ Use linear search when:
- Data is unsorted and you can't sort it
- Single search (sorting would cost more than linear search)
- Small dataset (n < 20, linear is faster due to lower constants)
- Simplicity matters (less code, fewer bugs)
- Data changes frequently (sorting after each change is expensive)
Binary Search Explained
How It Works
Repeatedly divide search space in half by comparing with middle element.
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = left + (right - left) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
# Time: O(log n)
# Space: O(1)Time and Space Complexity
Time:
- Best case: O(1) — target is middle element
- Average case: O(log n)
- Worst case: O(log n)
Space:
- Iterative: O(1)
- Recursive: O(log n) — call stack
With sorting:
- Total: O(n log n) + O(log n) = O(n log n)
When to Use
✅ Use binary search when:
- Data is sorted (or you can sort it once)
- Multiple searches (amortize sorting cost)
- Large dataset (n > 100, log n << n)
- Need O(log n) for performance requirements
- Data is static (doesn't change frequently)
The Breakeven Point
Small Arrays (n < 10)
Linear search wins due to lower constant factors.
Example:
Array size: 5
Linear search: ~5 comparisons
Binary search: ~3 comparisons + overhead
Overhead (bounds checking, mid calculation) makes binary search slowerMedium Arrays (10 < n < 1000)
Binary search starts winning if data is sorted.
Example:
Array size: 100
Linear search: ~50 comparisons (average)
Binary search: ~7 comparisons
Binary search is ~7× fasterLarge Arrays (n > 1000)
Binary search dominates if data is sorted.
Example:
Array size: 1,000,000
Linear search: ~500,000 comparisons (average)
Binary search: ~20 comparisons
Binary search is ~25,000× fasterWith Sorting Cost
If you need to sort first:
Single search:
Linear: O(n)
Binary: O(n log n) + O(log n) = O(n log n)
→ Linear wins!
Multiple searches (k searches):
Linear: O(k × n)
Binary: O(n log n) + O(k × log n)
→ Binary wins when k × n > n log n
→ Binary wins when k > log nBreakeven: When number of searches > log(n)
When Linear Search Is Better
Scenario 1: Unsorted Data, Single Search
# Find user by name in unsorted list
users = [{"name": "Alice"}, {"name": "Bob"}, ...]
# Linear search: O(n)
for user in users:
if user["name"] == "Charlie":
return user
# Binary search would require:
# 1. Sort: O(n log n)
# 2. Search: O(log n)
# Total: O(n log n) >> O(n)
# → Linear wins!Scenario 2: Small Datasets
# Check if number is in small list
favorites = [7, 3, 9, 2, 5]
# Linear search: ~3 comparisons (average)
# Binary search: ~2 comparisons + overhead
# → Linear is simpler and just as fastScenario 3: Simplicity Matters
# Quick script, one-time use
data = load_data()
if target in data: # Linear search (Python 'in' operator)
process(target)
# Binary search would require:
# - Sorting
# - Implementing binary search
# - More code, more bugs
# → Linear wins for simplicityScenario 4: Frequently Changing Data
# Data changes after every search
data = [...]
for query in queries:
result = linear_search(data, query)
data.append(new_item) # Data changes
# Binary search would require re-sorting after each change
# → Linear wins!When Binary Search Is Better
Scenario 1: Large Sorted Data, Multiple Searches
# Dictionary with 1 million words (sorted)
words = load_sorted_words() # 1,000,000 words
# Check 1000 words
for word in user_words:
if binary_search(words, word) != -1:
mark_correct(word)
# Linear: 1000 × 500,000 = 500,000,000 comparisons
# Binary: 1000 × 20 = 20,000 comparisons
# → Binary is 25,000× faster!Scenario 2: Database Indexing
Database with 10 million records
Index on 'user_id' (sorted)
Query: SELECT * FROM users WHERE user_id = 12345
Linear scan: ~5 million comparisons
Binary search (B-tree index): ~24 comparisons
→ Binary search enables fast database queriesScenario 3: Autocomplete Systems
# Autocomplete with 100,000 suggestions (sorted)
suggestions = load_sorted_suggestions()
# User types each character
for prefix in ["a", "ap", "app", "appl", "apple"]:
results = binary_search_prefix(suggestions, prefix)
display(results)
# Binary search finds prefix range in O(log n)
# Linear would be too slow for real-time autocompleteReal-World Examples
Example 1: Game Development (Collision Detection)
# Check if bullet hit any enemy
# Approach 1: Linear search
for enemy in enemies: # ~100 enemies
if bullet.collides(enemy):
enemy.take_damage()
# Approach 2: Binary search (if enemies sorted by x-coordinate)
# Only useful if many bullets and enemies are spatially sorted
# Verdict: Linear search
# Reason: Small n (~100), unsorted, simplicity mattersExample 2: Autocomplete
# Autocomplete with 1 million words
# Approach 1: Linear search
# O(n) per keystroke → too slow
# Approach 2: Binary search on sorted words
# O(log n) per keystroke → fast enough
# Verdict: Binary search
# Reason: Large n, sorted, multiple searchesExample 3: Finding Config Value
# Find setting in config file (10 settings)
# Approach 1: Linear search
for setting in config:
if setting.key == "theme":
return setting.value
# Approach 2: Binary search
# Requires sorting config by key
# Verdict: Linear search
# Reason: Small n, simplicity, one-time lookupCommon Misconceptions
Misconception 1: "Binary search is always faster"
False. For small arrays or single searches on unsorted data, linear search is faster (including sorting cost).
Misconception 2: "Linear search is O(n), so it's bad"
False. O(n) is fine for small n or when you can't avoid it (unsorted data, single search).
Misconception 3: "Binary search is hard to implement"
Partially true. Iterative binary search is moderate difficulty. But off-by-one errors are common.
Misconception 4: "Always use binary search in interviews"
False. Use the right tool. If data is unsorted and you need original indices, use hash map or linear search.
Decision Framework
Question 1: Is data sorted?
├─ Yes → Continue to Question 2
└─ No → Can you sort it?
├─ Yes → Continue to Question 2
└─ No → Linear Search ✓
Question 2: How many searches?
├─ Single search → Linear Search ✓ (if small n)
└─ Multiple searches → Continue to Question 3
Question 3: How large is the dataset?
├─ Small (n < 20) → Linear Search ✓
├─ Medium (20 < n < 1000) → Binary Search ✓ (if sorted)
└─ Large (n > 1000) → Binary Search ✓ (if sorted)
Question 4: What matters more?
├─ Simplicity → Linear Search ✓
└─ Performance → Binary Search ✓ (if sorted)Performance Comparison
| Array Size | Linear (avg) | Binary | Binary Speedup |
|---|---|---|---|
| 10 | 5 | 3 | 1.7× |
| 100 | 50 | 7 | 7× |
| 1,000 | 500 | 10 | 50× |
| 10,000 | 5,000 | 13 | 385× |
| 100,000 | 50,000 | 17 | 2,941× |
| 1,000,000 | 500,000 | 20 | 25,000× |
FAQ
Q: When is linear search faster than binary search?
A: On small arrays (n < 10-20), or when you need to sort first for a single search.
Q: Should I always sort data to use binary search?
A: Only if you'll do multiple searches. For single search, sorting cost (O(n log n)) > linear search cost (O(n)).
Q: What if I need to search many times on changing data?
A: Consider a balanced BST (e.g., TreeMap in Java) for O(log n) search and O(log n) insert/delete.
Q: Is binary search worth it for n = 50?
A: Yes, if data is already sorted. No, if you need to sort first for a single search.
Conclusion
Binary search is faster than linear search, but faster isn't always better.
Choose linear search when:
- Data is unsorted and can't be sorted
- Single search operation
- Small dataset (n < 20)
- Simplicity matters
Choose binary search when:
- Data is sorted (or you can sort once)
- Multiple searches
- Large dataset (n > 100)
- Performance critical
The breakeven:
- Small data: Linear wins
- Large data, sorted, multiple searches: Binary wins
- Large data, unsorted, single search: Linear wins
Master both techniques and choose based on context, not dogma. For more details, see Why Binary Search Requires Sorted Data and the Complete Binary Search Guide.
Want to Practice LeetCode Smarter?
LeetCopilot is a free browser extension that enhances your LeetCode practice with AI-powered hints, personalized study notes, and realistic mock interviews — all designed to accelerate your coding interview preparation.
Also compatible with Edge, Brave, and Opera
