二分查找法

二分查找法注意事項

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) ; // 移位操作高效於除法操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章