二分查找

package search;
import java.util.*;
public class BinarySearch {
	
	//这种是在[l,h]闭合区间查找
	public int bSearch1(int l,int h,List<Integer> t,int v){
		while(l <= h){
			int m = (l+h)/2;
			if(t.get(m)==v) return m;
			else if(t.get(m)>v) h = m-1;
			else l = m+1;
		}
		return -1;
	}
	
	//这种是在[l,h)左闭右开区间查找。。。。
	public int bSearch2(int l,int h,List<Integer> t,int v){
		while(l < h){
			int m = (l+h)/2;
			if(t.get(m) == v) return m;
			else if(t.get(m) >v ) h = m;
			else l = m+1;
		}
		return -1;
	}
	
	//求下界  1 2 2 2 3,假如找的是2,那么返回第一个2的下标,
	// 1 3 5,假如找的是4,那么返回的下标是2(下标从0开始)
	//求的是[l,h)左闭右开区间,但是返回的值在[l,h]之间
	public int lowerSearch1(int l,int h,List<Integer> t,int v){
		while(l < h){
			int m = (l+h)/2;
			if(t.get(m) >= v) h = m;
			else l = m+1;
		}
		return l;
	}
	//这种求的是[l,h],实际就是令上面的h=h+1即可
	public int lowerSearch2(int l,int h,List<Integer> t,int v){
		while(l <= h){
			int m = (l+h)/2;
			/*
			 * 假如到某次循环t[m]是第一个大于等于v的数(即下界)
			 * 令p=m,那么经历h=m-1(即h=p-1)后,之后的循环中h将不会再改变(因为之后所有的t[m]都会小于v)
			 * 所以会一直进行l=m+1操作,直到l==h
			 * 当l==h时,m=(l+h)/2=h=p-1,然后l=m+1=h+1=p-1+1=p
			 * 此时l=p大于了h,将跳出循环
			 */
			if(t.get(m) >= v) h=m-1;
			else l = m+1;
		}
		return l;
	}
	//求上界
	public int upperSearch1(int l,int h,List<Integer> t,int v){
		while(l < h){
			int m = (l+h)/2;
			if(t.get(m) <= v) l = m+1;
			else h = m;
		}
		return l;
	}
	//求上界
	public int upperSearch2(int l,int h,List<Integer> t,int v){
		while(l <= h){
			int m = (l+h)/2;
			if(t.get(m) <= v) l = m+1;
			else h = m-1;
		}
		return l;
	} 
	
	public static void main(String[] args) {
		
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值