#include <stdio.h>
#include <stdlib.h>
#define MAX(X,Y) (X>Y?X:Y)
#include <math.h>
int binary(int s, int arr[])
{
int len = sizeof(arra)/sizeof(arra[0]);//计算数组长度
int left_index = 0;
int right_index = len -1;
while(right_index >= left_index)
{
int mid_index = (right_index + left_index)/2;
if(s > arr[mid_index])
left_index = mid_index + 1;
else if(s < arr[mid_index])
right_index = mid_index -1;
else
return mid_index;
}
return -1;
}
int main()
{ int arra[] = {12,23,34,45,56,67,78,89,99,102,108};//有序数组
int s = 102;//要查找的数
int ret = binary(s,arra);//调用函数
//printf("%d",sizeof(arra[0]));
if(ret == -1)
{
printf("没有找到您要找的数\n");
}
else
{
printf("找到了!!,您要找的数的下标为:%d\n",ret);
}
return 0;
}
上面的代码,看上去没有问题,但是一执行,就出错了!!!!!!!!!!!!!
具体原因是因为,传过去的数组参数,实际上只是传过去数组的首个元素的地址,就是一个指针.所以在binary函数中用sizeof(arr),得到的就是一个地址的大小,4个字节.并没有得到我们想要的.正确的做法是在主函数中,把数组的长度先计算出来,代码在下面:
#include <stdio.h>
#include <stdlib.h>
#define MAX(X,Y) (X>Y?X:Y)
#include <math.h>
int binary(int s, int arr[], int len)
{
int left_index = 0;
int right_index = len -1;
while(right_index >= left_index)
{
int mid_index = (right_index + left_index)/2;
if(s > arr[mid_index])
left_index = mid_index + 1;
else if(s < arr[mid_index])
right_index = mid_index -1;
else
return mid_index;
}
return -1;
}
int main()
{ int arra[] = {12,23,34,45,56,67,78,89,99,102,108};//有序数组
int s = 102;//要查找的数
int len_arr = sizeof(arra)/sizeof(arra[0]);
int ret = binary(s,arra,len_arr);//调用函数
//printf("%d",sizeof(arra[0]));
if(ret == -1)
{
printf("没有找到您要找的数\n");
}
else
{
printf("找到了!!,您要找的数的下标为:%d\n",ret);
}
return 0;
}