折半查找用简单的C语言编写

代码如下:
#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,考虑到溢出的问题,不推荐使用。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值