折半查找算法實現


     折半查找是一種比較高效的查找方式,其基本思想是:在某個有序表中,取出中間的記錄作為比較對象,如果要查找記錄的關鍵碼等於中間記錄的關鍵碼,則查找成功;若要查找記錄的關鍵碼小於中間記錄的關鍵碼,則在中間記錄的左半區繼續查找;若查找記錄的關鍵碼大於中間記錄的關鍵碼,則在中間記錄的右半區繼續查找。不斷重復上述查找過程,直到查找成功,或有序表沒有所要查找的記錄,查找失敗。實現過程有兩種方式遞歸法和非遞歸法。

      1.非遞歸法:查找成功則返回位置,查找失敗則范圍-1.

      /////////////////////////////////////////////////
     //非遞歸查找1. numVec為待查找的集合2.x為待查找數值 3.beg為查找范圍起始 4.last為查找范圍結束
    /////////////////////////////////////////////////
int Bisearch::BiSearch(vector<int> numVec,int x,int beg,int last){
         int mid;//中間位置
         if(beg>last){ //beg開始位置大於last結束位置,目前只考慮升序狀態下
         return -1;
         }  
         while(beg<=last){
               mid =(beg+last)/2; 
               if(x==numVec[mid]){//x(關鍵碼)剛好跟中間值(numVec[mid])相同
               return mid;
         }else if(x>numVec[mid]){//x(關鍵碼)大於中間值(numVec[mid]),起點定位到mid+1
               beg = mid +1;
          }else if(x<numVec[mid]){//x(關鍵碼)小於於中間值(numVec[mid]),終點定位到mid-1
               last = mid -1;
         }
      }
         return -1;
}

           2.遞歸法:

          int Bisearch::IterBiSearch(vector<int> numVec,int x,int beg,int last){
       //中間位置初始化為-1
       int mid =-1;
       mid = (beg+ last)/2;
       if(x==numVec[mid]){
        return mid;
       }else if(x<numVec[mid]){
             return IterBiSearch(numVec,x,beg,mid-1);
       }else if(x>numVec[mid]){
              return IterBiSearch(numVec,x,mid+1,last);
 }
     return -1;
}


免責聲明!

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



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