#include <stdio.h>
int BinarySearch(double *vals, int size, double ref);
int main(void) {
// list to be searched (sorted)
double vals[] = { 2.718, 3.14, 6.022, 10.23 };
int size = sizeof(vals)/sizeof(vals[0]);
// list where each value is searched
double chks[] = { 2.0, 3.13, 3.14, 3.15, 15.0 };
int num = sizeof(chks)/sizeof(chks[0]);
for(int idx=0; idx<num; idx++) {
int pos = BinarySearch(vals, size, chks[idx]);
if (pos >= 0) {
printf("pos = %d, %f for %f\n", pos
, vals
[pos
], chks
[idx
]); } else {
printf("not found for %f\n", chks
[idx
]); }
}
return 0;
}
int BinarySearch(double *vals, int size, double target) {
int start = 0;
int end = size - 1;
int mid;
if (target < vals[start] || target > vals[end]) {
return -1;
}
while (start <= end) {
mid = (start + end) / 2;
if (mid == (start+1) && (target >= vals[start]) && (target < vals[mid])) {
return start;
} else if (target < vals[mid]) {
end = mid - 1;
} else {
start = mid + 1;
}
}
if (end < start) {
return end;
}
return start;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgppbnQgQmluYXJ5U2VhcmNoKGRvdWJsZSAqdmFscywgaW50IHNpemUsIGRvdWJsZSByZWYpOwoKaW50IG1haW4odm9pZCkgewoJLy8gbGlzdCB0byBiZSBzZWFyY2hlZCAoc29ydGVkKQoJZG91YmxlIHZhbHNbXSA9IHsgMi43MTgsIDMuMTQsIDYuMDIyLCAxMC4yMyB9OwoJaW50IHNpemUgPSBzaXplb2YodmFscykvc2l6ZW9mKHZhbHNbMF0pOwoKICAgIC8vIGxpc3Qgd2hlcmUgZWFjaCB2YWx1ZSBpcyBzZWFyY2hlZAoJZG91YmxlIGNoa3NbXSA9IHsgMi4wLCAzLjEzLCAzLjE0LCAzLjE1LCAxNS4wIH07CglpbnQgbnVtID0gc2l6ZW9mKGNoa3MpL3NpemVvZihjaGtzWzBdKTsKCglmb3IoaW50IGlkeD0wOyBpZHg8bnVtOyBpZHgrKykgewoJCWludCBwb3MgPSBCaW5hcnlTZWFyY2godmFscywgc2l6ZSwgY2hrc1tpZHhdKTsKCQlpZiAocG9zID49IDApIHsKCQkJcHJpbnRmKCJwb3MgPSAlZCwgJWYgZm9yICVmXG4iLCBwb3MsIHZhbHNbcG9zXSwgY2hrc1tpZHhdKTsKCQl9IGVsc2UgewoJCQlwcmludGYoIm5vdCBmb3VuZCBmb3IgJWZcbiIsIGNoa3NbaWR4XSk7CgkJfQoJfQoJcmV0dXJuIDA7Cn0KCmludCBCaW5hcnlTZWFyY2goZG91YmxlICp2YWxzLCBpbnQgc2l6ZSwgZG91YmxlIHRhcmdldCkgewoJaW50IHN0YXJ0ID0gMDsKCWludCBlbmQgPSBzaXplIC0gMTsKCWludCBtaWQ7CgkKCWlmICh0YXJnZXQgPCB2YWxzW3N0YXJ0XSB8fCB0YXJnZXQgPiB2YWxzW2VuZF0pIHsKCQlyZXR1cm4gLTE7Cgl9CgoJd2hpbGUgKHN0YXJ0IDw9IGVuZCkgewoJCW1pZCA9IChzdGFydCArIGVuZCkgLyAyOwoJCWlmIChtaWQgPT0gKHN0YXJ0KzEpICYmICh0YXJnZXQgPj0gdmFsc1tzdGFydF0pICYmICh0YXJnZXQgPCB2YWxzW21pZF0pKSB7CgkJCXJldHVybiBzdGFydDsKCQl9IGVsc2UgaWYgKHRhcmdldCA8IHZhbHNbbWlkXSkgewoJCQllbmQgPSBtaWQgLSAxOwoJCX0gZWxzZSB7CgkJCXN0YXJ0ID0gbWlkICsgMTsKCQl9Cgl9CgkKCWlmIChlbmQgPCBzdGFydCkgewoJCXJldHVybiBlbmQ7Cgl9CglyZXR1cm4gc3RhcnQ7Cn0KCg==