二分查找的两种C++实现

二分查找算法理解

二分查找(Binary Search),也叫折半查找。应用它的前提是线性表中的记录是关键码有序的。基本思想是:在有序表中选取中间值作为比较对象,从而将查找区间的大小减半,加快查找速度,直到找到为止。

如果我们将折半查找的过程看做一颗二叉树的绘制,那么根据二叉树的性质(具有n个节点的完全二叉树的深度为[log2n+1])我们可以得到折半算法的时间复杂度为O[logn],与顺序查找的O[n]相比,二分查找具有明显的优势。
下面是二分查找的算法实现及实例的运行结果:

/*二分查找的非递归方法实现*/
int binarySearch(vector<int>& vec, int val)
{
       if(vec.empty())
       {
       	       return -1;
       }
	   int low=0;
	   int high=vec.size()-1;
	   int mid=0;
		
	   while(low<=high)
	   {
	   		  mid =(high+low)>>1;
	   		  if(val<vec[mid])
	   		  {
	   		  		  high=mid;
	   		  }
	   		  else if(val>vec[mid])
	   		  {
	   		         low=mid;
	   		  }
	   		  else
	   		  {
	   		        return mid;
	   		  }
	   }
	   return -1;	
}
/*二分查找的递归实现方法*/
int Recursion(vector<int>& vec, int low, int high, int val)
{
		if(low>high)
		{
				return -1;
		}
        int mid=(high+low)>>1;
        if(val<vec[mid])
        {
        	    Recursion(vec,low,mid-1,val);
        }
        else if(val>vec[mid])
        {
        	   Recursion(vec,mid+1,high,val);
        }
        else
        {
        	   return mid;
        }
}
int binarySearchRecursion(vector<int>& vec, int val)
{
	    if(vec.empty())
	    {
	    		return -1;
	    }
		int low=0;
		int high=vec.size()-1;
		return Recursion(vec, low, high, val);
}
/*Test Function*/
int main()
{
	    vector<int> vec{35,37,47,51,58,62,73,88,99};
	    cout << binarySearch(vec,51) << endl;
	    cout << binarySearch(vec,35) <<endl;
        cout << binarySearchRecursion(vec,99)  << endl;
        cout << binarySearchRecursion(vac,62) << endl;
        return 0;
}

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值