今天幫同學想用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行的結果是39,第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.