Advertisement
Guest User

Untitled

a guest
Sep 7th, 2019
287
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. {-# LANGUAGE BangPatterns, ScopedTypeVariables #-}
  2. module Main where
  3. import           Control.Monad.Primitive
  4. import           Control.Applicative ((<$>))
  5. import qualified Data.Vector.Unboxed as V
  6. import qualified Data.Vector.Unboxed.Mutable as M
  7.  
  8. partition :: (PrimMonad m, Ord a, M.Unbox a) => Int -> M.MVector (PrimState m) a -> m Int
  9. partition !pi !v = do
  10.     pv <- M.unsafeRead v pi
  11.     M.unsafeSwap v pi lastIdx
  12.     pi' <- go pv 0 0
  13.    M.unsafeSwap v pi' lastIdx
  14.     return pi'
  15.  where
  16.    !lastIdx = M.length v - 1
  17.  
  18.    go !pv i !si | i < lastIdx =
  19.       do iv <- M.unsafeRead v i
  20.          if iv < pv
  21.            then M.unsafeSwap v i si >> go pv (i+1) (si+1)
  22.            else go pv (i+1) si
  23.    go _   _ !si                = return si
  24.  
  25. qsort :: (PrimMonad m, Ord a, M.Unbox a) => M.MVector (PrimState m) a -> m ()
  26. qsort v | M.length v < 2 = return ()
  27. qsort v                    = do
  28.    let !pi = M.length v `div` 2
  29.    pi' <- partition pi v
  30.     qsort (M.unsafeSlice 0 pi' v)
  31.    qsort (M.unsafeSlice (pi'+1) (M.length v - (pi'+1)) v)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement