折半查找
<理解>折半查找针对的是有序的序列,每次让要查找的key跟当前序列的middle项对应的值比较,如果key较小,则在middle项的左边子列再折半,否则在其右边折半,此递归最后的停止条件是子列的left大于right(或者等于,看一开始传进来的数组的right有没有减1)。
<代码>
/**
*
* @param list 原数组
* @param key 需要查找的值
* @param left 数组的左边界
* @param right数组额右边界(不是长度)
* @return
*/
public int doBinarySearch(int[] list,int key,int left,int right){
if(left>right){
return -1;
}else{
int middle = (left+right)/2;
if(key>list[middle])
middle = doBinarySearch(list,key,middle+1,right);
else if(key<list[middle]){
middle = doBinarySearch(list, key, left, middle-1);
}
return middle;
}
}
非迭代算法
public int doBinarySearch_non_recursive(int[] list,int key){
int pl = 0;
int pr = list.length-1;
int middle = -1;
while(pl<=pr){
/*当只剩下两个元素或者一个元素的时候,要单独拿出来看,因为如果这两个或者一个元素里面还没有要找的那个key,按照原来的逻辑,就会返回一个
错误的middle(会跳出循环,但是返回的却是上一次循环中的middle)*/
middle = (pl+pr)/2;
if(pl == middle){
if(list[middle] == key)
return middle;
else if(list[pr] == key)
return pr;
return -1;
}else if(key>list[middle]){
pl = middle+1;
}else if(key<list[middle]){
pr = middle-1;
}else
return middle;
}
return middle;
}