二分查找
一、二分查找的使用条件
二分查找又称折半查找,在有序的数据集中,依次与中间元素比较,需要获取中间元素的下标,故需要以下二个条件:
1、顺序存储数据结构
2、有序
二、二分查找实现
//二分查找(前提:arr已从小到大排序)
template<typename T>
int binarySearch(T arr[],int length,T key)
{
int beginIndex = 0;
int endIndex = length - 1;
while(beginIndex <= endIndex)
{
//取中间元素的下标
int midIndex = (beginIndex + endIndex) >> 1;
if(arr[midIndex] == key)// 中间元素等于key,查找成功
{
return midIndex;
}
else if(arr[midIndex] > key)//中间元素大于key,只需从前半部分查找key
{
endIndex = midIndex - 1;
}
else//中间元素小于key,只需从后半部分查找key
{
beginIndex = midIndex + 1;
}//end of else
}//end of while
return -1;//未找到key,返回-1
}//end of func
三、二分查找递归实现(效率较低,不推荐)
//二分递归查找(前提:arr已从小到大排序)
template<typename T>
int binarySearch(T arr[],int beginIndex,int endIndex,T key)
{
if(beginIndex > endIndex)
{
return -1;
}
else
{
int midIndex = (beginIndex + endIndex) >> 1;
if(arr[midIndex] == key)//中间元素等于key,返回下标
{
return midIndex;
}
else if(arr[midIndex] > key)//中间元素大于key,递归在前半部分递归查找
{
return binarySearch(arr,beginIndex,midIndex - 1,key);
}
else//中间元素小于key,递归在后半部分递归查找
{
return binarySearch(arr,midIndex+1,endIndex,key);
}//end of inner else
}//end of outer else
}//end of func