zoukankan      html  css  js  c++  java
  • int *bsearch(int *t, int n, int x); 二分查找完全实现

    二分查找是很重要,但也很容易在边界出问题的算法,本人结合二分查找的程序重点标注了几个很容易出错的地方,代码如下:

    #include <stdio.h>
    
    int *bbsearch(int *t, int n, int x)
    {
        int *low = t;
        int *high = t + n;//注意此处取了越界后的第一个地址,这是合法的,但不允许求其值。
    
        while (low < high)//因为high取了越界后的第一个地址,所以应该保证low != high
        {
            int *mid = low + ((high - low) >> 1);//此处的括号绝对不能省略。
    
            if (x < *mid)
            {
                high = mid; //注意因为high取了越界后的第一个地址,所以更新high时也应该保持越界。
            }
            else if(x > *mid)
            {
                low = mid + 1;
            }
            else
            {
                return mid;
            }
        }
        return NULL;
    }
    
    int *bbbsearch(int *t, int n, int x)
    {
        int low = 0, high = n-1;//high 没有越界
    
        while (low <= high)//因为high没有越界,所以会出现low与high相等的情况,表示指向最后一个元素。
        {
            int mid = (low + high) / 2;//也可为(low+high)>>1,其实编译器会自动转换为位运算。
    
            if (x < t[mid])
            {
                high = mid -1;//因为high 没有越界,所以更新high时,也不能越界,即不能取high = mid;
            }
            else if(x > t[mid])
            {
                low = mid + 1;
            }
            else
            {
                return &t[mid];//也可为t+mid
            }
        }
        return NULL;
    }
    
    int main(void)
    {
        int s[10]= {0,1,2,3,4,5,6};
    
        printf("%d
    ", *bbbsearch(s,7,2));
    }
  • 相关阅读:
    Liskov替换原则
    OCP开放封闭原则
    SRC单一职责原则
    什么是敏捷设计
    [WCF编程]13.并发:服务并发模式
    [WCF编程]12.事务:服务事务编程(下)
    [WCF编程]12.事务:服务事务编程(上)
    [WCF编程]12.事务:Transaction类
    [WCF编程]12.事务:事务传播
    [WCF编程]12.事务:事务协议与管理器
  • 原文地址:https://www.cnblogs.com/qianggezhishen/p/7349511.html
Copyright © 2011-2022 走看看