binarySearch became even better

This commit is contained in:
data-man 2018-05-23 12:40:55 +03:00
commit a093605ab0

View file

@ -84,27 +84,31 @@ proc binarySearch*[T, K](a: openArray[T], key: K,
if (len and (len - 1)) == 0: if (len and (len - 1)) == 0:
# when `len` is a power of 2, a faster shr can be used. # when `len` is a power of 2, a faster shr can be used.
var step = len shr 1 var step = len shr 1
var cmpRes: int
while step > 0: while step > 0:
let i = result or step let i = result or step
if cmp(a[i], key) == 0: cmpRes = cmp(a[i], key)
if cmpRes == 0:
return i return i
if cmp(a[i], key) < 1: if cmpRes < 1:
result = i result = i
step = step shr 1 step = step shr 1
if cmp(a[result], key) != 0: result = -1 if cmpRes != 0: result = -1
else: else:
var b = len var b = len
var cmpRes: int
while result < b: while result < b:
var mid = (result + b) shr 1 var mid = (result + b) shr 1
if cmp(a[mid], key) == 0: cmpRes = cmp(a[mid], key)
if cmpRes == 0:
return mid return mid
if cmp(a[mid], key) < 0: if cmpRes < 0:
result = mid + 1 result = mid + 1
else: else:
b = mid b = mid
if result >= len or cmp(a[result], key) != 0: result = -1 if result >= len or cmpRes != 0: result = -1
proc binarySearch*[T](a: openArray[T], key: T): int = proc binarySearch*[T](a: openArray[T], key: T): int =
## binary search for `key` in `a`. Returns -1 if not found. ## binary search for `key` in `a`. Returns -1 if not found.