# Insertion sort: the “natural” sort#

Our first and simplest sort is insertion sort. Insertion sort takes a list and returns a new, sorted list that’s a permutation of its input.

Insertion sort depends on two simple recursive functions: `insertion_sort` does the sorting, and `insert_sorted` takes an element `v` and a sorted list `l` and puts `v` in the right place. Here’s the algorithm:

```-- insertion sort on a list l
insertion_sort(l):
if l is empty, return the empty list
split l into the first element x and the rest l'
return insert_sorted(x, insertion_sort(l'))
```

So simple! The intuition is that `res` is always sorted, and each time we insert `x` into `res`, we get a new, longer sorted list back. If we do that for every element in `l`, we’re done. The critical question is: how does `insert_sorted` work?

```-- insert_sorted takes an element v and a SORTED list l
-- returns a new list, with v in the right place
insert_sorted(v, l):
if l is empty:
return the list containing just v
x = first element of l
if v < x:
return v followed by l
otherwise:
return x followed by insert_sorted(v, l'), where l' is the rest of l after y
```

Let’s see it in Python code: