VB .NET Program to Implement Tim Sort

VB .NET Program to Implement Tim Sort

Sorting is one of the most important operations in programming. From arranging grades in a school database to ordering numbers in a finance report, a reliable sorting method makes data easier to read, search, and analyze. Tim Sort is a modern sorting algorithm used widely in programming languages like Python and Java. It combines the best features of Merge Sort and Insertion Sort to achieve both speed and efficiency, making it ideal for practical applications.

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

Tim Sort works by breaking the data into small pieces called “runs,” sorting each run using Insertion Sort, and then merging these runs efficiently using Merge Sort. This hybrid approach ensures excellent performance even on large datasets and partially sorted arrays. It is widely used in real-world applications because it adapts to existing order in data, saving time on nearly sorted arrays. For beginners, Tim Sort provides a clear example of how combining algorithms can lead to better efficiency and flexibility.

Program 1: Basic Tim Sort Using Loops

This program demonstrates a simple Tim Sort implementation using loops and arrays. It splits the array into small runs and merges them progressively.

Module Module1

    Sub InsertionSort(arr() As Integer, left As Integer, right As Integer)

        For i As Integer = left + 1 To right

            Dim temp As Integer = arr(i)
            Dim j As Integer = i - 1

            While j >= left AndAlso arr(j) > temp

                arr(j + 1) = arr(j)
                j -= 1

            End While

            arr(j + 1) = temp

        Next

    End Sub

    Sub Merge(arr() As Integer, l As Integer, m As Integer, r As Integer)

        Dim len1 As Integer = m - l + 1
        Dim len2 As Integer = r - m
        Dim left(len1 - 1) As Integer
        Dim right(len2 - 1) As Integer

        Array.Copy(arr, l, left, 0, len1)
        Array.Copy(arr, m + 1, right, 0, len2)

        Dim i As Integer = 0, j As Integer = 0, k As Integer = l

        While i < len1 AndAlso j < len2

            If left(i) <= right(j) Then
                arr(k) = left(i)
                i += 1
            Else
                arr(k) = right(j)
                j += 1
            End If

            k += 1

        End While

        While i < len1

            arr(k) = left(i)
            i += 1
            k += 1

        End While

        While j < len2

            arr(k) = right(j)
            j += 1
            k += 1

        End While

    End Sub

    Sub TimSort(arr() As Integer)

        Dim n As Integer = arr.Length
        Dim RUN As Integer = 32

        For i As Integer = 0 To n - 1 Step RUN

            Dim right As Integer = Math.Min(i + RUN - 1, n - 1)
            InsertionSort(arr, i, right)

        Next

        Dim size As Integer = RUN
        While size < n

            For left As Integer = 0 To n - 1 Step size * 2

                Dim mid As Integer = Math.Min(n - 1, left + size - 1)
                Dim right As Integer = Math.Min((left + 2 * size - 1), n - 1)

                If mid < right Then
                    Merge(arr, left, mid, right)
                End If

            Next

            size *= 2

        End While

    End Sub

    Sub Main()

        Dim data() As Integer = {5, 21, 7, 23, 19, 1, 4, 12}
        TimSort(data)

        Console.WriteLine("Sorted Array:")

        For Each num In data
            Console.Write(num & " ")
        Next

        Console.ReadLine()

    End Sub

End Module

This basic example uses small runs of size 32. Beginners can observe how the array is first partially sorted with insertion sort and then merged efficiently.

Program 2: Tim Sort With User Input

This program allows the user to enter their own numbers, making it interactive and flexible.

Module Module1

    Sub InsertionSort(arr() As Integer, left As Integer, right As Integer)

        For i As Integer = left + 1 To right

            Dim temp As Integer = arr(i)
            Dim j As Integer = i - 1

            While j >= left AndAlso arr(j) > temp

                arr(j + 1) = arr(j)
                j -= 1

            End While

            arr(j + 1) = temp

        Next

    End Sub

    Sub Merge(arr() As Integer, l As Integer, m As Integer, r As Integer)

        Dim len1 As Integer = m - l + 1
        Dim len2 As Integer = r - m
        Dim left(len1 - 1) As Integer
        Dim right(len2 - 1) As Integer

        Array.Copy(arr, l, left, 0, len1)
        Array.Copy(arr, m + 1, right, 0, len2)

        Dim i As Integer = 0, j As Integer = 0, k As Integer = l

        While i < len1 AndAlso j < len2

            If left(i) <= right(j) Then
                arr(k) = left(i)
                i += 1
            Else
                arr(k) = right(j)
                j += 1
            End If

            k += 1

        End While

        While i < len1

            arr(k) = left(i)
            i += 1
            k += 1

        End While

        While j < len2

            arr(k) = right(j)
            j += 1
            k += 1

        End While

    End Sub

    Sub TimSort(arr() As Integer)

        Dim n As Integer = arr.Length
        Dim RUN As Integer = 32

        For i As Integer = 0 To n - 1 Step RUN

            Dim right As Integer = Math.Min(i + RUN - 1, n - 1)
            InsertionSort(arr, i, right)

        Next

        Dim size As Integer = RUN
        While size < n

            For left As Integer = 0 To n - 1 Step size * 2

                Dim mid As Integer = Math.Min(n - 1, left + size - 1)
                Dim right As Integer = Math.Min((left + 2 * size - 1), n - 1)

                If mid < right Then
                    Merge(arr, left, mid, right)
                End If

            Next

            size *= 2

        End While

    End Sub

    Sub Main()

        Console.WriteLine("Enter numbers separated by spaces:")

        Dim input As String = Console.ReadLine()
        Dim data() As Integer = Array.ConvertAll(input.Split(" "c), AddressOf Integer.Parse)

        TimSort(data)

        Console.WriteLine("Sorted Array:")

        For Each num In data
            Console.Write(num & " ")
        Next

        Console.ReadLine()

    End Sub

End Module

This version demonstrates that Tim Sort can be applied dynamically to any set of numbers provided by the user.

Program 3: Tim Sort With Negative Numbers

Tim Sort naturally handles negative numbers. This example demonstrates sorting arrays that include both negative and positive values.

Module Module1

    Sub InsertionSort(arr() As Integer, left As Integer, right As Integer)

        For i As Integer = left + 1 To right

            Dim temp As Integer = arr(i)
            Dim j As Integer = i - 1

            While j >= left AndAlso arr(j) > temp

                arr(j + 1) = arr(j)
                j -= 1

            End While

            arr(j + 1) = temp

        Next

    End Sub

    Sub Merge(arr() As Integer, l As Integer, m As Integer, r As Integer)

        Dim len1 As Integer = m - l + 1
        Dim len2 As Integer = r - m
        Dim left(len1 - 1) As Integer
        Dim right(len2 - 1) As Integer

        Array.Copy(arr, l, left, 0, len1)
        Array.Copy(arr, m + 1, right, 0, len2)

        Dim i As Integer = 0, j As Integer = 0, k As Integer = l

        While i < len1 AndAlso j < len2

            If left(i) <= right(j) Then
                arr(k) = left(i)
                i += 1
            Else
                arr(k) = right(j)
                j += 1
            End If

            k += 1

        End While

        While i < len1

            arr(k) = left(i)
            i += 1
            k += 1

        End While

        While j < len2

            arr(k) = right(j)
            j += 1
            k += 1

        End While

    End Sub

    Sub TimSort(arr() As Integer)

        Dim n As Integer = arr.Length
        Dim RUN As Integer = 32

        For i As Integer = 0 To n - 1 Step RUN

            Dim right As Integer = Math.Min(i + RUN - 1, n - 1)
            InsertionSort(arr, i, right)

        Next

        Dim size As Integer = RUN
        While size < n

            For left As Integer = 0 To n - 1 Step size * 2

                Dim mid As Integer = Math.Min(n - 1, left + size - 1)
                Dim right As Integer = Math.Min((left + 2 * size - 1), n - 1)

                If mid < right Then
                    Merge(arr, left, mid, right)
                End If

            Next

            size *= 2

        End While

    End Sub

    Sub Main()

        Dim data() As Integer = {12, -5, 23, -7, 0, 8}
        TimSort(data)

        Console.WriteLine("Sorted Array:")

        For Each num In data
            Console.Write(num & " ")
        Next

        Console.ReadLine()

    End Sub

End Module

Beginners can see that no additional steps are needed to sort negative numbers—they are handled automatically.

Program 4: Tim Sort With Smaller Run Size

This example shows how changing the run size can affect sorting performance. Smaller runs might be better for mostly sorted arrays.

Module Module1

    Sub InsertionSort(arr() As Integer, left As Integer, right As Integer)

        For i As Integer = left + 1 To right

            Dim temp As Integer = arr(i)
            Dim j As Integer = i - 1

            While j >= left AndAlso arr(j) > temp

                arr(j + 1) = arr(j)
                j -= 1

            End While

            arr(j + 1) = temp

        Next

    End Sub

    Sub Merge(arr() As Integer, l As Integer, m As Integer, r As Integer)

        Dim len1 As Integer = m - l + 1
        Dim len2 As Integer = r - m
        Dim left(len1 - 1) As Integer
        Dim right(len2 - 1) As Integer

        Array.Copy(arr, l, left, 0, len1)
        Array.Copy(arr, m + 1, right, 0, len2)

        Dim i As Integer = 0, j As Integer = 0, k As Integer = l

        While i < len1 AndAlso j < len2

            If left(i) <= right(j) Then
                arr(k) = left(i)
                i += 1
            Else
                arr(k) = right(j)
                j += 1
            End If

            k += 1

        End While

        While i < len1

            arr(k) = left(i)
            i += 1
            k += 1

        End While

        While j < len2

            arr(k) = right(j)
            j += 1
            k += 1

        End While

    End Sub

    Sub TimSortSmallRuns(arr() As Integer)

        Dim n As Integer = arr.Length
        Dim RUN As Integer = 16 ' Smaller run

        For i As Integer = 0 To n - 1 Step RUN

            Dim right As Integer = Math.Min(i + RUN - 1, n - 1)
            InsertionSort(arr, i, right)

        Next

        Dim size As Integer = RUN

        While size < n

            For left As Integer = 0 To n - 1 Step size * 2

                Dim mid As Integer = Math.Min(n - 1, left + size - 1)
                Dim right As Integer = Math.Min((left + 2 * size - 1), n - 1)

                If mid < right Then
                    Merge(arr, left, mid, right)
                End If

            Next

            size *= 2

        End While

    End Sub

    Sub Main()

        Dim data() As Integer = {10, 2, 33, 1, 22, 5, 17}
        TimSortSmallRuns(data)

        Console.WriteLine("Sorted Array:")

        For Each num In data
            Console.Write(num & " ")
        Next

        Console.ReadLine()

    End Sub

End Module

Beginners can experiment with different run sizes to see how it affects the sorting speed and behavior.

Program 5: Modular Tim Sort With Functions

This version separates insertion sort, merge, and tim sort into functions for better readability and reusability.

Module Module1

    Sub InsertionSort(arr() As Integer, left As Integer, right As Integer)

        For i As Integer = left + 1 To right

            Dim temp As Integer = arr(i)
            Dim j As Integer = i - 1

            While j >= left AndAlso arr(j) > temp

                arr(j + 1) = arr(j)
                j -= 1

            End While

            arr(j + 1) = temp

        Next

    End Sub

    Sub Merge(arr() As Integer, l As Integer, m As Integer, r As Integer)

        Dim len1 As Integer = m - l + 1
        Dim len2 As Integer = r - m
        Dim left(len1 - 1) As Integer
        Dim right(len2 - 1) As Integer

        Array.Copy(arr, l, left, 0, len1)
        Array.Copy(arr, m + 1, right, 0, len2)

        Dim i As Integer = 0, j As Integer = 0, k As Integer = l

        While i < len1 AndAlso j < len2

            If left(i) <= right(j) Then
                arr(k) = left(i)
                i += 1
            Else
                arr(k) = right(j)
                j += 1
            End If

            k += 1

        End While

        While i < len1

            arr(k) = left(i)
            i += 1
            k += 1

        End While

        While j < len2

            arr(k) = right(j)
            j += 1
            k += 1

        End While

    End Sub

    Sub TimSort(arr() As Integer)

        Dim n As Integer = arr.Length
        Dim RUN As Integer = 32

        For i As Integer = 0 To n - 1 Step RUN

            Dim right As Integer = Math.Min(i + RUN - 1, n - 1)
            InsertionSort(arr, i, right)

        Next

        Dim size As Integer = RUN
        While size < n

            For left As Integer = 0 To n - 1 Step size * 2

                Dim mid As Integer = Math.Min(n - 1, left + size - 1)
                Dim right As Integer = Math.Min((left + 2 * size - 1), n - 1)

                If mid < right Then
                    Merge(arr, left, mid, right)
                End If

            Next

            size *= 2

        End While

    End Sub

    Sub Main()

        Dim data() As Integer = {8, 3, 15, 6, 1, 9, 12}
        TimSort(data)

        Console.WriteLine("Sorted Array:")

        For Each num In data
            Console.Write(num & " ")
        Next

        Console.ReadLine()

    End Sub

End Module

This approach helps beginners understand modular programming, making it easier to manage large algorithms like Tim Sort.

Frequently Asked Questions (FAQ)

Tim Sort is a common topic for beginners, so here are some questions you may have:

Q1: What makes Tim Sort special compared to other sorting algorithms?
Tim Sort combines insertion sort for small runs and merge sort for merging, making it adaptive and efficient, especially for nearly sorted arrays.

Q2: Can Tim Sort handle negative numbers?
Yes, Tim Sort naturally handles negative numbers because it only relies on comparisons.

Q3: What is the time complexity of Tim Sort?
Tim Sort has a worst-case time complexity of O(n log n), and it performs even better on partially sorted data.

Q4: Is Tim Sort stable?
Yes, Tim Sort is stable, which means it preserves the relative order of equal elements.

Q5: Can beginners implement Tim Sort in VB .NET easily?
Yes, by breaking it into small functions like insertion sort and merge, beginners can implement and understand it step by step.

Conclusion

Tim Sort is a highly efficient, practical, and beginner-friendly sorting algorithm. By combining the strengths of insertion and merge sort, it adapts well to both small and large datasets and works efficiently with nearly sorted data. Practicing Tim Sort in VB .NET helps beginners understand hybrid algorithms, modular programming, and how to handle negative numbers seamlessly. Experimenting with different run sizes, user input, and modular functions can improve understanding and make coding more flexible and fun.

Scroll to Top