码迷,mamicode.com
首页 > 编程语言 > 详细

折半查找算法实现

时间:2014-12-01 22:22:41      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:ar   sp   bs   as   算法   nbsp   br   对象   return   

     折半查找是一种比较高效的查找方式,其基本思想是:在某个有序表中,取出中间的记录作为比较对象,如果要查找记录的关键码等于中间记录的关键码,则查找成功;若要查找记录的关键码小于中间记录的关键码,则在中间记录的左半区继续查找;若查找记录的关键码大于中间记录的关键码,则在中间记录的右半区继续查找。不断重复上述查找过程,直到查找成功,或有序表没有所要查找的记录,查找失败。实现过程有两种方式递归法和非递归法。

      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;
}

折半查找算法实现

标签:ar   sp   bs   as   算法   nbsp   br   对象   return   

原文地址:http://www.cnblogs.com/345717675GISER/p/4136008.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!