在進行二分查找時,最需要注意的有以下幾點:
- 要查找的對象是否是有序的,是升序的還是降序的,不同的順序有不同的處理方法
- 給出查找對象的區間,是 [ ],還是 [ )
- 遞歸出口,根據給出的區間遞歸出口要注意,[ ]對應出口爲left <= right,[ )對應出口left < right
template<class T>
int BinaryFind(T* arr, int left, int right, T key)
{
if (arr)
{
//遞歸出口
if (left < right)
{
//平均值的一種求法(避免數據溢出問題)
int mid = ((left ^ right) >> 1) + (left & right);
if (arr[mid] < key)
{
//因爲給出的是[ )形式的區間,所以mid要加上1
return BinaryFind(arr, mid + 1, right, key);
}
else if (arr[mid] > key)
{
//因爲給出的是[ )形式的區間,在這mid不用加1
return BinaryFind(arr, left, mid, key);
}
else
{
return mid;
}
}
}
return -1;
}