二分查找法注意事项
midFind(int a[], int s, int e, int data);
1. 分为递归和非递归,但应尽量避免递归。
2. 非递归中终止条件分为while ( s < e )
和while ( s <= e )
`
//终止条件while(s < e);参数e = v.size()
bool midFind(vector<int>& v , int s, int e , int data){
int m = -1 ;;
while( s < e){
m = s + (( e - s ) >> 1 );
if(v[m] == data){
return true;
}
else if(data < v[m]){
e = m ;//CAUTION!!!!!
}
else{
s = m + 1 ;
}
}
return false;
}
`
`
//终止条件:while(s <= e);并且参数e = v.size()-1
bool midFind(vector<int>& v , int s, int e , int data){
int m = -1 ;;
while( s <= e){
m = s + (( e - s ) >> 1 );
if(v[m] == data){
return true;
}
else if(data < v[m]){
e = m - 1;//CAUTION!!!!
}
else{
s = m + 1 ;
}
}
return false;
}
`
3. 对于求中间索引m时,有三种方式:
3.1 m = ( s + e ) / 2 ;//s + e
可能超出int取值范围
3.2. m = s + ( e - s) / 2 ;// 解决上一行提到问题
3.3 m = s + (( e - s ) >> 1) ; // 移位操作高效于除法操作