Advertisement
Guest User

Untitled

a guest
Oct 24th, 2014
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.90 KB | None | 0 0
  1. -- qsort :: Array -> beginning of subsection -> end of subsection ->
  2. -- index of first square gt pivot -> index of next unpartitioned point
  3. qsort :: (IOArray Int Int) -> Int -> Int -> IO ()
  4. qsort arr min mx =
  5. if mx - min < 1 then do
  6. return ()
  7.  
  8. else do
  9. p <- readArray arr min
  10. --foldM :: Monad m => (a -> b -> m a) -> a -> [b] -> m a
  11. final_i <- foldM (partitioner p) (min+1) [(min+1)..mx]
  12. swap min $ final_i - 1
  13. qsort arr min (final_i-2)
  14. qsort arr final_i mx
  15.  
  16. where
  17. swap i j = do
  18. arr_i <- readArray arr i
  19. arr_j <- readArray arr j
  20. writeArray arr i arr_j
  21. writeArray arr j arr_i
  22.  
  23. partitioner p i idx = do
  24. arr_idx <- readArray arr idx
  25. if arr_idx > p then
  26. return i
  27. else do
  28. swap i idx
  29. return $ i+1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement