[ create a new paste ] login | about

Link: http://codepad.org/vDlH0vR7    [ raw code | output | fork ]

edvakf - Haskell, pasted on Dec 2:
mergeSort :: Ord a => [a] -> [a]
mergeSort = mergeSortBy compare

mergeSortBy :: Ord a => (a -> a -> Ordering) -> [a] -> [a]
mergeSortBy cmp xs = mergeSortBy' cmp xs $ length xs

mergeSortBy' :: Ord a => (a -> a -> Ordering) -> [a] -> Int -> [a]
mergeSortBy' _ [] _ = []
mergeSortBy' _ [x] _ = [x]
mergeSortBy' cmp xs len = mergeBy cmp (mergeSortBy' cmp ys a) (mergeSortBy' cmp zs b)
        where
            (a,b) = if even len then (len `div` 2, len `div` 2) else (len `div` 2 + 1, len `div` 2)
            (ys, zs) = splitAt a xs

mergeBy :: Ord a => (a -> a -> Ordering) -> [a] -> [a] -> [a]
mergeBy _ xs [] = xs
mergeBy _ [] ys = ys
mergeBy cmp xs@(x:xs') ys@(y:ys') =
    if cmp x y == GT
    then y:(mergeBy cmp xs ys')
    else x:(mergeBy cmp xs' ys) 

main = print $ mergeSort [2,3,4,5,4,3,6,3,2]


Output:
1
[2,2,3,3,3,4,4,5,6]


Create a new paste based on this one


Comments: