{-# language PatternSignatures #-} import Data.List (partition) import Control.Parallel import Control.Parallel.Strategies import System.Environment import System.Random import System.IO import Data.Time.Clock main = do [ n ] <- getArgs gen <- newStdGen let xs :: [ Int ] = take ( read n ) $ randomRs ( 0, 1000 ) gen print $ sum xs start <- getCurrentTime print $ sum $ sort4 2 xs end <- getCurrentTime print $ diffUTCTime end start -- standard (naives Quicksort, Pivot steht links) sort1 [] = [] sort1 (x:xs) = let (lo,hi) = Data.List.partition (<x) xs slo = sort1 lo ; shi = sort1 hi in slo ++ x : shi -- parallele Auswertung sort2 [] = [] sort2 (x:xs) = let (lo,hi) = Data.List.partition (<x) xs slo = sort2 lo ; shi = sort2 hi in slo `par` shi `pseq` ( slo ++ x : shi ) -- ... nur für Rekursionen am Anfang sort3 d xs | null xs || d <= 0 = sort1 xs sort3 d (x:xs) = let (lo,hi) = partition (<x) xs slo = sort3 (d-1) lo shi = sort3 (d-1) hi in slo `par` shi `pseq` ( slo ++ x : shi ) -- ... mit kompletter Forcierung der Resultate sort4 d xs | null xs || d <= 0 = sort1 xs sort4 d (x:xs) = let (lo,hi) = partition (<x) xs slo = sort4 (d-1) lo shi = sort4 (d-1) hi in force slo `par` force shi `pseq` ( slo ++ x : shi ) force xs = xs `using` rdeepseq