二分查找算法理解
二分查找(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;
}