二分查找要求:
- 数据存储在顺序存储结构中
- 数字有序排放
原理:
将数组分为三部分,依次是左值,中值,右值;将要查找的值和数组的中值进行比较,若小于中值则在中值前 面找,若大于中值则在中值后面找,等于中值时直接返回。然后依次是一个递归过程,将前半部分或者后半部分继续分解为三部分。
循环实现二分查找
template<class Type>
int FindValue(const Type *arr, int n, const Type &kx)
{
int pos = -1;
if(NULL == arr || n < 1) return pos;
int left = 0, right = n - 1;
while(left <= right)
{
int mid = (right - left)/2 + left;
if(kx < arr[mid])
{
right = mid - 1;
}else if(kx > arr[mid])
{
left = mid + 1;
}else
{
while(mid > left && arr[mid - 1] == kx) --mid;
pos = mid;
break;
}
}
return pos;
}
递归实现二分查找
template<class Type>
int Search(const Type *arr, int left, int right, const Type &kx)
{
int pos = -1;
if(left <= right)
{
int mid = (right - left + 1)/2 + left;
if(kx < arr[mid])
{
pos = Search(arr, left, mid - 1, kx);
}else if(kx > arr[mid])
{
pos = Search(arr, mid+1, right, kx);
}else{
while(mid > left && arr[mid - 1] == kx) --mid;
pos = mid;
}
}
return pos;
}
template<class Type>
int SearchValue(const Type *arr, int n, const Type &kx)
{
if(NULL == arr || n < 1) return -1;
else return Search(arr, 0, n - 1, kx);
}