main :: IO () main = do let unsorted = [10,9..1] putStrLn $ show $ mergesort unsorted mergesort :: Ord a => [a] -> [a] mergesort [] = [] mergesort [x] = [x] mergesort l = let distribute l1 l2 [] = (l1, l2) distribute l1 l2 (x:xs) = distribute l2 (x:l1) xs (l1, l2) = distribute [] [] l in mergesort l1 `merge` mergesort l2 merge :: Ord a => [a] -> [a] -> [a] merge [] ys = ys merge xs [] = xs merge (x:xs) (y:ys) | x <= y = x : merge xs (y:ys) | otherwise = y : merge (x:xs) ys