二分查找法

前提条件:要查找的序列应是一个有序序列。

算法描述:使用left和right标记序列的两个端点,left=0,right=序列个数-1,用middle表示序列的中间位置,即middle=(left+right)/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 } 

 2、for循环实现

 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 b=47;
 7     int left,right,middle;
 8     bool isExist=false;
 9     int count=0;//计数器,查找次数 
10     for(left=0,right=9;left<=right;)
11     {
12         cout<<++count<<endl;
13         middle=(left+right)/2;
14         if(a[middle]==b)
15         {
16             isExist=true;
17             break;
18         }
19         else if(a[middle]<b)
20             left=middle+1;
21         else 
22             right=middle-1;
23     }
24     if(isExist)
25         cout<<b<<"存在于数组a中,其位于数组a的第"<<middle+1<<"位置."<<endl; 
26     else
27         cout<<b<<"不存于数组a中"<<endl; 
28 } 


3、do-while循环实现

 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 b=47;
 7     int left=0,right=9,middle;
 8     bool isExist=false;
 9     int count=0;//计数器,查找次数 
10     do
11     {
12         cout<<++count<<endl;
13         middle=(left+right)/2;
14         if(a[middle]==b)
15         {
16              isExist=true;
17             break;
18          }
19          else if(a[middle]<b)
20              left=middle+1;
21          else 
22              right=middle-1;
23     
24     }while(left<=right);
25     if(isExist)
26         cout<<b<<"存在于数组a中,其位于数组a的第"<<middle+1<<"位置."<<endl; 
27     else
28         cout<<b<<"不存于数组a中"<<endl; 
29 } 

 

posted @ 2019-01-15 15:52  Nikel  阅读(283)  评论(0)    收藏  举报