在一个有序的数组中查找给定的数据项,把数组冲中间分成两半,然后看要查找的数据项在数组的哪一半,再次折半查找。
代码如下:
public int find(long searchKey){
int lowerBound=0;
int upperBound=nElmets-1;
int curIn;
while(true){
curIn=(lowerBound+upperBound)/2;
if(a[curIn]==searchKey){
return curIn;
}else if(lowerBound>upperBound){
return nElmets;
}else{
if(a[curIn]<searchKey){
lowerBound=curIn+1;
}else{
upperBound=curIn-1;
}
}
}
}
上述方法为是基于循环的,可以使用递归的方法替换此循环,代码如下:
public int find(long searchKey){
return recFind(searchKey,0,nElemts-1);
}
private int recFind(long searchKey,int lowerBound,int upperBound){
int curIn;
curIn=(lowerBound+upperBound)/2;
if(a[curIn]=searchKey){
return curIn;
}else if(lowerBound>upperBound){
return nElemts;
}else{
if(a[curIn]<searchKey){
return recFind(searchKey,curIn+1,upperBound);
}else{
return recFind(searchKey,lowerBound,curIn-1);
}
}
}