旋转数组的二分查找

来源: http://www.jobcoding.com/array/one-sorted-array/rotate_array/


1. 问题描述
已知有序数组a[N], 从中间某个位置k(k未知,k=-1表示整个数组有序)分开,然后将前后两部分互换,
得到新的数组,在该新数组的查找元素x。如:a[]={1,2,5,7,9,10,15},从k=4分开,得到新数
组a={9,10,15, 1,2,5,7}。


<一次二分查找>:二分查找算法有两个关键点:1)数组有序;2)根据当前区间的中间元素与x的大小关系,
确定下次二分查找在前半段区间还是后半段区间进行。
仔细分析该问题,可以发现,每次根据low和high求出mid后,mid左边([low, mid])和右边([mid, high])
至少一个是有序的。
a[mid]分别与a[left]和a[right]比较,确定哪一段是有序的。
如果左边是有序的,若x<a[mid]且x>a[left], 则right=mid-1;其他情况,left =mid+1;
如果右边是有序的,若x> a[mid] 且x<a[right] 则left=mid+1;其他情况,right =mid-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(x > a[mid] && x <= a[high])
                low = mid + 1;
            else
                high = mid - 1;
        }
        //cout << low << " " << mid << " " << high << endl;
    }
    return -1;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值