二分查找

原创 2015年11月21日 18:11:54

//递归法
int BinarySearch(int a[], int b, int e, int x)
{
	if (b > e){
		return -1;
	}

	int m = b + ((e - b)>>1);//middle= (left+right)>>1; 这样的话left与right的值比较大的时候,其和可能溢出。
	if (x < a[m]){
		return BinarySearch(a, b, m-1, x);
	} 
	if  (x > a[m]){
		return BinarySearch(a, m+1, e, x);
	}

	return m;
 
}


//循环法
int BinarySearch2(int a[], int b, int e, int x)
{
	if (b > e){
		return -1;
	}

	while (b <= e){
		int m = (b+e)/2;
		if (x < a[m]){
			e = m-1;
		}
		else if (x > a[m]){
			b = m+1;
		}
		else {
			return m;
		}
	}
	return -1;
}

二分查找需要判断三种情况: 大于,小于,等于。只要找到与目标值相等的值就结束了。


二分查找需要注意的地方:   

1.递归或循环时,退出的条件,当 begin > end时,才退出。

注:当begin = end时,还需要取平均值mid,再比较一次

2.mid 的获取: mid = begin + (end - begin)/2。

注: mid的获取有两种情况: (end - begin)/2 会取下界;

mid也可以取上界,(end-begin+1)/2;


int BSearchUpperBound(int a[], int b, int e, int x)
{
	if (b > e || x >= a[e]){
		return -1;
	}

	int m = (b+e)/2;
	while (b < e){
		if (x < a[m]){
			e = m;
		} 
		else{
			b = m+1;
		}
		m = (b+e)/2;
	}
	
	return m;
}
//用二分查找法找寻上届
二分法查找上界需要判断两种情况:大于,不大于。算法需要一直二分,直到begin=end时,此时这个位置的值就是所要查找的上界。
1.循环条件:begin<end,当begin>=end时,退出。
2.mid = begin+(end-begin)/2,当a[mid] > 目标值x时,end = mid;否则,begin = mid+1;
3.mid的获取只能 mid=begin+(end-begin)/2;若mid=begin+(end-begin+1)/2的话,在下面这个情况会死循环: 目标值x=10,在{10,11}这求x的上界。
 

int BSearchLowerBound(int a[], int b, int e, int x)
{
	if ( b>e || x <= a[b] ){
		return -1;
	}

	int m = b+ ((e-b+1)>>1);
	while(b < e){
		if ( a[m] < x){
			b = m;
		} 
		else{
			e = m-1;
		}
		m = b+((e-b+1)>>1);
	}

	return m;
}
//用二分查找法找寻下届
与上界的查找相反。



Java版 二分查找

一、算法介绍 折半查找(搜索)、二分查找(搜索)           已经排序的数据(假如是从左向右依次递增),取出中间数与查找值比较      如果中间值大于查找值,应该再次向左侧查找,因为左侧都...
  • love_world_
  • love_world_
  • 2014年01月05日 14:09
  • 1597

二分查找算法及其变种

前言二分查找算法也称为折半查找算法,是一种在查找算法中普遍使用的算法。其算法的基本思想是:在有序表中,取中间的记录作为比较关键字,若给定值与中间记录的关键字相等,则查找成功;若给定的值小于中间记录的关...
  • u011116672
  • u011116672
  • 2015年12月06日 16:43
  • 2411

二分查找各种情况大总结

二分查找多次刷题时遇到,虽然每次也能写对,但花了蛮多时间,没好好想过。而且网上的太多版本,并不是很简洁,而且边界条件变化情况太多,容易混淆,下面是自己对二分查找的一些思考和总结,尽量写得简单易懂。 ...
  • yefengzhichen
  • yefengzhichen
  • 2016年08月30日 21:40
  • 11766

二分查找法的实例分析

二分查找:折半查找,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如                     果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,...
  • clown05
  • clown05
  • 2016年05月30日 00:56
  • 1842

数据结构之二分查找树

二分查找树(也叫二叉查找树、二叉排序树)的提出是为了提供查找效率,之所以称为二分查找树,因为该二叉树对应着二分查找算法,查找平均的时间复杂度为o(logn),所以该数据结构的提出是为了提高查找效率。...
  • JXH_123
  • JXH_123
  • 2014年07月02日 20:52
  • 2287

[经典面试题]二分查找问题汇总

【题目】 给定一个有序(非降序)数组A,可含有重复元素,求最小的i使得A[i]等于target,不存在则返回-1。 【分析】 此题也就是求target在数组中第一次出现的位置。这里可能会有人想先直接...
  • SunnyYoona
  • SunnyYoona
  • 2015年01月05日 12:16
  • 3296

二分查找算法变体在实际项目中的应用

一、应用场景 项目场景描述:数据库中共有45万条记录,保存了起始IP和终止IP,以及在此IP段对应的地理位置信息,如 114.104.085.000---114.104.085.255 中国 安徽省 ...
  • chenxiao_ji
  • chenxiao_ji
  • 2016年03月25日 17:23
  • 853

二分查找算法(递归与非递归两种方式)

首先说说二分查找法。 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回1,失败返回对应的数组下标。 采用非递归方式完成二分查找法。java代码如...
  • lovesummerforever
  • lovesummerforever
  • 2014年04月27日 15:44
  • 85315

LintCode二分查找题总结

LC上二分查找那一章有这么些题: 二分查找的题经常用于考,因为它虽然看似简单,但其实要完全正确却不容易,很容易写出死循环的程序。一个二分查找的程序可以很容易判断出一个人功底扎不扎实。 45...
  • luoshengkim
  • luoshengkim
  • 2016年08月03日 15:53
  • 2073

c++二分查找实现(非递归和递归方式)

二分查找思想:1、数组从小到大排序;2、查找的key每次和中间数比较,如果key小于mid 查找mid左侧的数组部分;如果key大于mid,则查找mid右侧的数组部分;如果相等,则直接返回mid。...
  • richerg85
  • richerg85
  • 2014年02月09日 23:15
  • 16763
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二分查找
举报原因:
原因补充:

(最多只允许输入30个字)