首页 > 代码库 > 二分法

二分法

一、定义

  二分查找 又称为折半查找 , 是一种查找效率较高的方法 。

  要求 : 1 . 所查找的序列为有序序列

       2. 只能在顺序存储结构上实现

二、基本思想

  每次将给定的 key 值与有序表中间位置上记录的数据进行比较 ,确定待查记录所在的范围 , 然后逐渐缩小查找范围 , 直到确定找到或找不到 。

三、查找过程

  每次执行的操作是将  key  依次与  mid  对应的数据进行比较 。

技术分享

 代码示例 :

  非递归版本

  

/*******************************/
// 非递归版的二分法 
void search ( int low , int high , int key ) {
	
	while ( low <= high ) {
		int mid = ( low + high ) / 2 ;
		if ( key == a[mid] ) {
			cout << "找到" ;
			return ;  // return 的作用是为了跳出函数,并且返回值为空类型 
		}  
		if ( key > a[mid] ) low = mid + 1 ;
		else high = mid - 1 ;
	}
	cout << "未找到" ;  // 若前面所要找的数未找到,则函数不会返回,此时会执行到这一步。 
} 

 

递归版本

 

/*******************************/
// 递归版的二分法 
void search ( int low , int high , int key ) {
	int mid = ( low + high ) / 2 ;
	
	if ( low >= high ) {
		cout << "未找到" ;
		return ; 
	}
	if ( a[mid] == key ) {
		cout << "找到" ;
		return ;
	}
	if ( a[mid] > key ) search ( low , mid - 1 , key ) ;
	else search ( mid + 1 , high , key ) ;
}

 

时间复杂度:

  由于二分法每次是折半分 , 设复杂度为 k , 二分的所有数据总数为 n , 则 2^k = n  , 复杂度 k = lg n 。

例题 :

问题描述
有N个城市,每个城市有Ai个人。
现在要开始投票,每个人有一张票。
作为领导者,你有B个箱子,你必须要将这B个箱子分发到N个城市去,每个城市至少需要一个箱子。
每个人都必须要投票,不能弃票,也就是说要把票丢进箱子里去(每个城市有Ai张票)。
现在问你,怎么分配这B个箱子才能使这些所有箱子里中票数最大的那个箱子里的票最少?

输入
输入包含一个数N(1<=N<=500,000)和B(N<=B<=2,000,000)。
接下来N行包含N个数,每个数Ai(1<=Ai<=5,000,000)表示每个城市的人数。
输入N为-1,B为-1时结束。

输出
输出那个带兵量最多的将领所带的士兵数。

样例输入
2 7
200000
500000
4 6
120
2680
3400
200
-1 -1

样例输出
100000
1700

 

  

  

 

  

二分法