c语言 二分法查找 修正版 漏洞 二分法 32位

写了一个二分法查找的函数,主要避免有以下几个容易出现漏洞的地方(适用于32位机器)。

 

1:unsigned int len 用unsigned int类型这样可以查找大于等于2G的数据

2:unsigned int la=0, he = len-1, mid; 用unsigned int类型 这样在{mid = la+((he-la)>>1);}语句里可以用位移,没用{mid = (la+he)>>1;}是因为(la+he)可能会越界,即大于等于4G

3:用  if( mid == 0 ) return INVALID_LEN;是因为可能会出现mid == la == he == 0时, 再执行he = mid - 1; 后he=4g-1的情况

4: 返回unsigned int类型

 

 

#include <stdio.h>
#include <stdlib.h>

 

#define INVALID_LEN  0xfffffffff

 

unsigned int binsearch(int *p, unsigned int len, int key)
{
    if( p == NULL || len == 0 || len == INVALID_LEN ) return INVALID_LEN;
   
    unsigned int la=0, he = len-1, mid=0;
   
    while(la <= he )
    {
        mid = la+((he-la)>>1);
        if( key == p[ mid ] )
        {
            return  mid;
        }
        else if( key > p[ mid ] )
        {
            la = mid + 1;
        }
        else
        {
            if( mid == 0 ) return INVALID_LEN;
            he = mid - 1;
        }
    }
   
    return INVALID_LEN;
}                 
       
int main(int argc, char *argv[])
{
    const int len = 100;
   
    int *p = (int*)malloc(len*sizeof(int));
    if( p ==   NULL ) return -1;
   
    int i;
    for(i=0; i<len; i++) p[i] = i;
   
    printf("%d/n", binsearch(p, len, 0));
   
    system("PAUSE"); 
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值