刚开始总是没有把握好跳出的条件,在查找不到数据的时候会导致死循环,最后才发现原来没有向中间靠拢一个位。
3 int bisearch(int a[],int len,int data)
4 {
5 int l = len-1;
6 int k = 0;
7 while(k<=l)
8 {
9 printf("%d %d\n",k,l);
10
11 if(a[k+(l-k)/2]>data)
12 {
13 l=k+(l-k)/2-1;
14 }
15 else if(a[k+(l-k)/2]<data)
16 {
17 k=k+(l-k)/2+1;
18 }
19 else
20 {
21 return data;
22 }
23 }
24 return -1;
25 }
k代表起始位,l代表结束位,记得+1和-1才能跳出。
别人写的二分查找:
- int binary_search(int array[],int n,int value)
- {
- int begin = 0, end = n-1, mid = 0;
- bool flag =0; //判断数据的排序方式,从小到大则为1,从大到小则为0
- for(int i = 0; i < n-1; ++i) //1
- {
- if(array[i] < array[i+1])
- {
- flag = 1;
- break;
- }
- if(array[i] > array[i+1])
- {
- flag = 0;
- break;
- }
- }
- if(flag)
- while(begin <= end) //数据的排序方式,从小到大
- {
- mid = begin/2 + end/2; //2
- if(array[mid] == value)
- return mid;
- if(array[mid] > value)
- end = mid - 1; //3注意-1
- else
- begin = mid + 1; //4注意+1
- }
- else
- while(begin <= end) //数据的排序方式,从大到小
- {
- mid = begin/2 + end/2;
- if(array[mid] == value)
- return mid;
- if(array[mid] > value)
- begin = mid + 1;
- else
- end = mid - 1;
- }
- return -1;
- }