数组二分查找的优化代码:(优化的地方在于最大限度地减少寻址运算,用指针代替下标运算,另外就是除法运算用移位运算代替)
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的情形进行单独的测试。这从另一个角度又一次说明了为什么应该采用不对称边界。