旋轉數組的二分查找

來源: 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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章