二分查找的扩展

好久没有更新了。昨天晚上宿舍有同学,说到去ama**面试。面试官先让他写了个二分。。。

偶了以后,又让他进行扩展,问了这么一个问题。

说是如果要查找的数组不是有序的,是一个升序的数组经过偏转得来的。比如原数组为(1,2,3,4,5,6)偏转后的数组为(5,6,1,2,3,4)。然后让用扩展的二分法来进行查找。要求时间复杂度尽量低。。。

我有印象这道题目是见过的。无非就是还是用二分的思想,然后再边界的设置时,需要判断更多的边界条件而已。

但说完之后就熄灯了。今天中午闲来无事,就弄了下。代码不是自己写的,直接在网上找的。。。贴上来吧,算是一个记录:

贴上代码:http://blog.csdn.net/insistgogo/article/details/7770785

#include <iostream>
using namespace std;
int BinarySearch(int* arr,int len,int key)
{
	int low = 0;
	int high = len - 1;
	int mid = 0;

	while(low <= high)
	{
		mid = low + ((high - low) >> 1);
		if (arr[mid] == key)
		{
			return mid;
		}
		if (arr[low] <= arr[mid] )//以mid为界,mid左边为增序,mid右边降序
		{
			if (arr[low]<= key && key < arr[mid])//普通的折半
			{
				high = mid - 1;
			}
			else 
			{
				low = mid + 1;
			}
		}
		else //以mid为界,mid左边为降序(逆序),mid右边增序		
		{
			if (arr[mid] < key && arr[high] >= key)//在右边,为普通的折半
			{
				low = mid + 1;
			}
			else //在mid左边
			{
				high = mid - 1;
			}
		}
	}
	return -1;
}
int main()
{
	int arr1[8] = {6,7,8,9,1,2,4,5};
	cout<<BinarySearch(arr1,8,2)<<endl;//返回5
	cout<<BinarySearch(arr1,8,3)<<endl;//返回-1

	int arr2[8] = {2,3,4,6,8,9,13,15};
	cout<<BinarySearch(arr2,8,13)<<endl;//返回6
	cout<<BinarySearch(arr2,8,10)<<endl;//返回-1
	system("pause");
}


你可能感兴趣的:(二分查找的扩展)