Sorting Algorithms
Insertion Sort
Section titled “Insertion Sort”insert :: Ord a => a -> [a] -> [a]insert x [] = [x]insert x (y:ys) | x < y = x:y:ys | otherwise = y:(insert x ys)
isort :: Ord a => [a] -> [a]isort [] = []isort (x:xs) = insert x (isort xs)Example use:
> isort [5,4,3,2,1]Result:
[1,2,3,4,5]Permutation Sort
Section titled “Permutation Sort”Also known as bogosort.
import Data.List (permutations)
sorted :: Ord a => [a] -> Boolsorted (x:y:xs) = x <= y && sorted (y:xs)sorted _ = True
psort :: Ord a => [a] -> [a]psort = head . filter sorted . permutationsExtremely inefficient (on today’s computers).
Merge Sort
Section titled “Merge Sort”Ordered merging of two ordered lists
Preserving the duplicates:
merge :: Ord a => [a] -> [a] -> [a]merge xs [] = xsmerge [] ys = ysmerge (x:xs) (y:ys) | x <= y = x:merge xs (y:ys) | otherwise = y:merge (x:xs) ysTop-down version:
msort :: Ord a => [a] -> [a]msort [] = []msort [a] = [a]msort xs = merge (msort (firstHalf xs)) (msort (secondHalf xs))
firstHalf xs = let { n = length xs } in take (div n 2) xssecondHalf xs = let { n = length xs } in drop (div n 2) xsIt is defined this way for clarity, not for efficiency.
Example use:
> msort [3,1,4,5,2]Result:
[1,2,3,4,5]Bottom-up version:
msort [] = []msort xs = go [[x] | x <- xs] where go [a] = a go xs = go (pairs xs) pairs (a:b:t) = merge a b : pairs t pairs t = tQuicksort
Section titled “Quicksort”qsort :: (Ord a) => [a] -> [a]qsort [] = []qsort (x:xs) = qsort [a | a <- xs, a < x] ++ [x] ++ qsort [b | b <- xs, b >= x]Bubble sort
Section titled “Bubble sort”bsort :: Ord a => [a] -> [a]bsort s = case bsort' s of t | t == s -> t | otherwise -> bsort t where bsort' (x:x2:xs) | x > x2 = x2:(bsort' (x:xs)) | otherwise = x:(bsort' (x2:xs)) bsort' s = sSelection sort
Section titled “Selection sort”Selection sort selects the minimum element, repeatedly, until the list is empty.
import Data.List (minimum, delete)
ssort :: Ord t => [t] -> [t]ssort [] = []ssort xs = let { x = minimum xs } in x : ssort (delete x xs)