二分查找(Binary Search)
//方法一:假设其数组长度为n,其算法复杂度为O(log(n))
template<typename T>
int binarySearch(T* pData, int nCount, T value)
{
int low = 0, high = nCount - 1, mid;
while (high >= low)
{
mid = low + (high - low) / 2; //使用(low+high)/2会有整数溢出的问题,(当low+high的结果大于int的最大值时)
int midValue = pData[mid];
if (value == midValue)
{
return mid;
}
else if (value >midValue)
{
low = mid + 1; //继续在[mid+1..high]中查找
}
else
{
high = mid - 1; //继续在[low..mid-1]中查找
}
}
return -1;
}
//方法二:也有一种四个参数的解决方案,其实是方法一的变种 (出处)
int bsearchRecursion(int array[], int low, int high, int target)
{
while(low <= high)
{
int mid = (low + high)/2;
if (array[mid] > target)
high = mid - 1;
else if (array[mid] < target)
low = mid + 1;
else //find the target
return mid;
}
//the array does not contain the target
return -1;
}
//方法三:递归算法(出处)
int bsearch(int array[], int low, int high, int target)
{
if (low > high) return -1;
int mid = (low + high)/2;
if (array[mid]> target)
return binarysearch(array, low, mid -1, target);
if (array[mid]< target)
return binarysearch(array, mid+1, high, target);
//if (midValue == target)
return mid;
}
int bsearch(int array[], int low, int high, int target)
{
if (low > high) return -1;
int mid = (low + high)/2;
if (array[mid]> target)
return binarysearch(array, low, mid -1, target);
if (array[mid]< target)
return binarysearch(array, mid+1, high, target);
//if (midValue == target)
return mid;
}