c语言实现的通用二分查找算法
作者:wallwind
来源:http://blog.csdn.net/wallwind/article/details/8272141
// /* 二分查找是基于排好序的算法。复杂度低,并且很高效, 由于项目中大量使用的了二分查找,但是又不能每个业务实现一个 因此有必要实现一个通用的二分查找 其主要思想:通过对已经排好序的数组,进行数据指针的比较。 @const void *key 需要查找的key值 @const void *base, 所要查找数据的首地址 @int nmemb,所要查找的成员数量 @int size, 每个元素的大小 @int *piEqual,是否能查找到的标志查到为1,否则为0 */ int bsearch_int (const void *key, const void *base, int nmemb, int size, int *piEqual) { size_t l, u, idx; const void *p, *p2; int comparison, comparison2; *piEqual = 0; if (nmemb < 0) return -1; if (!nmemb) return 0; l = 0; u = nmemb; while (l < u) { idx = (l + u) / 2; p = (void *) (((const char *) base) + (idx * size)); comparison = *(int *)key - *(int *)p ; if (comparison == 0) { *piEqual = 1; return idx; } else if (comparison < 0) { if (idx == 0) return idx; p2 = (void *) (((const char *) base) + ((idx - 1) * size)); comparison2 = *(int *)key - *(int *)p2 ; if (comparison2 > 0) return idx; u = idx; } else /*if (comparison > 0)*/ { l = idx + 1; } } return u; }