c语言 二分法查找

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

写了一个二分法查找的函数,主要避免有以下几个容易出现漏洞的地方(适用于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;
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 ancjf@163.com

文章标题:c语言 二分法查找

本文作者:ancjf

发布时间:2020-09-15, 08:51:53

最后更新:2020-09-15, 08:53:11

原始链接:http://ancjf.com/2020/09/15/c%E8%AF%AD%E8%A8%80-%E4%BA%8C%E5%88%86%E6%B3%95%E6%9F%A5%E6%89%BE/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏