在乙個有序的陣列內查詢乙個元素,大家應該都會想到二分查詢。那麼,這樣實現乙個二分查詢需要考慮哪些問題呢?
問題描述:
在乙個整型有序的陣列裡面查詢乙個元素,如果這個元素出現多次,那麼請返回它第一次出現的位置,否則返回-1.
解答:首先,這是乙個有序的陣列,那麼它的排列究竟是公升序還是降序,這是第乙個需要考慮到的問題;然後
查詢到這個元素之後還需要考慮這是不是它第一次出現,因此需要向前依次索引找出最靠前的位置。
c**:
#include #include int bin_search(int arr, int n, int val)
//公升序排列
if(arr[left] < arr[right])
if(arr[middle] < val)
else
}} //降序排列
else
if(arr[middle] > val)
else
}} if(arr[record] == val)
return -1;
}int main()
; int arr = ;
int n = sizeof(arr)/sizeof(arr[0]);
int ret = bin_search(arr, n, 5);
system("pause");
return 0;
}
本來也可以採用在最後利用for迴圈語句從最左端往標記的地方遍歷一遍,查詢看有沒有在前面出現的這個元素,但我覺得這樣可能就違背了二分查詢的原則,因此在不考慮時間複雜度的情況下,可以採用這個方法。
已排序陣列二分查詢
劉汝佳 紫書提供方法 正確答案在 x,y 區間之內,即不會包括y。這種方法老是兩個細節搞不順,如下標註 int bsearch int a,int x,int y,int test return 1 沒有正確答案時返回 1 下面是一種邏輯清晰通順的實現寫法 只有兩個小細節不一樣,但理解起來很自然 以...
搜尋旋轉排序陣列 二分查詢
假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 0,1,2,4,5,6,7 可能變為 4,5,6,7,0,1,2 搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 1。你可以假設陣列中不存在重複的元素。你的演算法時間複雜度必須是 o log n 級別。示例...
二分查詢公升序陣列
二分法查詢問題,在這裡記錄一下 主要是注意點如下 1 使用 left,right 雙閉合區間來查詢,因此while必須是 因為只有如此才能在迴圈結束的時候是left right 1,這樣保證所有的資料都遍歷完 2 mid left right left 2 比 mid left right 2的好處...