Zum Inhalt springenSkip to content
Search Algorithms

Ternary Search

Splits the search range into three thirds and compares at the two split points.

Step1of5
  • Comparisons 0
  • Result still searching
50
121
172
213
294
355
426
507
638
749
8810
9111
  • compare
  • swap
  • sorted

Pseudocode

 1  lo = 0; hi = n - 1
 2  while lo <= hi
 3    m1 = lo + (hi - lo) / 3
 4    m2 = hi - (hi - lo) / 3
 5    if a[m1] == target: return m1
 6    if a[m2] == target: return m2
 7    if target < a[m1]: hi = m1 - 1
 8    else if target > a[m2]: lo = m2 + 1
 9    else: lo = m1 + 1; hi = m2 - 1
10  return -1

Step log

1Ternary search for 74 in the sorted arrayLine 1

How it works, runtime and memory

Ternary search is a direct generalisation of binary search that splits the current range into three parts instead of two. With m1 = lo + ⌊(hi − lo) / 3⌋ and m2 = hi − ⌊(hi − lo) / 3⌋ it compares two points per iteration. If the target lies to the left of a[m1] it continues in the left third; right of a[m2] in the right third; otherwise in the middle third between m1 and m2. Runtime is O(log₃ n), asymptotically equivalent to binary search. But ternary search makes two comparisons per iteration instead of one, so it is slower in practice and rarely used as a pure search. Its main use is as an optimisation tool for unimodal (strictly increasing then decreasing) functions.

Complexity

  • Best caseO(1)
  • Average caseO(log n)
  • Worst caseO(log n)
  • Extra spaceO(1)

When to use it

Classic application: finding the maximum of a unimodal function, one that rises and then falls. Examples include the peak of a parabola or the optimal throw range of a projectile. As a pure array search, inferior to binary search.