算法思想
二分查找是基于一个升序数组实现的,我们在数组的两端分别定义两个指针指向数组的第一个索引和最后一个索引,根据根据两边的索引来算出中间索引((左索引+右索引)/2 )的进而得到中间索引的数组元素将其与目标值进行比较,如果目标值小于中间索引的数组元素值我们将右指针移到中间索引的减一的位置,如果目标值大于中间索引的数组元素值我们将左指针移到中间索引加一的位置,然后循环进行上述过程直到两个指针指向同一个位置
代码实现一
public static int search(int[] array,int key) {
int i=0,j=array.length-1;//定义两个指向左侧索引和右侧索引的指针
int middle;
while (i<=j){
middle=(i+j)/2;
if(key<array[middle]){//目标值在中间索引元素的左边
j=middle-1;//将右边的指针向左移动
}else if(key>array[middle]){//目标值在中间索引元素的右边
i=middle+1;//将左边的指针向右移动
}else {//找到了返回索引位置
return middle;
}
}
//没找到返回-1
return -1;
}
代码改进
middle=(i+j)/2;当i和j足够大时我们用普通的除法将会出现middle为负数的情况
middle=(i+j)/2>>>1这样运算便可以避免出现负数的情况
除了上述的代码实现还有另一种代码实现
代码实现二
这种实现代码我们将右侧指针指向的元素不参与比较
public static int search(int[] array,int key) {
int i=0,j=array.length;//定义两个指向左侧索引和右侧索引的指针,右侧指针的指向不参与比较 改动1
int middle;
while (i<j){//改动2
middle=(i+j)/2;
if(key<array[middle]){//目标值在中间索引元素的左边
j=middle;//将右边的指针向左移动 改动3
}else if(key>array[middle]){//目标值在中间索引元素的右边
i=middle+1;//将左边的指针向右移动
}else {//找到了返回索引位置
return middle;
}
}
//没找到返回-1
return -1;
}