Advertisement
Guest User

Untitled

a guest
Dec 18th, 2013
272
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. data Heap a = Node a (Heap a) (Heap a) | None
  2.    
  3. instance (Show a, Ord a) => Show(Heap a) where
  4.     show None = ""
  5.     show (Node a l r) = "("++(show a)++":"++(show l)++","++(show r)++")"
  6.  
  7. makeUnHeap :: Integer -> Integer -> Heap Integer
  8. makeUnHeap k n = if k >= n
  9.                  then None
  10.                  else Node k (makeUnHeap (2*k+1) n) (makeUnHeap (2*k+2) n)
  11.  
  12. pushDown :: Ord a => Heap a -> Heap a
  13. pushDown None = None
  14. pushDown (Node a None None) = Node a None None
  15. pushDown (Node a None (Node b l r)) = if a >= b then Node a None (Node b l r)
  16.                                     else Node b None (pushDown(Node a l r))
  17. pushDown (Node a (Node b l r) None) = if a >= b then Node a (Node b l r) None
  18.                                     else Node b (pushDown(Node a l r)) None
  19. pushDown (Node a (Node b l r) (Node c h s)) = if a >= b && a >= c
  20.                                             then Node a (Node b l r) (Node c h s)
  21.                                             else (if b >= c && b >= a
  22.                                                   then Node b (pushDown(Node a l r)) (Node c h s)
  23.                                                   else Node c (Node b l r) (pushDown(Node a h s))
  24.                                                  )
  25.  
  26. buildHeap :: Ord a => Heap a -> Heap a
  27. buildHeap None = None
  28. buildHeap (Node a l r) = pushDown(Node a (buildHeap l) (buildHeap r) )
  29.  
  30. {- Too slow!
  31.  
  32. _popElem :: Ord a => Heap a -> [Bool] -> (Heap a, a)
  33. _popElem (Node a l r) [] = (None, a)
  34. _popElem (Node a l r) (f:tail) = if f
  35.                                  then (let (nh,e) = _popElem r tail
  36.                                        in (Node a l nh, e))
  37.                                  else (let (nh,e) = _popElem l tail
  38.                                        in (Node a nh r, e))                                      
  39.  
  40. _path :: Integer -> [Bool]
  41. _path 0 = []
  42. _path n = even n : _path ( quot (n-1) 2 )
  43.  
  44. popLast :: Ord a => Heap a -> Integer -> (Heap a, a)
  45. popLast h n = _popElem h (reverse (_path (n - 1)))
  46. -}
  47.  
  48. popEny :: Ord a => Heap a -> (Heap a, a)
  49. popEny (Node a None None) = (None, a)
  50. popEny (Node a None r) = (Node a None nh, e)
  51.                          where (nh, e) = popEny r
  52. popEny (Node a l r) = (Node a nh r, e)
  53.                          where (nh, e) = popEny l
  54.  
  55.  
  56. changeHead :: Ord a => Heap a -> a -> Heap a
  57. changeHead (Node a l r) b = Node b l r
  58.  
  59. getRSorted :: Ord a => Heap a -> Integer -> [a]
  60. getRSorted None 0 = []
  61. getRSorted (Node a l r) 1 = [a]
  62. getRSorted (Node a l r) n = a : getRSorted ( pushDown(changeHead nh e) ) (n - 1)
  63.                             where (nh, e) = popEny (Node a l r)
  64. --                            where (nh, e) = popLast (Node a l r) n
  65.  
  66. getSorted :: Ord a => Heap a -> Integer -> [a]
  67. getSorted h n = reverse(getRSorted h n)
  68.  
  69. main :: IO ()
  70. main = let n = 1000000
  71.        in putStrLn ( if ([0..n-1] == (getSorted(buildHeap(makeUnHeap 0 n)) n))
  72.                      then "OK"
  73.                      else "FAIL"
  74.                    )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement