代码如下:
#include <stdio.h>
void search(int arr[],int left,int right,int num)
{
int mid=0;
while(left<=right)
{
mid=(left&right)+((left^right)>>1);
if(arr[mid]==num)
{
printf("%d在目标数组中的第%d位\n",num,mid+1);
break;
}
else if(arr[mid]<num)
{
left=mid+1;
}
else
{
right=mid-1;
}
}
if(left>right)
{
printf("目标数组中没有%d\n",num);
}
}
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,10};
int left=0;
int right=sizeof(arr)/sizeof(arr[0])-1;
int num=0;
printf("请输入你要找的数:");
scanf("%d",&num);
search(arr,left,right,num);
return 0;
}
代码解析:
首先给定一个目标数组arr,在得到这个数组之后,根据折半查找的原理,需要找到中间值,然后将这个中间值与我们要找的那个数进行比较,如果中间值小于目标数,那么中间值的左边(包括中间值自身)均可能是目标数,所以在这里我们要在中间值右边开始第一个数到最后找,因此我们将其设成一个新的查找区间,然后取这个区间的中间值,如果原本的中间值大于目标数,同理在中间值左边开始第一个数到数组的第一个数之间找,跟上面一样设立新的查找区间,并求新的中间值;然后用新的中间值重复上述操作,直到中间值等于目标数,那么就算是找到了,但如果找到最后一个数都没有,那么数组中就不存在目标数了。(注意:对于数组而言,我们用下标能够很好的表示目标区间,以及中间值。)
为了不让所有的代码都main()函数里面,我们这里建一个search()函数,而这里需要注意的是在调用数组的时候,我们只能调用一个数组的首个元素的地址,因此单单调用数组的话在seach()函数中无法对数组内部进行过多操作,所以调用了其他描述数组的变量,以方便操作。
关于mid=(left&right)+((left^right)>>1),这个式子的意思是取left与right的平均值,当然我们也可以用mid=(right-left)/2+left进行替代,而对于mid=(right+left)/2,考虑到溢出的问题,不推荐使用。