二分查找算法简要介绍
- 应用二分查找算法的前提是输入序列有序:升序或者降序;
- 二分查找算法,每次取输入序列seq的中间下标middle对应的值与需要查找的key比较;
- 对于升序序列而言:如果key>seq[middle],则将middle+1作为下一次查找的左边界,右边界不变;
- 如果key < seq[middle],则将middle-1作为下一次查找的右边界,左边界不变;
- 如果key == seq[middle],则找到查找值的下标;
- 如果左边界小于右边界,则查找结束,未找到key;
- 重复第2到6步;
- 由于每轮查找都会让输入序列减半,故算法复杂度为O(log2n);
代码实现
bool Binary_Search(vector<long long> &OrderedSeq,unsigned left,unsigned right,long long key, unsigned &index)
{
unsigned middle = 0;
if(key>OrderedSeq[right] ||key<OrderedSeq[left])
{
cout<<"The key can not be found!"<<endl;
return false;
}
while(left<=right)
{
middle = (right-left)/2 + left;
if(key<OrderedSeq[middle])
right = middle - 1;
else if(key>OrderedSeq[middle])
left = middle + 1;
else
{
index = middle;
return true;
}
}
return false;
}
int main(int argc, char* argv[])
{
vector<long long> seq;
unsigned idx = 0;
cout<<"The Fibonacci_Seq_Gen out:"<<Fibonacci_Seq_Gen(seq, 51)<<endl;
Binary_Search(seq, 0,seq.size()-1,seq[9],idx);
cout<<"The binary search result is:"<<idx<<endl;
return 0;
}