c语言实现二分查找

使用c语言实现二分查找

在一个已按非降序排序的序列Array中,查找是否存在一个元素key,如果存在,返回该元素的索引值,否则返回-1(c语言中数组的任何元素索引都不可能为-1,利用这点,使用-1表示不存在该元素)
原理:
1、确定有序序列的中位数Array[mid],并且将该中位数与key相比较。
2、如果Array[mid]>key,说明key可能在序列前半部分;否则Array[mid]<key,说明,key可能在序列后半部分;这种情况直接排除序列另外一部分(序列的一半)。如果碰巧Array[mid]=key;这时即可直接确定key索引值。
实现:
方法有循环发和递归法:
循环法:
int Binary_Search_loop(int A[],int low,int high,int key)
{
	int mid=(high+low)/2;
	while(high>low)
	{
		mid=(high+low)/2;
		if(A[mid]>key)		//与当前序列中位数比较,抛弃不匹配的一半
			high=mid;
		else if(A[mid]<key)
			low=mid+1;
		else			//如果,恰好当前中位数匹配,直接返回即可
			return mid;
	}
	if(high==low)			//只剩最后一个元素没有比较,直接比较
		if(A[low]==key)		//如果最后元素还是不匹配,那就返回-1
			return low;
		else
			return -1;
}
递归法:
(使用递归法更直观,但同时也增加了空间复杂度)
int Binary_Search(int A[],int low,int high,int key)
{
	int mid;
	if(low<high)			
	{
		mid=(low+high)/2;			
		if(A[mid]>key)					//与当前中位数比较,抛弃不匹配的一半
			return Binary_Search(A,low,mid,key);
		else if(A[mid]<key)
			return Binary_Search(A,mid+1,high,key);
		else						//如果恰好中位数可以匹配,直接返回
			return mid;
	}
	else 							//如果只剩一个元素,直接判断是否匹配
		if(A[low]!=key)
			return -1;
		else
			return low;
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值