int rotate_search(int A[], int low, int high, int key ) { if (low > high){ return -1; } if (low==high){ return A[low]==key?low:-1; } int mid = low + (high-low)/2; if ( A[mid] == key ) return mid; if (A[low] < A[mid] && key >= A[low] && key< A[mid]){ return binary_search(A, low, mid-1, key); } if (A[mid] < A[high] && key > A[mid] && key <= A[high] ){ return binary_search(A, mid+1, high, key); } if (A[low] > A[mid] ){ return rotate_search(A, low, mid-1, key); } if (A[mid] > A[high] ){ return rotate_search(A, mid+1, high, key); } return -1; }
int rotate_search(int nums[], int start, int end, int key) { int mid; if(nums == NULL || end < 0) return -1; if(start == end) if(nums[start] == key) return start; else return -1; mid = (start + end)/2; if(nums[mid] == key) return mid; if(nums[mid] <= nums[start]) //判断nums[start ~ mid]数列是否为递减数列 { if(nums[start] >= key && nums[mid] < key) return rotate_search(nums, start, mid - 1, key); else return rotate_search(nums, mid + 1, end, key); } else { if(nums[end] <= key && nums[mid] > key) //判断nums[mid+1 ~ end]数列是否为递减数列 return rotate_search(nums, mid + 1, end, key); else return rotate_search(nums, start, mid - 1, key); //递减mid,直至nums[start ~ mid]为递减数列为止 } }
int main() { int index = -1; int key = 5; int nums[6] = {4, 3, 2, 1, 6, 5}; index = rotate_search(nums, 0, 5, key); printf("index of key in nums: %d\n", index); return 0; }
int search2(int A[], int n, int target) { if (n<=0) return -1; if (n==1){ return A[0]==target?0:-1; } if ( A[0] < A[n-1] ){ return binary_search(A, n, target); }else{ return rotate_search(A, 0, n-1, target); } }