二分查找算法的原理及一个实用小技巧

二分查找算法是在 有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间复杂度为O(n),但二分查找算法则更优,因为其查找时间复杂度为O(log2 n),比如数组{0,1,2,3,4,5,6,7,8 9},查找元素6,用二分查找的算法执行的话,其顺序为:
    1.第一步查找中间元素,即4,由于4<6,则6必然在4之后的数组元素中,那么就在{5,6,7,8,9}中查找,
    2.寻找{5,6,7,8,9}的中位数,为7,7>6,则6应该在7左边的数组元素中,那么只剩下{5,6},按此类推就可以找到了。

二分查找算法就是不断将数组进行对半分割,每次拿中间元素和goal进行比较。代码如下演示,也可以用递归算法实现,但是考虑到递归算法效率低,一般不建议采用

#include <iostream>

int search(int *scr,unsigned int len,int goal);
int main()
{
	int num;
	int tab[10]={0,1,2,3,4,5,6,7,8,9};
	int location;
	std::cout<<"Please input the number you want to search:";
	std::cin>>num;
	location=search(tab,10,num);
	if(location!=-1)
		std::cout<<"The number's location is "<<location+1<<std::endl;
	else
		std::cout<<"The number don't exist"<<std::endl;
	return 0;
} 

int search(int *scr,unsigned int len,int goal)
{
	unsigned int low = 0;
	unsigned int high = len-1;
	
	while(low<=high)
	{
		unsigned int mid = low + (high-low);//防止溢出 
		if(scr[mid]==goal)
			return mid;
		else if(scr[mid]<goal)
			low = mid +1;
		else 
			high = mid - 1;
	}
	return -1;
}

这里有个挺不错的小技巧:在这里不用 mid = (low + high)/2,
而是用 mid=low+((high-low)/2),原因是
使用(low+high)/2会有整数溢出的问题。问题会出现在当low+high的结果大于表达式结果类型所能表示的最大值时,这样,产生溢出后再/2不会产生正确结果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值