p132<二分查找法的边界问题>:
编写一个函数,查找有序整形数组中的元素。返回值:指向找到元素的指针,如果没有,返回NULL。参数:指向整型数组的指针、数组元素的个数、要查找的元素。见代码:
#include <stdio.h> /*不对称边界*/ int *bsearch_0(int *t, int n, int x) { int lo = 0; int hi = n;/*上界是第一个出界点*/ int mid = 0; while(lo < hi) { //mid = (lo + hi)/2; mid = (lo + hi) >> 1; if(x < t[mid]) { hi = mid; } else if(x > t[mid]) { lo = mid +1; } else { return (t + mid); } } return NULL; } /*不对称边界的指针形式*/ int *bsearch_1(int *t, int n, int x) { int *lo = t; int *hi = t + n; int *mid; while(lo < hi) { //mid = lo + (hi - lo >> 1);/*注意优先级问题*/ /*不能用mid=lo+hi,两个指针除了在某种情况下能相减,不能进行别的运算*/ mid = lo + (hi - lo)/2; /*下面不是x<*(t+mid)*/ if(x < *mid) { hi = mid; } else if(x > *mid) { lo = mid +1; } else { return mid; } } return NULL; } /*对称边界*/ int *bsearch_2(int *t, int n, int x) { int lo = 0; int hi = n - 1;/*上界为数组最后一个元素*/ int mid = 0; while(lo <= hi)/**/ { //mid = (lo + hi)/2; mid = (lo + hi) >> 1; 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时,(t + (n-1))是一个无效地址 * 因此需要对n==0时做单独判断 */ int main(void) { int a[5] = {1,2,3,4,5}; int *p; int x = 0; printf("Input the Number what you want:"); scanf("%d", &x); p = bsearch_2(a, 5, x); if(NULL == p) { printf("\nNo such number!\n"); getch(); return 1; } printf("%d\n", *p); getch();/*用getchar要从输入缓冲读取,getch无缓冲*/ return 0; }
2011-02-23 12:02:32