今天帮同学想用C实现数组的折半查找,本来算法挺简单的,可是折腾了好几个小时才发现问题在哪,这个sizeof坑人不浅啊。
1 #include<stdio.h> 2 void m(int []); 3 int main(){ 4 int a[9]={1,2,3,4,5,6,7,8,9}; 5 printf("%d\n",sizeof(a)); 6 m(a); 7 8 return 0; 9 } 10 11 void m(int k[]){ 12 printf("%d\n",sizeof(k)); 13 14 }
上面第5行的结果是36,第12行的结果是4,为啥同一个数组怎么结果不一样呢?原因就是发生在sizeof这里。那是因为sizeof是一个操作符,误认为是一个函数,还有就是数组在传递的过程中已经失去其原有的本义,在m函数中其实际上是传递的一个数组指针,所以第12行实际上是测试的指针的大小。
明白这里了,附上一篇C实现折半的代码
1 #include<stdio.h> 2 int binearySearch(int[],int,int); 3 int main(){ 4 int a[9]={1,2,3,4,5,6,7,8,9}; 5 int m=5; 6 int length=sizeof(a)/sizeof(int); 7 int s=binearySearch(a,length,m); 8 if(s==0) 9 printf("找不到!\n"); 10 else 11 printf("%d\n",s); 12 return 0; 13 } 14 15 int binearySearch(int m[],int N,int k){ 16 int start,end,middle; 17 start=0; 18 end=N; 19 while(start<end){ 20 middle=(start+end)/2; 21 if(m[middle]==k){ 22 return middle+1; 23 } 24 else if(m[middle]>k){ 25 end=middle; 26 } 27 else if(m[middle]<k){ 28 start=middle; 29 } 30 } 31 return 0; 32 }
上面结果是5.