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;
}
Beispiel #2
0
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]为递减数列为止
	}
}
Beispiel #3
0
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);
    }
}