How Ternary Search Works
Table of Contents
Every search algorithm this week has split the problem in half. Ternary Search asks an obvious-sounding question: what if we split it into thirds instead? It's a natural extension of Binary Search's core idea — and while it turns out not to beat Binary Search for simple lookups, it introduces a way of thinking about a search space that becomes genuinely powerful once you get to problems like finding a maximum or minimum in a curve — something you'll run into in optimization problems down the line.
How Ternary Search Works
- Pick two midpoints that divide the current range into three roughly equal parts.
- Compare the target against the values at both midpoints.
- Based on those two comparisons, eliminate one of the three sections entirely.
- Repeat on the remaining two-thirds of the range.
Walking Through an Example
Search for 42 in [4, 8, 15, 16, 23, 38, 42, 56, 72, 91]
(indices 0–9):
- mid1 = index 3 (
16), mid2 = index 6 (42) 42 == arr[mid2]→ match found immediately at index 6
If it hadn't matched either midpoint, the algorithm would compare
42 against both values to decide which third of the array to
keep — smaller than mid1's value means search the first third, between the two
midpoints means search the middle third, and larger than mid2's value means
search the last third.
Java Implementation
public class TernarySearch {
public static int ternarySearch(int[] arr, int target, int low, int high) {
if (low > high) {
return -1; // search space exhausted
}
// Divide the range into three parts
int mid1 = low + (high - low) / 3;
int mid2 = high - (high - low) / 3;
if (arr[mid1] == target) return mid1;
if (arr[mid2] == target) return mid2;
if (target < arr[mid1]) {
// Target is in the first third
return ternarySearch(arr, target, low, mid1 - 1);
} else if (target > arr[mid2]) {
// Target is in the last third
return ternarySearch(arr, target, mid2 + 1, high);
} else {
// Target is in the middle third
return ternarySearch(arr, target, mid1 + 1, mid2 - 1);
}
}
public static void main(String[] args) {
int[] arr = {4, 8, 15, 16, 23, 38, 42, 56, 72, 91};
System.out.println(ternarySearch(arr, 42, 0, arr.length - 1)); // Output: 6
}
}
Wait — Why Isn't This Faster Than Binary Search?
This is the most counterintuitive part, and worth sitting with: splitting into three parts sounds like it should eliminate more per step. But each ternary step needs two comparisons instead of one, and the math works out so that Ternary Search actually does more total comparisons than Binary Search for the same array size — despite shrinking the range faster per step.
Both are O(log n), but Binary Search's constant factor is smaller. In practice, for a plain sorted-array lookup, Binary Search wins. This is a good lesson on its own: Big O tells you the growth shape, not the whole performance story — the constants hidden inside "O(log n)" still matter.
Time Complexity
Time: O(log₃ n), which simplifies to the same O(log n) growth class as Binary Search.
Space: O(log n) for the recursive version, due to the call stack.
Where Ternary Search Actually Earns Its Place
Ternary Search isn't really a search-array tool in practice — its real home is finding the maximum or minimum point of a unimodal function (a curve that increases then decreases, or vice versa, with exactly one peak or valley). That's a different category of problem you'll see in more advanced optimization and competitive programming contexts, and it's the reason this algorithm is worth knowing even though it loses to Binary Search here.
Common Interview Questions
- Why does Ternary Search need more total comparisons than Binary Search, despite dividing into three parts?
- In what kind of problem does Ternary Search genuinely outperform Binary Search?
- What does "unimodal function" mean, and why does Ternary Search apply well to it?
The Takeaway — And the End of Our Searching Block
That wraps up six searching algorithms in six days: Linear, Binary, Jump, Interpolation, Exponential, and Ternary. Every one of them was really the same question asked differently — "how much can we learn about where the answer is before we go looking for it?" With searching covered, we're moving into Sorting next: Bubble Sort first (already covering how to organize data so these very search algorithms can even be used), followed by the faster approaches — Merge Sort and Quick Sort — that make sense once you understand exactly why Bubble Sort's O(n²) doesn't scale.
Happy learning!
— Team CodeElevateX 🚀
Comments
Post a Comment