二分法搜索实现 C++
主要思路:
在[有序]序列中寻找某个给定值得位置,从中间位置开始搜索,如果中间位置正好是给定值,搜索完成;
如果不是,若中间位置的值大于给定值,则在前半段序列进行搜索;
若中间位置的值小于给定值,则在后半段序列进行搜索。
伪代码:
1 // 中间位置计算方法 若text长度为偶数,length/2 + begin 为中间两位的右侧; // 若text长度为奇数,length/2 + begin 为正中央位置。 2 3 // 注意: text.end 是尾元素的下一个位置 称为 [尾后迭代器] 4 5 mid = text.begin + text.length/2; 6 7 // 按照算法思路进行搜索 8 9 while(text.mid!=text.end&&!*text.mid!=value){ 10 11 if(value < text.mid) 12 13 end = mid; 14 15 else 16 17 begin = mid + 1; 18 19 // 重新确定中间位置 20 21 mid = text.begin + text.length/2; 22 23 } 24 25
C++ 示例:
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 int main(){ 5 string text_search("abcdefghijkmnopqrstuvwxyz"); 6 char value_search = 'm'; 7 auto begin = text_search.begin(), end = text_search.end(); 8 auto mid = begin + (end-begin)/2; 9 while (mid != end && (*mid)!=value_search) 10 { 11 if(value_search < *mid) 12 end = mid; 13 else 14 { 15 begin = mid + 1; 16 } 17 mid = begin + (end - begin)/2; 18 } 19 // 若到元素后 20 if ((*mid) == value_search){ 21 cout << value_search << " at " << (int)(mid-text_search.begin()) << " of " << text_search <<endl; 22 } 23 24 return 0; 25 }