Guest User

Untitled

a guest
Feb 16th, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.51 KB | None | 0 0
  1. import Control.Monad.ST
  2. import Data.Array.ST
  3. import Data.Foldable
  4. import Control.Monad
  5.  
  6. -- wiki-copied code starts here
  7. partition arr left right pivotIndex = do
  8. pivotValue <- readArray arr pivotIndex
  9. swap arr pivotIndex right
  10. storeIndex <- foreachWith [left..right-1] left (\i storeIndex -> do
  11. val <- readArray arr i
  12. if (val <= pivotValue)
  13. then do
  14. swap arr i storeIndex
  15. return (storeIndex + 1)
  16. else do
  17. return storeIndex )
  18. swap arr storeIndex right
  19. return storeIndex
  20.  
  21. qsort arr left right = when (right > left) $ do
  22. let pivotIndex = left + ((right-left) `div` 2)
  23. newPivot <- partition arr left right pivotIndex
  24.  
  25. qsort arr left (newPivot - 1)
  26. qsort arr (newPivot + 1) right
  27.  
  28. -- wrapper to sort a list as an array
  29. sortList xs = runST $ do
  30. let lastIndex = length xs - 1
  31. arr <- newListArray (0,lastIndex) xs :: ST s (STUArray s Int Int)
  32. qsort arr 0 lastIndex
  33. newXs <- getElems arr
  34. return newXs
  35.  
  36. -- test example
  37. main = print $ sortList [212498,127,5981,2749812,74879,126,4,51,2412]
  38.  
  39. -- helpers
  40. swap arr left right = do
  41. leftVal <- readArray arr left
  42. rightVal <- readArray arr right
  43. writeArray arr left rightVal
  44. writeArray arr right leftVal
  45.  
  46. -- foreachWith takes a list, and a value that can be modified by the function, and
  47. -- it returns the modified value after mapping the function over the list.
  48. foreachWith xs v f = foldlM (flip f) v xs
Add Comment
Please, Sign In to add comment