一、无重复元素
int binary_search_rotate_arry(int *a, int n, int x) { int low = 0, high = n - 1, mid; while(low <= high) { mid = low + ((high - low) >> 1); if(a[mid] == x) return mid; if(a[mid] >= a[low]) { //左边有序 if(x < a[mid] && x >= a[low]) high = mid - 1; else low = mid + 1; } else //右边有序 { if(x > a[mid] && x <= a[high]) low = mid + 1; else high = mid - 1; } } return -1; }
二、允许重复元素
int binary_search_rotate_arry(int *a, int n, int x) { int low = 0, high = n - 1, mid; while(low <= high) { mid = low + ((high - low) >> 1); if(a[mid] == x) return mid; if(a[mid] > a[low]) { //左边严格递增 if(x < a[mid] && x >= a[low]) high = mid - 1; else low = mid + 1; } else if(a[mid] < a[low])//右边严格递增 { if(x > a[mid] && x <= a[high]) low = mid + 1; else high = mid - 1; } else //相等,跳过重复元素 low++; } return -1; }