二分查找法注意事項
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;
}
`
1. 對於求中間索引m時,有三種方式:
1. m = ( s + e ) / 2 ;//s + e
可能超出int取值範圍
2. m = s + ( e - s) / 2 ;// 解決上一行提到問題
3. m = s + (( e - s ) >> 1) ; // 移位操作高效於除法操作