二分查找

原创 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;
}
//用二分查找法找寻下届
与上界的查找相反。



相关文章推荐

二分查找教程

  • 2014年10月11日 22:40
  • 226KB
  • 下载

lintCode_二分查找

笔试面试算法题

简单二分查找

  • 2014年06月28日 22:59
  • 605B
  • 下载

二分查找--java实现

  • 2015年10月26日 19:19
  • 2KB
  • 下载

Collections.sort方法实现Comparator比较器进行二分查找

/*Collections.sort方法实现Comparator比较器 Collections 工具类 */ import java.util.*; class CollectionsDemo { ...
  • blacop
  • blacop
  • 2016年07月18日 09:47
  • 488

二分查找代码

  • 2015年10月17日 22:11
  • 1KB
  • 下载

二分查找的实现

  • 2013年07月03日 16:09
  • 2.25MB
  • 下载

两种方式Java实现二分查找法

小树今天使用递归方法实现了二分查找法,也写了普通的二分查找法,代码如下:import java.util.*;public class BinarySort { public static v...

二分查找算法

  • 2012年07月29日 10:25
  • 683KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二分查找
举报原因:
原因补充:

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