迴圈有序陣列的二分查詢

2021-09-12 20:41:10 字數 927 閱讀 2873

問題:請實現以下函式int indexof(int array ,int key) ,給定乙個迴圈有序的陣列,請在這個陣列中找到指定元素,找到的話返回下標,沒找到返回-1。:

解決:首先,使用二分查詢找到陣列的 「臨界點」,臨界點滿足兩個情況:

array[left] < array[mid]

array[left] <= array[mid]

只有確定分界點,確定了key的範圍,才能找到key的位置.

如何判斷一段陣列是單調遞增呢?在該段陣列的頭、中間、尾三個位置p,m,q取三個值a[p], a[m], a[q],如果是單調遞增則一定滿足 a[p] >= a[m] >= a[q],否則則非單調遞增。

判斷目標元素下一步所在區間,有幾種情況:

當 x > a[m] 時,

右半邊是單調遞增區間,並且x在此區間內,下一步則可在此右半邊區間內查詢

右半邊是單調遞增區間,並且x不在此區間內,下一步在左半邊查詢

右半邊是非單調遞增區間,則x必然在此區間內,下一步在右半邊查詢

當 x < a[m] 時, 同理類似

左半邊是單調遞增區間,並且x在此區間內,下一步則可在此左半邊區間內查詢

左半邊是單調遞增區間,並且x不在此區間內,下一步在右半邊查詢

左半邊是非單調遞增區間,則x必然在此區間內,下一步在左半邊查詢

判斷是否在單調遞增部分,只需與區間的另外一頭的元素比較一下大小即可知道

public class test

else

}} return -1;

} public static void main(string args) throws ioexception ;

int res=cycle(arry,4);

system.out.println(res);

}}

迴圈有序陣列二分查詢

演算法描述,乙個有序的陣列,從開始到中間擷取一段陣列放到陣列的尾部,這個陣列會變成迴圈有序的陣列,在這個迴圈有序的陣列中進行二分查詢 例如 1,2,3,4,5,6,7,8,9 擷取前4位放到尾部會變成5,6,7,8,9,1,2,3,4 變成迴圈有序的陣列 演算法實現 採用二分查詢的方式,獲取中間的乙...

二分查詢有序陣列

對於乙個有序字串陣列,用二分法查詢某一字串是否存在於該字串陣列中。函式原型為 bool binarysearch const vector array,const string target 注意這裡的有序指的是字典序,如字串陣列 a,ab,ac,bc,cd,d 就是有序字串陣列,而 a,b,ab ...

有序陣列的二分查詢

給出乙個有序陣列 公升序 以及指定的數值。返回指定數值在陣列中的下標 若不存在則返回 1 在傳入的公升序陣列arr中查詢是否有元素值與給定的number相等。param arr 有序陣列 公升序 param number 指定的數值 return 指定數值在該陣列中的下標值。返回 1表示不存在 st...