二分查找

二分查找也叫折半查找,采用此方法时,数据必须是有序的,有效的提高了查找的效率。

主要思想:

    I. 假设查找的数组为array[ left, right ]区间考虑左闭右闭。

1.首确定数组的中间位置mid并记录下来。

2.查找过程有三种情况:

           a.将查找的X值与array[ mid ]比较,如果相等,则返回mid的下标查找成功。

           b.X值小于array[ mid ],则将array[ left ]移至array[ mid - 1 ],将区间缩小了一半,达到了提高效率的目的。

           c.X值大于array[ mid ],则将array[ right ]移至array[ mid + 1 ],效果同上。

参考代码如下:

int BinarySearch(int* array, int size, int x)
{
	int right = 0;
    //考虑区间为左闭右闭的情况
	int left = size - 1;
    //考虑区间为左闭右闭的情况
	while(left <= right)
	{
		int mid = (left + right)/2; 
		if(mid == x)
		{
			return mid;
		}else if(x < mid)
		{
			right = mid - 1;
		}else if(x > mid)
		{
			left = mid + 1; 
		}
		return -1;
	}
}

   II.array[ left, right)区间考虑左开右闭。

思路与上述相同,只是此时while进入循环的条件应为left < right(考虑难道查找最后一个元素是否可以进入循环)。

参考代码如下:

int Binarysearch(int* array, int size, int x)
{
	int right = 0;
    //左闭右开的情况
	int left = size;
    //左闭右开的情况
	while(right < left)
	{
		int mid = (left + right)/2;
		if(mid == x)
		{
			return mid;
		}else if(x < mid)
		{
			left = mid - 1;
		}else if(x > mid)
		{
			right = mid + 1; 
		}
		return -1;
	}
}

现在的代码看似没有问题,但是考虑到求中间值时 left+right 过大会发生溢出。更加稳妥的情况下,运用下面代码求中间值:

int mid = right + (left - right)>>2;

以上便是二分查找的简单实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值