Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import Control.Parallel.Strategies
- data Tree a = Leaf a | Node (Tree a) (Tree a) deriving (Show)
- listToTree [] = error "listToTree -- empty list"
- listToTree [x] = Leaf x
- listToTree xs = Node (listToTree $ take half xs) (listToTree $ drop half xs)
- where half = floor ((toRational $ length xs) / 2)
- mergeSort' :: Ord a => Tree a -> Eval [a]
- mergeSort' (Leaf v) = return [v]
- mergeSort' (Node x y) = do
- xr <- mergeSort' x
- yr <- mergeSort' y
- rseq (merge xr yr)
- where
- merge [] y = y
- merge x [] = x
- merge (x:xs) (y:ys) | x < y = x : merge xs (y:ys)
- | otherwise = y : merge (x:xs) ys
- mergeSort = runEval . mergeSort'
- main = (mergeSort $ listToTree [10000000,9999999..1]) `seq` putStrLn "done"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement