二分查找

一、二分查找(时间复杂度 O(log2n))
1、什么是二分查找
首先假设数据是升序的,然后记录下中间的数据,让要查找的数据与它比较,如果相等那么查找成功,如果不相等,那么把数据以这个中间的数据为界限分成前后两部分,如果要查找的数据比中间的这个数据小那么就去前半部分查找,如果要查找的数据比中间的这个数据大那么就去后半部分查找,重复以上过程,直到找到满足条件的数据,如果出现左边的数据比右边的大,那么查找失败。

2、优缺点
优点:查找速度快
缺点:待查找的数据必须是有序的

二、代码
1、递归实现

//l是数组的左下标,r是数组的右下标,注意数组的下标是从0开始的
int _binary_find(int* arr,size_t l,size_t r,int key)
{
	if(l > r) return -1;//这个时候下标是非法的,返回-1

	int pi = (l+r)/2;//标杆的下标
	if(key > arr[pi])
		return _binary_find(arr,pi+1,r,key);//更新左边的下标
	else if(key < arr[pi])
		return _binary_find(arr,l,pi-1,key);//更新右边的下标
	else return pi;//找到了这个数据
}

//需要提供数组的首地址,长度以及要查找的值
int binary_find(int* arr,size_t len,int key)
{
	return _binary_find(arr,0,len-1,key);
}

2、循环实现

int binary_find(int* arr,size_t len,int key)
{
	int l = 0 , r = len -1 ;//l是左下标,r是右下标

	while(l <= r) //在合法的条件内循环
	{
		int pi = (l+r) / 2;//标杆的下标
		if(key > arr[pi])
			l = pi + 1;//更新左边的下标
		else if(key < arr[pi])
			r = pi - 1;//更新右边的下标
		else 
			return pi;//找到了返回
	}
	
	return -1;//出了循环就是下标违法了
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值