Binary search: Difference between revisions

→‎{{header|Haskell}}: Added a test, ran hlint, hindent
(→‎{{header|Haskell}}: Added a test, ran hlint, hindent)
Line 1,781:
=={{header|Haskell}}==
The algorithm itself, parametrized by an "interrogation" predicate ''p'' in the spirit of the explanation above:
<lang haskell>binarySearchimport ::Data.Array Integral(Array, a =>Ix, (a -> Ordering!), -> (alistArray, abounds) -> Maybe a
 
binarySearch p (low,high)
-- BINARY SEARCH --------------------------------------------------------------
bSearch
:: Integral a
=> (a -> Ordering) -> (a, a) -> Maybe a
binarySearchbSearch p (low, high)
| high < low = Nothing
| otherwise =
let mid = (low + high) `div` 2 in
in case p mid of
LT -> binarySearchbSearch p (low, mid - 1)
GT -> binarySearchbSearch p (mid + 1, high)
EQ -> Just mid</lang>
 
-- Application to an array:
<lang haskell>import Data.Array
bSearchArray
:: (Ix i, Integral i, Ord e)
=> Array i e -> e -> Maybe i
bSearchArray a x = bSearch (compare x . (a !)) (bounds a)
 
-- TEST -----------------------------------------------------------------------
axs
:: (Num i, Ix i)
=> Array i String
axs =
listArray
(0, 11)
[ "alpha"
, "beta"
, "delta"
, "epsilon"
, "eta"
, "gamma"
, "iota"
, "kappa"
, "lambda"
, "mu"
, "theta"
, "zeta"
]
 
main :: IO ()
binarySearchArray :: (Ix i, Integral i, Ord e) => Array i e -> e -> Maybe i
main =
binarySearchArray a x = binarySearch p (bounds a) where
let e = "mu"
p m = x `compare` (a ! m)</lang>
found = bSearchArray axs e
in putStrLn $
'\'' :
e ++
case found of
Nothing -> "' Not found"
Just x -> "' found at index " ++ show x</lang>
{{Out}}
<pre>'mu' found at index 9</pre>
The algorithm uses tail recursion, so the iterative and the recursive approach are identical in Haskell (the compiler will convert recursive calls into jumps).
 
9,659

edits