|
Function BinarySearch(arr As Variant, search As Variant, _
Optional lastEl As Variant) As Long Dim index As Long Dim first As Long Dim last As Long Dim middle As Long Dim inverseOrder As Boolean ' account for optional arguments If IsMissing(lastEl) Then lastEl = UBound(arr) ' deduct direction of sorting inverseOrder = (arr(first) > arr(last)) first = LBound(arr) last = lastEl ' assume searches failed BinarySearch = first - 1 Do middle = (first + last) \ 2 If arr(middle) = search Then BinarySearch = middle Exit Do ElseIf ((arr(middle) < search) Xor inverseOrder) Then first = middle + 1 Else last = middle - 1 End If Loop Until first > last End Function |