Tim Sort Program with Explanation and Code

2025-11-19 tim sort hybrid sorting algorithm insertion sort + merge sort python tim sort c tim sort javascript tim sort php tim sort csharp tim sort optimized sorting algorithm real world sorting

Tim Sort is a hybrid sorting algorithm combining Merge Sort and Insertion Sort, optimized for real-world datasets. It is used as the default sorting algorithm in Python and Java. This page provides explanations and full code examples in Python, C, JavaScript, PHP, and C#.

Program Explanation

What is Tim Sort?

Tim Sort is a highly optimized hybrid sorting algorithm derived from Merge Sort and Insertion Sort. It is designed to perform exceptionally well on real-world data by identifying already-sorted sequences (called runs). Python’s built-in sort() and Java’s Arrays.sort() use Tim Sort due to its speed, stability, and adaptability. It efficiently combines insertion sorting for small sections with merging for larger sections.

Steps to Solve

  1. Choose a minimum run size (typically between 32 and 64).
  2. Break the array into small chunks (runs) of size MIN_RUN.
  3. Sort each run using Insertion Sort.
  4. Merge runs in a manner similar to Merge Sort.
  5. Continue merging until the entire array is sorted.
  6. Return the fully sorted output.

Key Points

  • Time complexity: O(n log n) in worst case.
  • Stable sorting algorithm.
  • Uses insertion sort for small runs.
  • Uses merge sort for efficiently merging sorted runs.
  • Optimized for real-world partially sorted data.
  • Used as the default sorting algorithm in major programming languages.

Program Code


MIN_RUN = 32

def insertion_sort(arr, left, right):
    for i in range(left + 1, right + 1):
        key = arr[i]
        j = i - 1
        while j >= left and arr[j] > key:
            arr[j + 1] = arr[j]
            j -= 1
        arr[j + 1] = key

def merge(arr, l, m, r):
    left = arr[l:m + 1]
    right = arr[m + 1:r + 1]

    i = j = 0
    k = l

    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            arr[k] = left[i]
            i += 1
        else:
            arr[k] = right[j]
            j += 1
        k += 1

    while i < len(left):
        arr[k] = left[i]
        i += 1
        k += 1

    while j < len(right):
        arr[k] = right[j]
        j += 1
        k += 1

def tim_sort(arr):
    n = len(arr)

    for i in range(0, n, MIN_RUN):
        insertion_sort(arr, i, min(i + MIN_RUN - 1, n - 1))

    size = MIN_RUN
    while size < n:
        for left in range(0, n, 2 * size):
            mid = left + size - 1
            right = min(left + 2 * size - 1, n - 1)

            if mid < right:
                merge(arr, left, mid, right)
        size *= 2

arr = list(map(int, input("Enter numbers: ").split()))
tim_sort(arr)
print("Sorted array:", arr)
      

#include <stdio.h>
#define MIN_RUN 32

void insertionSort(int arr[], int left, int right) {
    for (int i = left + 1; i <= right; i++) {
        int key = arr[i];
        int j = i - 1;
        while (j >= left && arr[j] > key) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = key;
    }
}

void merge(int arr[], int l, int m, int r) {
    int leftSize = m - l + 1;
    int rightSize = r - m;

    int left[leftSize], right[rightSize];

    for (int i = 0; i < leftSize; i++)
        left[i] = arr[l + i];

    for (int i = 0; i < rightSize; i++)
        right[i] = arr[m + 1 + i];

    int i = 0, j = 0, k = l;

    while (i < leftSize && j < rightSize) {
        if (left[i] <= right[j])
            arr[k++] = left[i++];
        else
            arr[k++] = right[j++];
    }

    while (i < leftSize)
        arr[k++] = left[i++];

    while (j < rightSize)
        arr[k++] = right[j++];
}

void timSort(int arr[], int n) {
    for (int i = 0; i < n; i += MIN_RUN) {
        insertionSort(arr, i, (i + MIN_RUN - 1 < n ? i + MIN_RUN - 1 : n - 1));
    }

    for (int size = MIN_RUN; size < n; size *= 2) {
        for (int left = 0; left < n; left += 2 * size) {
            int mid = left + size - 1;
            int right = (left + 2 * size - 1 < n ? left + 2 * size - 1 : n - 1);

            if (mid < right)
                merge(arr, left, mid, right);
        }
    }
}

int main() {
    int n;
    printf("Enter number of elements: ");
    scanf("%d", &n);

    int arr[n];
    printf("Enter elements: ");
    for (int i = 0; i < n; i++)
        scanf("%d", &arr[i]);

    timSort(arr, n);

    printf("Sorted array: ");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);

    return 0;
}
      

const MIN_RUN = 32;

function insertionSort(arr, left, right) {
  for (let i = left + 1; i <= right; i++) {
    let key = arr[i];
    let j = i - 1;

    while (j >= left && arr[j] > key) {
      arr[j + 1] = arr[j];
      j--;
    }
    arr[j + 1] = key;
  }
}

function merge(arr, l, m, r) {
  let left = arr.slice(l, m + 1);
  let right = arr.slice(m + 1, r + 1);

  let i = 0, j = 0, k = l;

  while (i < left.length && j < right.length) {
    if (left[i] <= right[j]) arr[k++] = left[i++];
    else arr[k++] = right[j++];
  }

  while (i < left.length) arr[k++] = left[i++];
  while (j < right.length) arr[k++] = right[j++];
}

function timSort(arr) {
  let n = arr.length;

  for (let i = 0; i < n; i += MIN_RUN) {
    insertionSort(arr, i, Math.min(i + MIN_RUN - 1, n - 1));
  }

  for (let size = MIN_RUN; size < n; size *= 2) {
    for (let left = 0; left < n; left += 2 * size) {
      let mid = left + size - 1;
      let right = Math.min(left + 2 * size - 1, n - 1);

      if (mid < right) merge(arr, left, mid, right);
    }
  }
}

let arr = prompt("Enter numbers:").split(" ").map(Number);
timSort(arr);
console.log("Sorted array:", arr);
      

using System;

class Program {

    const int MIN_RUN = 32;

    static void InsertionSort(int[] arr, int left, int right) {
        for (int i = left + 1; i <= right; i++) {
            int key = arr[i];
            int j = i - 1;

            while (j >= left && arr[j] > key) {
                arr[j + 1] = arr[j];
                j--;
            }
            arr[j + 1] = key;
        }
    }

    static void Merge(int[] arr, int l, int m, int r) {
        int leftSize = m - l + 1;
        int rightSize = r - m;

        int[] left = new int[leftSize];
        int[] right = new int[rightSize];

        Array.Copy(arr, l, left, 0, leftSize);
        Array.Copy(arr, m + 1, right, 0, rightSize);

        int i = 0, j = 0, k = l;

        while (i < leftSize && j < rightSize) {
            if (left[i] <= right[j]) arr[k++] = left[i++];
            else arr[k++] = right[j++];
        }

        while (i < leftSize) arr[k++] = left[i++];
        while (j < rightSize) arr[k++] = right[j++];
    }

    static void TimSort(int[] arr) {
        int n = arr.Length;

        for (int i = 0; i < n; i += MIN_RUN)
            InsertionSort(arr, i, Math.Min(i + MIN_RUN - 1, n - 1));

        for (int size = MIN_RUN; size < n; size *= 2) {
            for (int left = 0; left < n; left += 2 * size) {
                int mid = left + size - 1;
                int right = Math.Min(left + 2 * size - 1, n - 1);

                if (mid < right)
                    Merge(arr, left, mid, right);
            }
        }
    }

    static void Main() {
        Console.Write("Enter numbers: ");
        int[] arr = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);

        TimSort(arr);

        Console.Write("Sorted array: ");
        foreach (int x in arr)
            Console.Write(x + " ");
    }
}
      

<?php

define("MIN_RUN", 32);

function insertionSort(&$arr, $left, $right) {
    for ($i = $left + 1; $i <= $right; $i++) {
        $key = $arr[$i];
        $j = $i - 1;

        while ($j >= $left && $arr[$j] > $key) {
            $arr[$j + 1] = $arr[$j];
            $j--;
        }

        $arr[$j + 1] = $key;
    }
}

function mergeArray(&$arr, $l, $m, $r) {
    $left = array_slice($arr, $l, $m - $l + 1);
    $right = array_slice($arr, $m + 1, $r - $m);

    $i = $j = 0;
    $k = $l;

    while ($i < count($left) && $j < count($right)) {
        if ($left[$i] <= $right[$j])
            $arr[$k++] = $left[$i++];
        else
            $arr[$k++] = $right[$j++];
    }

    while ($i < count($left)) $arr[$k++] = $left[$i++];
    while ($j < count($right)) $arr[$k++] = $right[$j++];
}

function timSort(&$arr) {
    $n = count($arr);

    for ($i = 0; $i < $n; $i += MIN_RUN) {
        insertionSort($arr, $i, min($i + MIN_RUN - 1, $n - 1));
    }

    for ($size = MIN_RUN; $size < $n; $size *= 2) {
        for ($left = 0; $left < $n; $left += 2 * $size) {
            $mid = $left + $size - 1;
            $right = min($left + 2 * $size - 1, $n - 1);

            if ($mid < $right)
                mergeArray($arr, $left, $mid, $right);
        }
    }
}

$arr = array_map("intval", explode(" ", readline("Enter numbers: ")));
timSort($arr);

echo "Sorted array: " . implode(" ", $arr);

?>
      
1