F# Program to Implement Bubble Sort

F# Program to Implement Bubble Sort

Sorting is one of the oldest and most important ideas in computer programming. When we sort data, we make it easier to read, search, and understand. One of the first sorting algorithms most beginners learn is Bubble Sort. Even though it is not the fastest method, it is very easy to understand, which makes it perfect for learning how sorting works behind the scenes.

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

Bubble Sort works by comparing two nearby values and swapping them if they are in the wrong order. This process repeats again and again until the whole collection is sorted. In real life, it is like arranging books on a table by checking two books at a time. In this article, we will learn how to write an F# program to implement Bubble Sort using different approaches, so beginners can see the same idea from many angles.

Program 1: Bubble Sort Using Simple Loops

This program shows the most traditional way to implement Bubble Sort in F# using loops and a mutable array. It is close to how Bubble Sort is taught in many classrooms, which makes it very friendly for beginners.

open System

[<EntryPoint>]
let main argv =

    let numbers = [| 5; 1; 4; 2; 8 |]

    let n = numbers.Length

    for i in 0 .. n - 2 do

        for j in 0 .. n - i - 2 do

            if numbers.[j] > numbers.[j + 1] then

                let temp = numbers.[j]
                numbers.[j] <- numbers.[j + 1]
                numbers.[j + 1] <- temp

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

    0

This program works by using two loops to compare values step by step. The inner loop handles the comparison and swapping, while the outer loop repeats the process until the array is sorted. This approach is useful because it clearly shows how Bubble Sort moves larger values to the end, and beginners can easily follow the logic line by line.

Program 2: Bubble Sort Using Recursion

This program uses recursion instead of loops to perform Bubble Sort. It shows a more functional way of thinking, which is very common in F#.

open System

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

    if i = arr.Length - 1 then arr
    else

        if arr.[i] > arr.[i + 1] then

            let temp = arr.[i]
            arr.[i] <- arr.[i + 1]
            arr.[i + 1] <- temp

        bubblePass arr (i + 1)


let rec bubbleSort arr n =

    if n = 1 then arr
    else

        bubblePass arr 0 |> ignore
        bubbleSort arr (n - 1)


[<EntryPoint>]
let main argv =

    let numbers = [| 7; 3; 9; 1; 6 |]
    bubbleSort numbers numbers.Length |> ignore

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

    0

Here, recursion replaces the looping structure. One function performs a single pass, and another repeats that pass until sorting is complete. This is useful for understanding how Bubble Sort can be broken into smaller problems, and it helps beginners get comfortable with recursive thinking in F#.

Program 3: Bubble Sort Using Immutable Lists

This program demonstrates Bubble Sort using immutable lists instead of arrays. It fits well with the functional nature of F#.

open System

let rec bubble list =

    match list with
    | x :: y :: rest when x > y -> y :: bubble (x :: rest)
    | x :: rest -> x :: bubble rest
    | [] -> []


let rec bubbleSort list =

    let sorted = bubble list
    if sorted = list then list
    else bubbleSort sorted


[<EntryPoint>]
let main argv =

    let numbers = [5; 2; 8; 3; 1]
    let result = bubbleSort numbers

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

    0

This version avoids changing data directly and instead creates new lists. It is useful for beginners who want to learn pure functional programming. Even though it may feel different at first, it teaches a clean and safe way to handle data in F#.

Program 4: Bubble Sort with Early Exit Optimization

This program improves Bubble Sort by stopping early if no swaps are made. It keeps the logic simple while showing a small but important improvement.

open System

[<EntryPoint>]
let main argv =

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

    let mutable swapped = true
    let mutable i = 0

    while swapped do

        swapped <- false

        for j in 0 .. n - i - 2 do

            if numbers.[j] > numbers.[j + 1] then

                let temp = numbers.[j]
                numbers.[j] <- numbers.[j + 1]
                numbers.[j + 1] <- temp
                swapped <- true

        i <- i + 1

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

    0

This program checks if any swapping happened in a pass. If nothing changed, the algorithm stops early. Beginners can learn from this example how small checks can make programs smarter without making them harder to read.

Program 5: Generic Bubble Sort for Any Comparable Type

This program shows how Bubble Sort can work with any comparable type, not just integers. It introduces generic programming in a gentle way.

open System

let bubbleSortGeneric (arr:'a[]) =

    let n = arr.Length

    for i in 0 .. n - 2 do

        for j in 0 .. n - i - 2 do

            if arr.[j] > arr.[j + 1] then

                let temp = arr.[j]
                arr.[j] <- arr.[j + 1]
                arr.[j + 1] <- temp

    arr


[<EntryPoint>]
let main argv =

    let numbers = [| 10; 2; 5; 1; 9 |]
    let sorted = bubbleSortGeneric numbers

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

    0

This approach is useful because it shows how one Bubble Sort function can work for many data types. Beginners can see how F# supports reuse and clean design while still keeping the code readable and familiar.

Frequently Asked Questions (FAQ)

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

Q1. What is Bubble Sort mainly used for?
Bubble Sort is mostly used for learning and teaching purposes. It helps beginners understand sorting logic before moving to faster algorithms.

Q2. Is Bubble Sort good for large data?
Bubble Sort is not ideal for large data because it is slow compared to other methods. It is best used for small datasets or practice.

Q3. Why learn Bubble Sort in F#?
Learning Bubble Sort in F# helps beginners understand both sorting basics and functional programming ideas at the same time.

Q4. Can Bubble Sort work without loops?
Yes, as shown earlier, Bubble Sort can be written using recursion and immutable data, which fits well with F#.

Q5. Should beginners practice all versions?
Trying different versions helps beginners see how the same idea can be solved in many ways, which builds confidence and skill.

Conclusion

Bubble Sort may be simple, but it plays a big role in helping beginners understand how sorting works. In this article, we explored several F# programs that implement Bubble Sort using loops, recursion, immutable lists, small optimizations, and generic functions. Each approach shows a different way of thinking while solving the same problem.

By practicing these examples, beginners can grow comfortable with F# syntax and logic. The best way to learn is to experiment, change the data, and run the programs again. With time and practice, sorting algorithms will feel natural, and learning more advanced techniques will become much easier.

Scroll to Top