數據結構-查找-折半查找-二叉排序樹查找


                折半查找

  對於關鍵碼有序的數列,用二分法查找。

  比如123456789,要找2,先折半找5,2比5小,繼續向左查找,找3,2比3小,繼續向左查找,2匹配成功。

  可以想到這是個遞歸的過程我這里遞歸非遞歸都寫一遍。

  首先是非遞歸的算法。

  • 傳入一個vector<int> &v和一個 待查找數值k
  • 設定查找的下界=0;上界為v.size();
  • 開始循環,跳出循環有2種情況,1找到了數值,2-就是下界比上界大的情況
  • 這里開始while(下界<=上界)
  • {
  • 設置中界為(上界+下界)/2
  • if(待查值小於中間值)就把上界設置為中間位置-1
  • else if(待查值大於中間值)就把下界設置為中間位置+1
  • else 這種情況就是查找到了直接return mid中間位置就行
  • }
  • int search(vector<int>& v,int k)
    {
        int low=0,high=v.size();
        while(low<=high)
        {
            int mid=(low+high)/2;
            if(k<v[mid])high=mid-1;
            else if(k>v[mid])low=mid+1;
            else return mid;
        }
    }

  接着是遞歸算法,遞歸和非遞歸一個思想

  • 因為是遞歸很容易想到,參數要4個,1-傳入數組,2-傳入下界,3-傳入上界,4-待查數字
  • 遞歸邊界也像上面非遞歸一樣,low>high或者找到的時候
  • int bin_search(vector<int>& v,int low,int high,int k)
  • 如果high<low return 0;//沒找到的
  • else{中間位置=(low+high)/2;
  • 假如待查值小於中間值,則 遞歸調用return bin_search(v,low,mid-1,k)
  • 假如待查值大於中間值,則遞歸調用return bin_search(v,mid+1,high,k)
  • 找到值return mid;
  • int bin_search(vector<int>& v,int low,int high,int k)
    {
        if(low>high)return 0;
        else
        {
            int mid=(low+high)/2;
            if(k<v[mid])return bin_search(v,low,mid-1,k);
            else if(k>v[mid])return bin_search(v,mid+1,high,k);
            else return mid;
        }
    }
    //要調用就是int i=bin_search(v,0,v.size(),待查值即可).

     

             和折半查找類似的是二叉排序樹查找

  • 明顯,二叉數的查找肯定是遞歸。這里默認都會二叉排序樹的構建。
  • 和上面遞歸的查找沒啥區別。
  • 直接上代碼
  • BiNode<int>* bt_search(BiNode<int> *&root,int k)
    {
        if(root==NULL)return NULL;
        else if(root->data==k)return root;
        else if(root->data>k)return bt_search(root->rightchild,k);
        else return bt_search(root->leftchild,k);
    }
        

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM