問題:請實現以下函式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...