大家都知道二分查詢的原理,將搜尋的區域分兩半,當然只對已經排序了的起作用,這裡說的是迭代的方式
1. end = mid - 1;
start = mid + 1;
在這種情況下,start 和 end 之間始終是所搜範圍,則搜尋空間範圍是 [start, end],這兩句的意思就已經指出 start 和 end 在搜尋範圍內
且推斷 start、mid、end 取值的並區間為 [start-1, end+1],
取極端情況 start == end 時,當 查詢的 smiddle 時 start = end +1 == 1
則給出條件 start <= end 或 mid != start && mid != end
#include using namespace std;
int main()
; int s = 7;
int start = 0, end = 9;
int middle = start + (end - start)/2;
while( start <= end && a[middle] != s )
if( start > end )
cout << "not found" << endl;
else
cout << "has found: no." << middle << endl;
return 0;
}
2. end = mid;
start = mid + 1;
同上,搜尋空間為 [start, end),這兩句的意思就已經指出 end 不在搜尋範圍內
start、middle、end 取值的並區間為 [start, end+1]
給出條件 mid != end
#include #include using namespace std;
int main()
; vector::iterator start = a.begin(), end = a.end();
vector::iterator middle = a.begin() + a.size()/2;
int s = 7;
while( middle != end && *middle != s )
if( middle == end )
cout << "not found" << endl;
else
cout << "has found: no." << middle-a.begin() << endl;
return 0;
}
3. end = mid;
start = mid;
這種賦值時,大多數情況下沒問題,但在極端情況下就會陷入死迴圈
當 end == start 時,且唯一的乙個元素不等於所查詢的 s
#include using namespace std;
int main()
; //int a;
int s = 7;
int start = 0, end = 0;
int middle = start + (end - start) / 2;
while (start <= end && a[middle] != s)
if (start > end)
cout << "not found" << endl;
else
cout << "has found: no." << middle << endl;
return 0;
}
綜上,建議 使用 middle = start + (end - start)/2 的方式取平均值
當 end 所指向的元素在搜尋範圍裡時:
end = mid - 1;
start = mid + 1;
條件:start <= end
當 end 所指向的元素不在搜尋範圍裡時:
end = mid;
start = mid + 1;
條件:mid != end
E簡單二分查詢
簡單二分查詢 面對二分查詢,主要是你的思路 第一步 你得把陣列有序的排列,一般選擇從小到大。第二步 把l,r,m確定下來。然後看看你得key 如果,key m,你運氣太好一下子就找到了 如果,key如果,key m,此時你考慮在你的右邊找。從小到大排列為例 第三步 迴圈著,就看你的結束條件了,當然了...
陣列 二分查詢 簡單
描述 給定乙個排序的整數陣列 公升序 和乙個要查詢的整數target,用o logn 的時間查詢到target第一次出現的下標 從0開始 如果target不存在於陣列中,返回 1。在陣列 1,2,3,3,4,5,10 中二分查詢3,返回2。挑戰 如果陣列中的整數個數超過了2 32,你的演算法是否會出...
二分查詢簡單題
leetcode 35.search insert position 最普通的binary search,若target存在,則返回所在下標 若target不存在,則返回target待插入的位置,本質上就是實現lower bound函式 無論mid left right left 2,還是mid l...