好久没有更新了。昨天晚上宿舍有同学,说到去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"); }