strandSort :: Ord a => [a] -> [a] strandSort list = doStrandSort list [] [] [] doStrandSort :: Ord a => [a] -> [a] -> [a] -> [a] -> [a] doStrandSort [] [] [] result = result doStrandSort [] sublist unsorted result = doStrandSort unsorted [] [] (merge (reverse sublist) result) doStrandSort input [] unsorted result = doStrandSort (tail input) [head input] unsorted result doStrandSort input sublist unsorted result = if (head input) >= (head sublist) then doStrandSort (tail input) ((head input):sublist) unsorted result else doStrandSort (tail input) sublist ((head input):unsorted) result merge :: Ord a => [a] -> [a] -> [a] merge [] y = y merge x [] = x merge (x:xs) (y:ys) = if x <= y then x:(merge xs (y:ys)) else y:(merge (x:xs) ys)