前提条件:要查找的序列应时一个有序序列。
算法描述:使用left和right标记序列的两个端点,left=0,right=序列个数-1,用middle表示序列的中间位置,即middle=(low+high)/2;如果处于middle处的元素值小于目标值,则下一次寻找目标值的范围缩小为【middle+1,right】,即left=middle+1,否则范围为【left,middle-1】,即right=middle-1;随着搜索的不断进行,left从左向右移,right从右向左移。一旦在middle处找到目标,查找将停止;如果没有找到目标,left和right将重合。下图显示了此过程。
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int a[10]={10,14,21,38,45,47,53,81,87,99}; 6 int left=0,right=9;//标记序列的两个端点,此例中使用的是元素的下标 7 int middle;//序列的中间位置middle=(left+right)/2 8 int b=47;//目标值 9 bool isExist=false;//用来表示是不是找到目标值 ,false表示没找到 10 int i=0;//表示循环多少次找到目标值 或者 最终找不到目标值 11 while(left<=right) 12 { 13 middle=(left+right)/2; 14 cout<<++i<<endl; 15 if(a[middle]==b) 16 { 17 isExist=true; 18 break; 19 } 20 else if(a[middle]<b) 21 left=middle+1; 22 else 23 right=middle-1; 24 } 25 if(isExist) 26 cout<<b<<"找到:在序列的第"<<middle+1<<"位置"<<endl; 27 else 28 cout<<"序列中没有找到"<<b<<endl; 29 }
原文:https://www.cnblogs.com/legenBlog/p/10272400.html