Este algoritmo apoia-se numa função auxiliar que insere um elemento numa lista já ordenada.
insert :: (Ord a) => a -> [a] -> [a]
insert x [] = [x]
insert x (y:ys) | x<=y = x:y:ys
| otherwise = y : insert x ys
--Exemplo:
insert 7 [2,5,9]
= 2 : insert 7 [5,9]
= 2 : 5 : insert 7 [9]
= 2:5:7:9:[]
= [2,5,7,9]
A função de ordenação da lista define-se por casos :
isort :: (Ord a) => [a] -> [a]
isort [] = []
isort (x:xs) = insert x (isort xs)
--Exemplo:
isort [4,7,2] = insert 4 (isort [7,2])
= insert 4 (insert 7 (isort [2]))
= insert 4 (insert 7 (insert 2 (isort [])))
= insert 4 (insert 7 (insert 2 []))
= insert 4 (insert 7 [2]) = …
= insert 4 [2,7] = … = [2,4,7]