Lua Program to Implement Shell Sort

Lua Program to Implement Shell Sort

Shell Sort is an improved version of Insertion Sort that was created to make sorting faster and more efficient, especially for medium-sized lists. Instead of comparing and shifting elements that are right next to each other, Shell Sort compares elements that are far apart first. By doing this, it moves values closer to where they belong early on, which reduces the amount of work needed later.

This algorithm matters because it bridges the gap between simple sorting methods and more complex ones. Shell Sort is often used in systems where memory usage must stay low and where a simple, in-place sorting algorithm is preferred. It is also a great learning algorithm because it helps beginners understand how small changes to a simple idea, like Insertion Sort, can lead to much better performance. In this article, you will learn how to implement Shell Sort in Lua using several complete and beginner-friendly programs.

Program 1: Basic Shell Sort using loops

This program shows a straightforward implementation of Shell Sort in Lua using loops. It works with a predefined list of integers and demonstrates the core idea of gap-based sorting. This is the best starting point for beginners.

-- Basic Shell Sort in Lua

function shellSort(arr)

    local n = #arr
    local gap = math.floor(n / 2)

    while gap > 0 do

        for i = gap + 1, n do

            local temp = arr[i]
            local j = i

            while j > gap and arr[j - gap] > temp do
                arr[j] = arr[j - gap]
                j = j - gap
            end

            arr[j] = temp

        end

        gap = math.floor(gap / 2)

    end

end

local numbers = {12, 34, 54, 2, 3}
shellSort(numbers)

for _, v in ipairs(numbers) do
    io.write(v .. " ")
end

This program works by starting with a large gap and gradually reducing it. At each gap size, the array is partially sorted using an insertion-style approach. Beginners can understand this as sorting elements that are far apart first, which makes final sorting much faster.

Program 2: Shell Sort with clearer variable naming

This version uses clearer variable names and spacing to make the code easier to read. It is helpful for beginners who want code that feels closer to plain English.

-- Shell Sort with clearer variable names

function shellSort(values)

    local length = #values
    local gap = math.floor(length / 2)

    while gap > 0 do

        for current = gap + 1, length do

            local currentValue = values[current]
            local position = current

            while position > gap and values[position - gap] > currentValue do
                values[position] = values[position - gap]
                position = position - gap
            end

            values[position] = currentValue

        end

        gap = math.floor(gap / 2)

    end

end

local data = {20, 7, 1, 54, 10, 23}
shellSort(data)

for i = 1, #data do
    print(data[i])
end

The logic here is the same as the first program, but the naming makes it easier to follow. Beginners can clearly see how values move through the array as the gap changes. Writing readable code like this is a good habit to develop early.

Program 3: Shell Sort with step-by-step output

This program prints the array after each gap reduction so learners can see how the list becomes more sorted over time. It is very useful for understanding how Shell Sort works internally.

-- Shell Sort with step-by-step output

function shellSort(arr)

    local n = #arr
    local gap = math.floor(n / 2)

    while gap > 0 do

        for i = gap + 1, n do

            local temp = arr[i]
            local j = i

            while j > gap and arr[j - gap] > temp do
                arr[j] = arr[j - gap]
                j = j - gap
            end

            arr[j] = temp

        end

        print("After gap " .. gap .. ":")

        for _, v in ipairs(arr) do
            io.write(v .. " ")
        end

        print()

        gap = math.floor(gap / 2)

    end

    -- final sorted output
    print("\nFinal sorted data:")

    for _, v in ipairs(arr) do
        io.write(v .. " ")
    end

    print()

end

local sample = {9, 8, 3, 7, 0, 5, 6, 4, 1}
shellSort(sample)

By printing the array after each gap, beginners can visually follow the progress of the algorithm. This makes Shell Sort feel less mysterious and more logical. Seeing the gradual improvement helps build confidence and understanding.

Program 4: Shell Sort wrapped as a reusable function

This version focuses on making Shell Sort easy to reuse in other Lua programs. It keeps the logic clean and simple, making it suitable for real projects.

-- Reusable Shell Sort function

function shellSort(arr)

    local size = #arr
    local gap = math.floor(size / 2)

    while gap >= 1 do

        for i = gap + 1, size do

            local value = arr[i]
            local j = i

            while j > gap and arr[j - gap] > value do
                arr[j] = arr[j - gap]
                j = j - gap
            end

            arr[j] = value

        end

        gap = math.floor(gap / 2)

    end

end

local values = {45, 23, 53, 12, 64, 9}
shellSort(values)

for _, v in ipairs(values) do
    io.write(v .. " ")
end

This approach is ideal when you want a clean sorting function that can be dropped into any Lua project. Beginners can easily reuse this function without modification. It also shows how Shell Sort naturally fits into everyday programming tasks.

Program 5: Shell Sort using a custom gap sequence

This program uses a different gap sequence instead of simply dividing by two. It demonstrates that Shell Sort performance can change based on how gaps are chosen.

-- Shell Sort with custom gap sequence

function shellSort(arr)

    local n = #arr
    local gaps = {5, 3, 1}

    for _, gap in ipairs(gaps) do

        for i = gap + 1, n do

            local temp = arr[i]
            local j = i

            while j > gap and arr[j - gap] > temp do
                arr[j] = arr[j - gap]
                j = j - gap
            end

            arr[j] = temp

        end

    end

end

local nums = {29, 10, 14, 37, 13}
shellSort(nums)

for _, v in ipairs(nums) do
    io.write(v .. " ")
end

This program shows that Shell Sort is flexible and can be tuned for better performance. Beginners learn that algorithms are not always fixed and can be improved in different ways. This encourages experimentation and deeper learning.

Program 6: Shell Sort with negative and floating-point numbers

Shell Sort naturally works with negative and floating-point numbers in Lua. This final program demonstrates that behavior clearly using mixed numeric data.

-- Shell Sort with negative and floating-point numbers

function shellSort(arr)

    local n = #arr
    local gap = math.floor(n / 2)

    while gap > 0 do

        for i = gap + 1, n do

            local temp = arr[i]
            local j = i

            while j > gap and arr[j - gap] > temp do
                arr[j] = arr[j - gap]
                j = j - gap
            end

            arr[j] = temp

        end

        gap = math.floor(gap / 2)

    end

end

local mixed = {3.5, -2.1, 4.8, 0, -7.3, 1.2}
shellSort(mixed)

for _, v in ipairs(mixed) do
    io.write(v .. " ")
end

This program shows that Shell Sort does not need special changes to handle negative or decimal values. Lua compares numbers naturally, so the algorithm works as expected. Beginners can confidently use Shell Sort for real-world numeric data.

Frequently Asked Questions (FAQ)

This section answers common beginner questions about Shell Sort in Lua.

Q1. Is Shell Sort better than Insertion Sort?
Shell Sort is generally faster than Insertion Sort because it moves elements over larger distances early on. This reduces the total number of shifts needed.

Q2. Is Shell Sort stable?
Shell Sort is not a stable sorting algorithm. Equal elements may not keep their original order.

Q3. Does Shell Sort use extra memory?
Shell Sort sorts the array in place and does not need extra memory. This makes it memory efficient.

Q4. Where is Shell Sort used in practice?
Shell Sort is used in systems where simplicity, low memory usage, and decent performance are needed.

Q5. Is Shell Sort hard to learn for beginners?
Shell Sort is easier to learn once you understand Insertion Sort. With practice, the gap concept becomes clear.

Conclusion

Shell Sort is a smart and practical sorting algorithm that improves on simple sorting ideas without becoming too complex. In this article, you explored several Lua programs that implement Shell Sort in different ways, from basic loop-based versions to examples with custom gaps and mixed numbers. Each program was designed to help beginners clearly understand how the algorithm works.

By practicing these examples and experimenting with your own data, you can build strong confidence in both Lua programming and sorting algorithms. Keep coding, keep testing, and enjoy discovering how small ideas can lead to powerful solutions.

Scroll to Top