迴圈有序陣列/旋轉陣列的二分查詢
阿新 • • 發佈:2018-12-29
類似問題:迴圈有序陣列/旋轉陣列的最小值 《劍指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; }