二分法逻辑:
- 给定N个从小到大排好序的整数序列List[],以及某待查找整数X,
- 我们的目标是找到X在List中的下标。即若有List[i]=X,则返回i;否则返回-1表示没有找到。
- 二分法是先找到序列的中点List[M],与X进行比较,若相等则返回中点下标;
- 否则,若List[M]>X,则在左边的子系列中查找X;若List[M]<X,则在右边的子系列中查找X。
最坏情况下的复杂度 log2(n)
代码示例:
-
1 #include <stdio.h>
2 #include <math.h>
3 #define num 3
4 void putin(double *);
5 int search(double *);
6 void main()
7 {
8 double a[num];
9 putin(a);
10 printf("查找到的数字的下标是%d\n",search(a));
11
12 }
13
14 void putin(double *a)
15 {
16 int i;
17 printf("输入%d个数字",num);
18 for(i=0;i<num;i++)
19 scanf("%lf",(a+i));
20 }
21
22
23 int search(double *a)
24 {
25 int m=0,n=num-1,middle;
26 double find;
27 printf("输入要查找的数字");
28 scanf("%lf",&find);
29 while(m<=n)
30 {middle=(m+n)/2;
31 if(find==a[middle]) return middle;
32 else if(find<a[middle]) n=middle-1;
33 else if(find>a[middle]) m=middle+1;
34 }
35 return -1;
36
37
38 }