二分查找算法C++实现

二分查找的应用场景:

二分查找目的是在一堆数中找到指定的数。

使用二分查找这些数据需要有的特征(面试容易问):

  1. 存储在数组中。
  2. 有序的排列。

如果是链表就无法使用二分查找。

顺序数组是递增递减,是否有重复的数据没有关系。

二分查找的实现

分治法”,分治法基本都可以用递归来实现的,二分查找法的递归实现如下:

int SearchBin(int array[], int low, int high, int key)
{
     if (low<=high)  
    {  
        int mid = (low+high)/2; //而是用 mid=low+((high-low)/2),原因是
                                //使用(low+high)/2会有整数溢出的问题 
        if(key == Array[mid])  
            return mid;  
        else if(key<Array[mid])  
            return BinSearch(Array,low,mid-1,key);  //移动low和high  
        else if(key>Array[mid])  
            return BinSearch(Array,mid+1,high,key); //移动low和high  
    }  
    else  
        return -1;  
}
非递归的方法实现二分查找:
/* 
 * 非递归二分查找算法 
 * 参数:整型数组,需要查找的数. 
 */  
int SearchBin(int *srcArray,int nSize,int key)
{  
         
    if ( srcArray== NULL || nSize == 0 )
        return -1;
    int low = 0;
    int high = nSize - 1;
    int mid = 0;
    while ( low <= high )
    {
        mid = (low + high )/2;
        if ( array[mid] < key)
            low = mid + 1;
        else if ( array[mid] > key )   
            high = mid - 1;
        else
            return mid;
    }
    return -1;    
}  

项目中实际使用的例子:

BOOL SearchBin(CASocket * pTarget,DWORD & dwPos) //二分查找算法 
{ 
	dwPos = (DWORD)-1;
	DWORD low,mid,high;
	BOOL bResult = FALSE;
	low = 1; high = m_nEventCount; //初始化查找区间 
	while ( low <= high )
	{ 
		if((int)high<0)
		{
			dwPos = 0;
			return FALSE;
		}
		mid = ( low + high )/2 ; //求区间中心的位置 
		if ( m_ASocketObject[mid] == pTarget )
		{
			bResult = TRUE;
			dwPos = mid;
			break;
		}
		if ( m_ASocketObject[mid] > pTarget ) 
                    high = mid - 1 ;//中心节点关键字偏大,查找低半段 
		else 
                    low = mid + 1 ; //中心节点关键字偏小,查找高半段 
	}
	if(dwPos == (DWORD)-1)
	{
		dwPos = (low + high)/2+1;
	}
	return bResult; //查找失败,返回失败标志 
}

 

 

      

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值