二分查找【循环和递归】

对一个数组a,在区间下标[x,y]寻找p是否存在,存在则返回下标,否则返回-1。

循环和递归实现:(练习用的程序)

 1 #include <stdio.h>
 2 #include<stdlib.h>
 3 #include<time.h>
 4 
 5 int binSerrch(int a[],int x,int y,int p);//在非递减数组a的x到y区间寻找p,假如存在则返回p的下标,否则返回-1
 6 int binSerrch2(int a[],int x,int y,int p);//递归实现 
 7 int cmp(const void *a,const void *b)
 8 {
 9     int x,y;
10     x=*(int *)a;
11     y=*(int *)b;
12     return x-y;
13 }
14 int main(int argc, char *argv[])
15 {
16     int a[20];
17     int i;
18     int p,ans1,ans2;
19     
20     srand((unsigned)time(0));
21     
22     for(i=0;i<20;i++)
23         a[i]=rand()%50+1;
24     
25     qsort(a,20,sizeof(a[0]),cmp);
26     
27     for(i=0;i<20;i++)
28     {
29         printf("%d ",a[i]);
30         if((i+1)%10==0) printf("
");
31     }
32     printf("
");
33     
34     for(i=1;i<=10;i++)
35     {
36         p=rand()%50+1;
37         ans1=binSerrch(a,0,19,p);
38         ans2=binSerrch2(a,0,19,p);
39         printf("%d %d %d
",p,ans1,ans2);
40     }
41     
42     return 0;
43 }
44 int binSerrch(int a[],int x,int y,int p)//在数组a的x到y区间寻找p,假如存在则返回p的下标,否则返回-1
45 {
46     int mid;
47     while(x<=y)
48     {
49         mid=(x+y)/2;
50         if(a[mid]==p)
51             return mid;
52         else if(a[mid]>p)
53             y=mid-1;
54         else
55             x=mid+1;
56     }
57     return -1;
58 }
59 int binSerrch2(int a[],int x,int y,int p)//递归实现 
60 {
61     int mid;
62     if(x>y) return -1;
63     else 
64     {
65         mid=(x+y)/2;
66         if(a[mid]==p) return mid;
67         else if(a[mid]>p) return binSerrch2(a,x,mid-1,p);
68         else return binSerrch2(a,mid+1,y,p);
69     }
70 }
View Code
原文地址:https://www.cnblogs.com/huashanqingzhu/p/4476918.html