F# Program to Implement Insertion Sort

F# Program to Implement Insertion Sort

Sorting is one of those ideas in programming that shows up everywhere. When data is sorted, it becomes easier to read, faster to search, and simpler to manage. Insertion Sort is one of the most beginner-friendly sorting algorithms, and it is often taught early because it feels very natural. It works in a way that is similar to how people sort playing cards in their hands.

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

Insertion Sort builds the sorted result one value at a time. It takes the next value and inserts it into the correct position among the already sorted values. Even though it is not the fastest option for very large data, it is still very useful for small datasets and for learning how sorting logic works. In this article, we will walk through several F# programs that implement Insertion Sort in different ways so beginners can clearly understand the idea.

Program 1: Insertion Sort Using Simple Loops

This program shows the most common way to write Insertion Sort in F# using loops and a mutable array. It follows the traditional approach that many beginners see first.

open System

[<EntryPoint>]
let main argv =

    let numbers = [| 9; 5; 1; 4; 3 |]
    let n = numbers.Length

    for i in 1 .. n - 1 do

        let key = numbers.[i]
        let mutable j = i - 1

        while j >= 0 && numbers.[j] > key do

            numbers.[j + 1] <- numbers.[j]
            j <- j - 1

        numbers.[j + 1] <- key

    printfn "Sorted array:"
    numbers |> Array.iter (printf "%d ")

    0

This program works by taking one value at a time and placing it into the correct position in the sorted part of the array. It is useful because the logic is very clear and easy to trace. Beginners can understand how values are shifted step by step until the right place is found.

Program 2: Insertion Sort Using Recursion

This program uses recursion instead of loops to perform Insertion Sort. It helps beginners see how the same idea can be expressed in a different style.

open System

let rec insert value list =

    match list with
    | [] -> [value]
    | head :: tail when value <= head -> value :: list
    | head :: tail -> head :: insert value tail


let rec insertionSort list =

    match list with
    | [] -> []
    | head :: tail -> insert head (insertionSort tail)


[<EntryPoint>]
let main argv =

    let numbers = [9; 5; 1; 4; 3]
    let result = insertionSort numbers

    printfn "Sorted list:"
    result |> List.iter (printf "%d ")

    0

This version breaks the problem into smaller parts by sorting the tail first and then inserting the head in the right place. It is useful for learning recursive thinking in F#. Beginners can see how complex tasks become easier when broken into simple function calls.

Program 3: Insertion Sort with Mutable List Conversion

This program converts a list into an array, sorts it, and then prints the result. It shows how different data types can work together in F#.

open System

[<EntryPoint>]
let main argv =

    let numbers = [7; 2; 6; 1; 4]
    let arr = numbers |> List.toArray
    let n = arr.Length

    for i in 1 .. n - 1 do

        let key = arr.[i]
        let mutable j = i - 1

        while j >= 0 && arr.[j] > key do

            arr.[j + 1] <- arr.[j]
            j <- j - 1

        arr.[j + 1] <- key

    printfn "Sorted array:"
    arr |> Array.iter (printf "%d ")

    0

This approach is helpful when beginners want to understand how lists and arrays differ. It shows that Insertion Sort logic stays the same even when the data structure changes. This makes it easier to apply the algorithm in real projects.

Program 4: Insertion Sort Using Index Recursion

This program uses recursion while still working with an array. It keeps the sorting logic close to the loop version but changes how repetition is handled.

open System

let rec insertionSort (arr:int[]) i =

    if i >= arr.Length then arr
    else

        let key = arr.[i]
        let mutable j = i - 1

        while j >= 0 && arr.[j] > key do

            arr.[j + 1] <- arr.[j]
            j <- j - 1

        arr.[j + 1] <- key

        insertionSort arr (i + 1)


[<EntryPoint>]
let main argv =

    let numbers = [| 8; 3; 5; 2; 9 |]
    insertionSort numbers 1 |> ignore

    printfn "Sorted array:"
    numbers |> Array.iter (printf "%d ")

    0

This program is useful because it mixes familiar loop logic with recursion. Beginners can learn that recursion is just another way to repeat steps. It also helps in understanding how functions control program flow.

Program 5: Generic Insertion Sort in F

This program shows how Insertion Sort can work with any comparable type. It introduces generic programming in a very gentle way.

open System

let insertionSortGeneric (arr:'a[]) =

    let n = arr.Length

    for i in 1 .. n - 1 do

        let key = arr.[i]
        let mutable j = i - 1

        while j >= 0 && arr.[j] > key do
            arr.[j + 1] <- arr.[j]
            j <- j - 1

        arr.[j + 1] <- key

    arr


[<EntryPoint>]
let main argv =

    let numbers = [| 6; 4; 2; 8; 1 |]
    let sorted = insertionSortGeneric numbers

    printfn "Sorted array:"
    sorted |> Array.iter (printf "%d ")

    0

This version is powerful because the same function can sort many types of data. Beginners can see how F# supports clean and reusable code. It also prepares them for writing more flexible programs later.

Frequently Asked Questions (FAQ)

This section answers common beginner questions about Insertion Sort in F# in a simple and friendly way.

Q1. What is Insertion Sort best used for?
Insertion Sort works best for small datasets or data that is already almost sorted. It is also very popular for learning purposes.

Q2. Is Insertion Sort faster than Bubble Sort?
Insertion Sort is usually faster than Bubble Sort in real situations, especially when the data is nearly sorted.

Q3. Why should beginners learn Insertion Sort in F#?
It helps beginners understand both sorting logic and functional programming concepts at the same time.

Q4. Can Insertion Sort be written without loops?
Yes, it can be written using recursion and immutable lists, as shown in earlier programs.

Q5. Is Insertion Sort used in real applications?
Yes, it is often used inside more complex algorithms and for small or partially sorted data.

Conclusion

Insertion Sort is a simple and natural way to understand how sorting works. In this article, we explored several F# programs that implement Insertion Sort using loops, recursion, lists, arrays, and generic functions. Each example showed the same idea from a different angle, making it easier for beginners to learn.

The best way to master Insertion Sort is to practice these programs and change the input values. With regular practice, sorting algorithms will become easy to understand, and learning more advanced F# topics will feel much more comfortable and enjoyable.

Scroll to Top