数组的二分查找的优化及对称边界的另一种写法

数组二分查找的优化代码:(优化的地方在于最大限度地减少寻址运算,用指针代替下标运算,另外就是除法运算用移位运算代替)

int *bsearch(int *t, int n, int x){//不对称边界
    int *lo = t, *hi = t + n;
    while(lo < hi){
        int *mid = lo + ( (hi - lo) >> 1 );
        if(x < *mid)
            hi = mid;
        else if(x > *mid)
            lo = mid + 1;
        else
            return mid;
    }
}

采用对称边界来表达二分查找(看上去整齐许多):

int *bsearch(int *t, int n, int x){//对称边界
    int lo = 0, hi = n - 1;
    while(lo <= hi){
        int mid = (hi + lo)/2;
        if(x < t[mid])
            hi = mid - 1;
        else if(x > t[mid])
            lo = mid + 1;
        else
            return t + mid;
    }
    return NULL;
}

但是采用对称边界的写法如果想要改写成“纯指针”的形式,就会遇到麻烦。问题在于,我们不能把hi初始化为t + n - 1。因为当n为0时,这是一个无效地址。因此,如果我们还想把程序改写成指针的形式,就必须对n = 0的情形进行单独的测试。这从另一个角度又一次说明了为什么应该采用不对称边界。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值