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的最小值。
二分法的优缺点
优缺点分析:
二分查找每一次判断即可筛选掉一半数据, 效率比全遍历的线性查找的确高很多, 但是其只能返回一个值, 若查找数值在数组中存在多个, 其局限性立即显露出来, 还有若是数组中存在一些不可相互比较的元素(比如字符串), 无法根据其元素的自然顺序对数组进行排序, 因此结果是不确定的.
因此, 在选择查找方法时需要根据对所要查找的数组类型以及查找用途(若是仅查找是否存在在该数组中便可使用二分搜索, 若是查找该数在数组中的全部位置则忽略二分法)等多种因素考虑.