F# Program to Implement Jump Search

F# Program to Implement Jump Search

Searching through data efficiently is an essential skill in programming. While Linear Search checks each element one by one and Binary Search divides the array in half, Jump Search offers a balance between the two by “jumping” ahead by fixed steps, making it faster than Linear Search for large sorted arrays. It is particularly useful for uniformly distributed and sorted data like employee IDs, product numbers, or even page indexes in books.

Pluralsight Logo
Accelerate your tech career
with hands-on learning.
Whether you're a tech newbie or a total pro,
get the skills and confidence to land your next move.
Start 10-Day Free Trial

Jump Search is beginner-friendly because it combines the simplicity of Linear Search with a clever optimization that reduces unnecessary comparisons. Instead of examining every element, the algorithm jumps forward by a certain step size and only searches linearly within a block where the element could exist. Understanding Jump Search helps beginners learn about step-wise search optimization and the importance of choosing the right algorithm for the right dataset.

Program 1: Basic Jump Search Using Loops

This program demonstrates Jump Search using a simple loop approach. It jumps through the array in fixed steps and performs a linear search within the identified block.

open System

let jumpSearch (arr : int[]) key =

    let n = arr.Length
    let step = int (sqrt (float n))
    let mutable prev = 0
    let mutable foundIndex = -1

    // Jump phase
    let mutable current = step

    while current < n && arr.[current - 1] < key do
        prev <- current
        current <- current + step

    // Linear search phase within the block
    let last = min (current - 1) (n - 1)
    let mutable i = prev

    while i <= last && foundIndex = -1 do

        if arr.[i] = key then
            foundIndex <- i

        i <- i + 1

    foundIndex


[<EntryPoint>]
let main argv =

    let numbers = [| 1; 3; 5; 7; 9; 11; 13; 15 |]
    let key = 9
    let result = jumpSearch numbers key

    if result <> -1 then
        printfn "Element %d found at index %d" key result
    else
        printfn "Element %d not found" key

    0

In this program, the step size is the square root of the array’s length, which is a common choice for optimal performance. The algorithm jumps forward in blocks and searches linearly within the block where the key may exist. Beginners can understand it as a combination of jumping and walking through the array.

Program 2: Jump Search Using Recursion

Recursion can also be applied to Jump Search by breaking the array into blocks recursively. This program demonstrates how to implement a recursive Jump Search in F#.

open System

let rec linearScan (arr:int[]) key i last =

    if i > last then -1
    elif arr.[i] = key then i
    else linearScan arr key (i + 1) last


let rec jumpSearchRec (arr : int[]) key prev step =

    let n = arr.Length

    if prev >= n then -1
    else

        let current = min (prev + step - 1) (n - 1)

        if arr.[current] >= key then
            linearScan arr key prev current
        else
            jumpSearchRec arr key (current + 1) step


[<EntryPoint>]
let main argv =

    let numbers = [| 2; 4; 6; 8; 10; 12; 14 |]
    let step = int (sqrt (float numbers.Length))
    let key = 10
    let result = jumpSearchRec numbers key 0 step

    if result <> -1 then
        printfn "Element %d found at index %d" key result
    else
        printfn "Element %d not found" key

    0

Recursion helps beginners visualize how the array is divided into blocks. Each recursive call handles one block, and the linear search inside the block finds the key if it exists.

Program 3: Jump Search for Negative and Positive Numbers

Jump Search can handle both negative and positive numbers as long as the array is sorted. This program demonstrates a mixed array search.

open System

let jumpSearchMixed (arr : int[]) key =

    let n = arr.Length
    let step = int (sqrt (float n))
    let mutable prev = 0
    let mutable foundIndex = -1

    // Jump phase
    let mutable current = step

    while current < n && arr.[current - 1] < key do

        prev <- current
        current <- current + step

    // Linear search phase within the block
    let last = min (current - 1) (n - 1)
    let mutable i = prev

    while i <= last && foundIndex = -1 do

        if arr.[i] = key then
            foundIndex <- i

        i <- i + 1

    foundIndex


[<EntryPoint>]
let main argv =

    let numbers = [| -15; -10; -5; 0; 5; 10; 15 |]
    let key = -10
    let result = jumpSearchMixed numbers key

    if result <> -1 then
        printfn "Element %d found at index %d" key result
    else
        printfn "Element %d not found" key

    0

This shows that the algorithm does not need any changes to handle negative values, reinforcing the importance of sorting. Beginners can practice with both negative and positive datasets.

Program 4: Jump Search Returning Option Type

F#’s option type can be used to handle search results safely. This program returns Some index if the key is found, otherwise None.

open System

let jumpSearchOption (arr : int[]) key =

    let n = arr.Length
    let step = int (sqrt (float n))
    let mutable prev = 0
    let mutable result = None

    // Jump phase
    let mutable current = step

    while current < n && arr.[current - 1] < key do

        prev <- current
        current <- current + step


    // Linear search phase within the block
    let last = min (current - 1) (n - 1)
    let mutable i = prev

    while i <= last && result.IsNone do

        if arr.[i] = key then
            result <- Some i

        i <- i + 1

    result


[<EntryPoint>]
let main argv =

    let numbers = [| 1; 2; 3; 4; 5; 6 |]
    let key = 4

    match jumpSearchOption numbers key with
    | Some index -> printfn "Element %d found at index %d" key index
    | None -> printfn "Element %d not found" key

    0

Using option type is more idiomatic in F# and teaches beginners safe handling of search results without using magic numbers like -1.

Program 5: Step-by-Step Jump Search

This program prints each jump and linear check, helping beginners visualize how Jump Search narrows down the search block.

open System

let jumpSearchStep (arr : int[]) key =

    let n = arr.Length
    let step = int (sqrt (float n))
    let mutable prev = 0
    let mutable foundIndex = -1

    // Jump phase
    let mutable current = step

    while current < n && arr.[current - 1] < key do

        printfn "Jumping to index %d" current

        prev <- current
        current <- current + step


    // Linear search phase within the block
    let last = min (current - 1) (n - 1)
    let mutable i = prev

    while i <= last && foundIndex = -1 do

        printfn "Checking index %d" i

        if arr.[i] = key then
            foundIndex <- i

        i <- i + 1

    foundIndex


[<EntryPoint>]
let main argv =

    let numbers = [| 1; 3; 5; 7; 9; 11; 13 |]
    let key = 11
    let result = jumpSearchStep numbers key

    if result <> -1 then
        printfn "Element %d found at index %d" key result
    else
        printfn "Element %d not found" key

    0

Printing each jump and check makes it easier for beginners to understand how the algorithm combines jumping and linear searching efficiently.

Frequently Asked Questions (FAQ)

This section answers common beginner questions about Jump Search.

Q1. What is Jump Search?
Jump Search is a searching algorithm for sorted arrays that jumps forward in fixed steps and performs a linear search within the block where the key could exist.

Q2. Does the array need to be sorted?
Yes, Jump Search requires a sorted array for the jumps to correctly identify the block.

Q3. How is the step size determined?
A common choice is the square root of the array length, which balances jumping and linear search for optimal performance.

Q4. Can Jump Search handle negative numbers?
Yes, as long as the array is sorted, negative, zero, and positive numbers are all supported.

Q5. Is Jump Search faster than Linear Search?
Yes, for large sorted arrays, Jump Search is faster than Linear Search because it reduces the number of comparisons by jumping ahead.

Conclusion

Jump Search is an efficient algorithm for sorted arrays that combines the simplicity of Linear Search with the optimization of stepping ahead. Through multiple F# programs, we explored iterative and recursive approaches, handling negative and positive numbers, using option types, and visualizing each jump.

Beginners can learn how Jump Search improves efficiency, understand step-wise searching, and practice safe result handling in F#. Experimenting with different step sizes and arrays helps reinforce the concepts and prepares learners for more advanced search algorithms in the future.

Scroll to Top