import numpy as np
arr = np.array([0.23, 2.32, 4.04, 5.02, 6.84, 10.12, 10.34, 11.93,12.44])
def binary_search(arr, val):
# val must be in the closed interval between arr[i-1] and arr[i],
# unless one of i-1 or i is beyond the bounds of the array.
i = np.searchsorted(arr, val)
if i == 0:
# Smaller than the smallest element
return i
elif i == len(arr):
# Bigger than the biggest element
return i - 1
elif val - arr[i - 1] <= arr[i] - val:
# At least as close to arr[i - 1] as arr[i]
return i - 1
else:
# Closer to arr[i] than arr[i - 1]
return i
cases = [10, 12, 100, 10.12, 12.43, 0.5]
print(*[binary_search(arr, c) for c in cases], sep=',')
print(*[arr[binary_search(arr, c)] for c in cases], sep=',')
aW1wb3J0IG51bXB5IGFzIG5wCgphcnIgPSBucC5hcnJheShbMC4yMywgMi4zMiwgNC4wNCwgNS4wMiwgNi44NCwgMTAuMTIsIDEwLjM0LCAxMS45MywxMi40NF0pCgpkZWYgYmluYXJ5X3NlYXJjaChhcnIsIHZhbCk6CgkjIHZhbCBtdXN0IGJlIGluIHRoZSBjbG9zZWQgaW50ZXJ2YWwgYmV0d2VlbiBhcnJbaS0xXSBhbmQgYXJyW2ldLAoJIyB1bmxlc3Mgb25lIG9mIGktMSBvciBpIGlzIGJleW9uZCB0aGUgYm91bmRzIG9mIHRoZSBhcnJheS4KCWkgPSBucC5zZWFyY2hzb3J0ZWQoYXJyLCB2YWwpCgkKCWlmIGkgPT0gMDoKCQkjIFNtYWxsZXIgdGhhbiB0aGUgc21hbGxlc3QgZWxlbWVudAoJCXJldHVybiBpCgllbGlmIGkgPT0gbGVuKGFycik6CgkJIyBCaWdnZXIgdGhhbiB0aGUgYmlnZ2VzdCBlbGVtZW50CgkJcmV0dXJuIGkgLSAxCgllbGlmIHZhbCAtIGFycltpIC0gMV0gPD0gYXJyW2ldIC0gdmFsOgoJCSMgQXQgbGVhc3QgYXMgY2xvc2UgdG8gYXJyW2kgLSAxXSBhcyBhcnJbaV0KCQlyZXR1cm4gaSAtIDEKCWVsc2U6CgkJIyBDbG9zZXIgdG8gYXJyW2ldIHRoYW4gYXJyW2kgLSAxXQoJCXJldHVybiBpCgpjYXNlcyA9IFsxMCwgMTIsIDEwMCwgMTAuMTIsIDEyLjQzLCAwLjVdCnByaW50KCpbYmluYXJ5X3NlYXJjaChhcnIsIGMpIGZvciBjIGluIGNhc2VzXSwgc2VwPScsJykKcHJpbnQoKlthcnJbYmluYXJ5X3NlYXJjaChhcnIsIGMpXSBmb3IgYyBpbiBjYXNlc10sIHNlcD0nLCcp
5,7,8,5,8,0
10.12,11.93,12.44,10.12,12.44,0.23