java demo简单的二分法

public class Fov {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] array = new int[]{11,12,13,14,15,16,22,33,44,55,66,77,89,100,199};
		
		System.out.println("array length = "+array.length);
		
		for(int i = 0;i<array.length;i++){
			int[] result = getValue(array,array[i]);
			
			System.out.println("SHOW:value = "+result[0]+"; index  = "+result[1]);
		}
	}

	
	public static int[] getValue(int[] array,int key){
		int[] result = new int[]{-1,0};
		int start =0;
		int end = array.length -1;
		int index = 0;
		while(start<=end){
			int middle = (start+end)/2;			
			if(key<array[middle]){
				end = middle -1;
			} else if(key>array[middle]){
				start = middle+1;
			} else if(key == array[middle]){
				result[0] = middle;
				result[1] = index;
				start = end+1;
			}
			index++;
		}
		return result;
	}

}

运行得到的结果是:

array length = 15
SHOW:value = 0; index  = 3
SHOW:value = 1; index  = 2
SHOW:value = 2; index  = 3
SHOW:value = 3; index  = 1
SHOW:value = 4; index  = 3
SHOW:value = 5; index  = 2
SHOW:value = 6; index  = 3
SHOW:value = 7; index  = 0
SHOW:value = 8; index  = 3
SHOW:value = 9; index  = 2
SHOW:value = 10; index  = 3
SHOW:value = 11; index  = 1
SHOW:value = 12; index  = 3
SHOW:value = 13; index  = 2
SHOW:value = 14; index  = 3

二分法需要array是有序的
二分法搜索组大的次数为 2的(n+1)次方>array.length 中的n的最小值。

二分法的优缺点

优缺点分析:

二分查找每一次判断即可筛选掉一半数据, 效率比全遍历的线性查找的确高很多, 但是其只能返回一个值, 若查找数值在数组中存在多个, 其局限性立即显露出来, 还有若是数组中存在一些不可相互比较的元素(比如字符串), 无法根据其元素的自然顺序对数组进行排序, 因此结果是不确定的.

 

因此, 在选择查找方法时需要根据对所要查找的数组类型以及查找用途(若是仅查找是否存在在该数组中便可使用二分搜索, 若是查找该数在数组中的全部位置则忽略二分法)等多种因素考虑.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值