1.9 折半查找

发布时间 2023-04-25 22:22:05作者: 自律小子丶

第一部曲:利用low和high两个指针扫描数组的元素,求出mid中间值根据mid的值和要查找的数进行判断,如果等于就找到了直接输出,如果不等,分情况,如果要找到数小于中间值就要更新右指针high,因为是闭区间,所以high可以直接更新为high-1,如果大于中间值就要更新左指针,更新为high+1。这里面要写个循环条件,low指针小于等于high指针,不满足这种情况后肯定循环一遍了,最后判断是不是找到了。

第二部曲:

 

第三部曲:

while(low<=high)//左小于等于右
{
mid=(low+high)/2;//更新中间值
if(m<a[mid])//如果在中间值左边,更新右端点
{
high=mid-1;
}
else
{
if(m>a[mid])//在中间值右边,更新左端点
low=mid+1;
else//如果等于,直接跳出循环,记录mid的值
{
k=mid;
break;
}
}
}

第四部曲:

#include<iostream>
using namespace std;
const int N=10;
int main()
{
int i,a[N]={-3,4,7,9,13,45,67,89,100,180},low=0,high=N-1,mid,k=-1,m;
for(i=0;i<N;i++)
cout<<a[i]<<" ";//输出数组a各个值
cout<<endl;
cin>>m;//输入要查找的数
while(low<=high)//左小于等于右
{
mid=(low+high)/2;//更新中间值
if(m<a[mid])//如果在中间值左边,更新右端点
{
high=mid-1;
}
else
{
if(m>a[mid])//在中间值右边,更新左端点
low=mid+1;
else//如果等于,直接跳出循环,记录mid的值
{
k=mid;
break;
}
}
}
if(k>=0)//如果mid被k代替,那么肯定大于等于0直接输出
printf("m=%d,index=%d\n",m,k);
else//没有被代替
cout<<"Not be found";
return 0;
}