遞歸形式二分查找

在進行二分查找時,最需要注意的有以下幾點:

  1. 要查找的對象是否是有序的,是升序的還是降序的,不同的順序有不同的處理方法
  2. 給出查找對象的區間,是 [ ],還是 [ )
  3. 遞歸出口,根據給出的區間遞歸出口要注意,[ ]對應出口爲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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章