#include <stdlib.h> | |
void* bsearch(const void* key, | |
const void* base, | |
size_t nel, | |
size_t width, | |
int (*cmp)(const void*, const void*)) { | |
void* try | |
; | |
int sign; | |
while (nel > 0) { | |
try | |
= (char*)base + width * (nel / 2); | |
sign = cmp(key, try); | |
if (!sign) | |
return try | |
; | |
else if (nel == 1) | |
break; | |
else if (sign < 0) | |
nel /= 2; | |
else { | |
base = try | |
; | |
nel -= nel / 2; | |
} | |
} | |
return NULL; | |
} |