c语言的通用二分查找算法

2013-07-22 17:57:33 · 作者: · 浏览: 223

  [cpp]

  //

  /*

  二分查找是基于排好序的算法。复杂度低,并且很高效,

  由于项目中大量使用的了二分查找,但是又不能每个业务实现一个

  因此有必要实现一个通用的二分查找

  其主要思想:通过对已经排好序的数组,进行数据指针的比较。

  @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;

  }