二分查找算法


1.采用对称边界数组实现(也是二分查找通常的实现方式)

    优点:程序看上去整齐

    缺点:效率有待提升,不如”纯指针“形式快

代码如下:

  1 /**基本二分查找算法——基于数组**/
  2 int * bsearch(int *t, int n, int x){
  3     int lo = 0, hi = n-1;        /*这里不能把hi初始化为t+n-1*/
  4     while (lo <= hi){ 
  5         int mid = (hi + lo) / 2;
  6         if (x < t[mid])
  7             hi = mid -1;
  8         else if (x > t[mid])
  9             lo = mid + 1;
 10         else
 11             return t + mid;
 12     }
 13     return NULL;
 14 }

2.采用不对称边界指针形式实现

    优点:效率高

    缺点:可读性不如前者

代码如下:

  /**二分查找算法——指针形式**/
  2 int * bsearch(int *t, int n, int x){
  3     int *lo = t, *hi = t+n;     
  4     while (lo < hi){
  5         int *mid = lo+((hi - lo) >> 1);
  6         if (x < *mid)
  7             hi = mid;
  8         else if (x > *mid)
  9             lo = mid + 1;
 10         else
 11             return mid;
 12     }
 13     return NULL;
 14 }

 

说明:

    第3行:使用了数组中实际不存在的“溢界“元素的地址"t+n",这在许多的C标准中都是允许的(如ANSI C),这个地址可以用于赋值和比较,但是不能引用该元素。

    第5行:采用移位运算代替除法运算,可以提高效率;算数运算比移位运算优先级高,采用括号分隔;两个指针的加法运算非法,所以采用减法“hi-lo”的形式。

   



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值