循环有序数组/旋转数组的二分查找

来源:互联网 发布:网络影视发行 编辑:程序博客网 时间:2024/04/18 09:11


类似问题:循环有序数组/旋转数组的最小值 《剑指offer》P66


#include <iostream>using namespace std;// 参考 http://blog.sina.com.cn/s/blog_a2498b5b01014bsg.html// 参考 http://blog.csdn.net/qq_33724710/article/details/51200889// 二分查找int binarySearch(int a[],int low,int high,int value){  if(low>high)    return -1;  int mid=(low+high)/2;  if(value==a[mid])    return mid;  else if(value>a[mid])    return binarySearch(a,mid+1,high,value);  else    return binarySearch(a,low,mid-1,value);}// 递归查找int searchRecursively(int a[],int low,int high,int value){  int mid=(low+high)/2;  if(a[mid]>a[low])       //左有序  {    if(a[low]<=value && value<=a[mid] )        //value在左边,直接二分查找      return binarySearch(a,low,mid,value);    else                                       //value在右边,递归查找      return searchRecursively(a,mid+1,high,value);  }  else                    //右有序  {    if(a[mid]<=value && value<=a[high])      return binarySearch(a,mid,high,value);    else      return searchRecursively(a,low,mid-1,value);  }}// 循环查找int searchCircularly(int* nums, int numsSize, int target){  int first = 0;  int last = numsSize - 1;  while (first <= last) {      int mid = (last - first) / 2 + first;    if (*(nums + mid) == target)      return mid;    else if (*(nums + first) <= *(nums + mid)) {      if (*(nums + first) <= target && target < *(nums + mid))        last = mid - 1;      else        first = mid + 1;    }    else {      if (*(nums + mid) < target && target <= *(nums + last))        first = mid + 1;      else        last = mid - 1;    }  }  return -1;}int main(){  int a[]={3,4,5,6,7,8,9,0,1,2};  cout<<searchRecursively(a,0,9,0)<<endl;  cout<<searchCircularly(a,9,0)<<endl;  int ttt = 0;  return 0;}


0 0