{-# LANGUAGE ScopedTypeVariables #-}
import Data.Array.ST
import Data.Array.Unboxed
import Data.Foldable
import Data.Binary
import qualified Data.ByteString.Lazy as B
import System.Random
import System.Directory
import System.Environment
partition
:: (Enum b
, Num b
, Ord e
, Ix b
, MArray a e m
) => a b e
-> b
-> b
-> b
-> m b
partition arr left right pivotIndex = do
pivotValue <- readArray arr pivotIndex
swap arr pivotIndex right
storeIndex <- foreachWith [left..right-1] left (\i storeIndex -> do
val <- readArray arr i
if (val <= pivotValue)
then do
swap arr i storeIndex
else do
swap arr storeIndex right
qsort
:: (Integral t
, Ord e
, Ix t
, MArray a e m
) => a t e
-> t
-> t
-> m
()qsort arr left right = when (right > left) $ do
let pivotIndex
= left
+ ((right
-left
) `
div`
2) newPivot <- partition arr left right pivotIndex
qsort arr left (newPivot - 1)
qsort arr (newPivot + 1) right
swap :: (Ix i, MArray a e m) => a i e -> i -> i -> m ()
swap arr left right = do
leftVal <- readArray arr left
rightVal <- readArray arr right
writeArray arr left rightVal
writeArray arr right leftVal
foreachWith xs v f
= foldlM
(flip f
) v xs
size :: N
size = 1000000
path = "dataH.dat"
type N = Int32
generate :: N -> N -> UArray N N
main = do
fileExist <- doesFileExist path
if fileExist
then do
(arrMutable :: IOUArray N N) <- thaw arrRead
qsort arrMutable 0 size
(arrSorted :: UArray N N) <- freeze arrMutable
else do
(B
.writeFile path
. encode
) $ generate size
(42 :: N
)
ey0jIExBTkdVQUdFIFNjb3BlZFR5cGVWYXJpYWJsZXMgIy19CmltcG9ydCBDb250cm9sLk1vbmFkLlNUCmltcG9ydCBEYXRhLkFycmF5LlNUCmltcG9ydCBEYXRhLkFycmF5LlVuYm94ZWQKaW1wb3J0IERhdGEuQXJyYXkuSU8KaW1wb3J0IERhdGEuRm9sZGFibGUKaW1wb3J0IERhdGEuQmluYXJ5CmltcG9ydCBEYXRhLkludAppbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIEIKaW1wb3J0IENvbnRyb2wuTW9uYWQKaW1wb3J0IFN5c3RlbS5JTwppbXBvcnQgU3lzdGVtLlJhbmRvbQppbXBvcnQgU3lzdGVtLkRpcmVjdG9yeQppbXBvcnQgU3lzdGVtLkVudmlyb25tZW50CgpwYXJ0aXRpb24gOjogKEVudW0gYiwgTnVtIGIsIE9yZCBlLCBJeCBiLCBNQXJyYXkgYSBlIG0pID0+IGEgYiBlIC0+IGIgLT4gYiAtPiBiIC0+IG0gYgpwYXJ0aXRpb24gYXJyIGxlZnQgcmlnaHQgcGl2b3RJbmRleCA9IGRvCiAgcGl2b3RWYWx1ZSA8LSByZWFkQXJyYXkgYXJyIHBpdm90SW5kZXgKICBzd2FwIGFyciBwaXZvdEluZGV4IHJpZ2h0CiAgc3RvcmVJbmRleCA8LSBmb3JlYWNoV2l0aCBbbGVmdC4ucmlnaHQtMV0gbGVmdCAoXGkgc3RvcmVJbmRleCAtPiBkbwoJdmFsIDwtIHJlYWRBcnJheSBhcnIgaQoJaWYgKHZhbCA8PSBwaXZvdFZhbHVlKQoJICB0aGVuIGRvCgkgICAgc3dhcCBhcnIgaSBzdG9yZUluZGV4CgkgICAgcmV0dXJuIChzdG9yZUluZGV4ICsgMSkKCSAgZWxzZSBkbwoJICAgIHJldHVybiBzdG9yZUluZGV4ICkKICBzd2FwIGFyciBzdG9yZUluZGV4IHJpZ2h0CiAgcmV0dXJuIHN0b3JlSW5kZXgKCnFzb3J0IDo6IChJbnRlZ3JhbCB0LCBPcmQgZSwgSXggdCwgTUFycmF5IGEgZSBtKSA9PiBhIHQgZSAtPiB0IC0+IHQgLT4gbSAoKQpxc29ydCBhcnIgbGVmdCByaWdodCA9IHdoZW4gKHJpZ2h0ID4gbGVmdCkgJCBkbwogIGxldCBwaXZvdEluZGV4ID0gbGVmdCArICgocmlnaHQtbGVmdCkgYGRpdmAgMikKICBuZXdQaXZvdCA8LSBwYXJ0aXRpb24gYXJyIGxlZnQgcmlnaHQgcGl2b3RJbmRleAogIHFzb3J0IGFyciBsZWZ0IChuZXdQaXZvdCAtIDEpCiAgcXNvcnQgYXJyIChuZXdQaXZvdCArIDEpIHJpZ2h0Cgpzd2FwIDo6IChJeCBpLCBNQXJyYXkgYSBlIG0pID0+IGEgaSBlIC0+IGkgLT4gaSAtPiBtICgpCnN3YXAgYXJyIGxlZnQgcmlnaHQgPSBkbwogICAgbGVmdFZhbCA8LSByZWFkQXJyYXkgYXJyIGxlZnQKICAgIHJpZ2h0VmFsIDwtIHJlYWRBcnJheSBhcnIgcmlnaHQKICAgIHdyaXRlQXJyYXkgYXJyIGxlZnQgcmlnaHRWYWwKICAgIHdyaXRlQXJyYXkgYXJyIHJpZ2h0IGxlZnRWYWwKCmZvcmVhY2hXaXRoIHhzIHYgZiA9IGZvbGRsTSAoZmxpcCBmKSB2IHhzCgpzaXplIDo6IE4Kc2l6ZSA9IDEwMDAwMDAKCnBhdGggOjogU3RyaW5nCnBhdGggPSAiZGF0YUguZGF0IgoKdHlwZSBOID0gSW50MzIKCmdlbmVyYXRlIDo6IE4gLT4gTiAtPiBVQXJyYXkgTiBOCmdlbmVyYXRlIHNpemUgc2VlZCA9IGxpc3RBcnJheSAoZnJvbUludGVncmFsIDAsIHNpemUpICQgdGFrZSAoKGZyb21JbnRlZ3JhbCBzaXplKSArIDEpIC4gcmFuZG9tUnMgKC0yMjQsIDIyOCkgLiBta1N0ZEdlbiAkIGZyb21JbnRlZ3JhbCBzZWVkCgptYWluIDo6IElPICgpCm1haW4gPSBkbwogIGZpbGVFeGlzdCA8LSBkb2VzRmlsZUV4aXN0IHBhdGgKICBpZiBmaWxlRXhpc3QKCXRoZW4gZG8KCSAgKGFyclJlYWQgOjogVUFycmF5IE4gTikgPC0gcmV0dXJuIC4gZGVjb2RlID08PCBCLnJlYWRGaWxlIHBhdGgKCSAgKGFyck11dGFibGUgOjogSU9VQXJyYXkgTiBOKSA8LSB0aGF3IGFyclJlYWQKCSAgcXNvcnQgYXJyTXV0YWJsZSAwIHNpemUKCSAgKGFyclNvcnRlZCA6OiBVQXJyYXkgTiBOKSA8LSBmcmVlemUgYXJyTXV0YWJsZQoJICBwcmludCAkIGFyclNvcnRlZCAhIDEKCSAgcHJpbnQgJCBhcnJTb3J0ZWQgISBzaXplCgllbHNlIGRvIAogICAgICAoQi53cml0ZUZpbGUgcGF0aCAuIGVuY29kZSkgJCBnZW5lcmF0ZSBzaXplICg0MiA6OiBOKQogICAgICBwcmludCAiUnVuIG1lIGFnYWluISIK