旋转数组查找

一、无重复元素

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;
}


你可能感兴趣的:(旋转数组查找)