1.采用对称边界数组实现(也是二分查找通常的实现方式)
优点:程序看上去整齐
缺点:效率有待提升,不如”纯指针“形式快
代码如下:
1 /**基本二分查找算法——基于数组**/
2 int * bsearch(int *t, int n, int x){
3 int lo = 0, hi = n-1; /*这里不能把hi初始化为t+n-1*/
4 while (lo <= hi){
5 int mid = (hi + lo) / 2;
6 if (x < t[mid])
7 hi = mid -1;
8 else if (x > t[mid])
9 lo = mid + 1;
10 else
11 return t + mid;
12 }
13 return NULL;
14 }
2.采用不对称边界指针形式实现
优点:效率高
缺点:可读性不如前者
代码如下:
/**二分查找算法——指针形式**/
2 int * bsearch(int *t, int n, int x){
3 int *lo = t, *hi = t+n;
4 while (lo < hi){
5 int *mid = lo+((hi - lo) >> 1);
6 if (x < *mid)
7 hi = mid;
8 else if (x > *mid)
9 lo = mid + 1;
10 else
11 return mid;
12 }
13 return NULL;
14 }
说明:
第3行:使用了数组中实际不存在的“溢界“元素的地址"t+n",这在许多的C标准中都是允许的(如ANSI C),这个地址可以用于赋值和比较,但是不能引用该元素。
第5行:采用移位运算代替除法运算,可以提高效率;算数运算比移位运算优先级高,采用括号分隔;两个指针的加法运算非法,所以采用减法“hi-lo”的形式。