Jump Search

Search a sorted array by jumping in fixed steps, then performing a linear scan within a block.

Jump Search

Jump search finds a target in a sorted array by skipping ahead in fixed-size steps and then performing a linear scan within a small block. It reduces the number of comparisons compared to linear search while avoiding full binary search.

Problem

Given a sorted array $A$ of length $n$ and a value $x$, find an index $i$ such that

$$ A[i] = x $$

If no such index exists, return $-1$.

Key Idea

Instead of checking every element, jump forward by a fixed step size $k$:

  • Check $A[0], A[k], A[2k], A[3k], \dots$
  • Stop when $A[j] \ge x$ or the end is reached
  • Perform linear search in the previous block

Optimal step size:

$$ k \approx \sqrt{n} $$

This balances the number of jumps and the size of the final scan.

Algorithm

jump_search(A, x):
    n = length(A)
    k = floor(sqrt(n))

    prev = 0
    curr = 0

    while curr < n and A[curr] < x:
        prev = curr
        curr = curr + k

    curr = min(curr, n - 1)

    for i from prev to curr:
        if A[i] == x:
            return i

    return -1

Example

Let

$$ A = [2, 4, 6, 8, 10, 12, 14, 16, 18] $$

and

$$ x = 12 $$

Step size:

$$ k = 3 $$

Jump phase:

step index value
1 0 2
2 3 8
3 6 14

Now the target lies in range $[3, 6]$. Linear scan finds index $5$.

Correctness

The jump phase finds a block such that:

$$ A[prev] < x \le A[curr] $$

Since the array is sorted, if $x$ exists, it must lie within this block. The linear scan checks all elements in that block.

Complexity

Let $k$ be the step size.

phase cost
jumps $O(n / k)$
linear scan $O(k)$

Total:

$$ O\left(\frac{n}{k} + k\right) $$

Minimized when:

$$ k = \sqrt{n} $$

So:

$$ O(\sqrt{n}) $$

Space:

$$ O(1) $$

Comparison

method requirement time
linear search none $O(n)$
jump search sorted $O(\sqrt{n})$
binary search sorted $O(\log n)$

Jump search sits between linear and binary search.

When to Use

  • Sorted arrays with expensive random access
  • Situations where sequential access is cheaper
  • Systems where memory access patterns matter

Notes

  • Performs fewer comparisons than linear search
  • Simpler than binary search
  • Not optimal for very large datasets

Implementation

import math

def jump_search(a, x):
    n = len(a)
    k = int(math.sqrt(n))

    prev = 0
    curr = 0

    while curr < n and a[curr] < x:
        prev = curr
        curr += k

    curr = min(curr, n - 1)

    for i in range(prev, curr + 1):
        if a[i] == x:
            return i

    return -1
import "math"

func JumpSearch(a []int, x int) int {
    n := len(a)
    k := int(math.Sqrt(float64(n)))

    prev, curr := 0, 0

    for curr < n && a[curr] < x {
        prev = curr
        curr += k
    }

    if curr >= n {
        curr = n - 1
    }

    for i := prev; i <= curr; i++ {
        if a[i] == x {
            return i
        }
    }

    return -1
}