Build the sorted prefix one item at a time, shifting larger values right until the current key can be inserted.

Algorithm

The checked-in replay follows the same small input and final output across all 21 DSA books, so this Fortran DSA implementation can be compared directly with the other languages.

sorted prefix Positions before the scan index are already sorted.
shifting Larger values move one slot right to make room for the key.

Basic Implementation

basic.f90
Replay: real traced execution (multi-file project)
program sort_insertion
    implicit none
    integer :: arr(5) = [5, 1, 4, 2, 8]
    integer :: i, j, key
    do i = 2, 5
        key = arr(i)
        j = i - 1
        do while (j >= 1 .and. arr(j) > key)
            arr(j + 1) = arr(j)
            j = j - 1
        end do
        arr(j + 1) = key
    end do
    print '(*(I0,1X))', arr
end program sort_insertion
  1. arr ← [5, 1, 4, 2, 8]

    1program sort_insertion2    implicit none
    values this step[5, 1, 4, 2, 8]arr
  2. arr ← [1, 5, 4, 2, 8]

    1program sort_insertion2    implicit none
    values this step[5, 1, 4, 2, 8] [1, 5, 4, 2, 8]arr1key
  3. arr ← [1, 4, 5, 2, 8]

    7j = i - 18do while (j >= 1 .and. arr(j) > key)9    arr(j + 1) = arr(j)
    values this step[1, 5, 4, 2, 8] [1, 4, 5, 2, 8]arr4key
  4. arr ← [1, 2, 4, 5, 8]

    7j = i - 18do while (j >= 1 .and. arr(j) > key)9    arr(j + 1) = arr(j)
    values this step[1, 4, 5, 2, 8] [1, 2, 4, 5, 8]arr2key
  5. stdout ← 1 2 4 5 8

    13    end do14    print '(*(I0,1X))', arr15end program sort_insertion
    values this step1 2 4 5 8stdout[1, 2, 4, 5, 8]arr

Complexity

  • Time: O(n^2) worst and average, O(n) best
  • Space: O(1)
  • Stable: yes

Implementation notes

  • Keep the explicit algorithmic steps instead of calling a standard-library sort. The replay is meant to expose comparisons, movement, and recursion.
  • The implementation is intentionally compact for learning and replay, not a production sorting utility.