Hello!
I am trying to implement a binary search function that returns the index of an
exact or the (index + 1) where the item should be inserted in an array if the item to be searched is not found (I am not trying to insert data in the array) .
Right now, the bottleneck of my program is in binarySearch', the function must be called a few billion times.
Do you have any ideas on how to improve the performance of this function?
import Data.Array.IArray
type IntArray a = Array Int a
-- The array must be 0 indexed.
binarySearch :: Ord a => a -> IntArray a -> Int
binarySearch query array =
let (low, high) = bounds array
in
binarySearch' query array low high
binarySearch' :: Ord a => a -> IntArray a -> Int -> Int -> Int
binarySearch' query array !low !high
| low <= high = let ! mid = low + ((high - low) `div` 2)
! midVal = array ! mid
in next mid midVal
| otherwise = -(low + 1)
where next mid midVal
| midVal < query = binarySearch' query array (mid + 1) high
| midVal > query = binarySearch' query array low (mid - 1)
| otherwise = mid
Thank you!
Arnoldo Muller