c++打卡十三天
一、问题描述。
二、设计思路
①、首先我们是用二分法解决这个问题。二分法是指在一个有序数组中,我们通过目标数与数组中间值的比较,对半缩小数组范围,比如一个升序数组中间值是4,当我们寻找一个比四小的数字时,只需要从首位和中间值中寻找,然后继续确定新的中间值,长此以往,就可以有效地缩短寻找时间。
②、如果数组不是顺序排列的的,我么可以通过调用库函数对数组进行排序,调用头文件<algorithm>,使用sort函数进行排序,使用方法为sort(数组.begin(),数组.end(),排序函数),在这其中,排序函数我们可以自己编写是如何排序的,升序,降序,或者有规则的排序,都是可以定义的,系统默认的是进行升序排列,当然我们也可以调用sort(数组.begin(),数组.end(),greater<数据类型>)系统所给出的降序函数进行排序。
③、我们应该重点注意的是如何寻找这个中间值,
首先,如果我们寻找数组为[1,100]和[1,100)
第一种情况,我们进入循环,结束条件为左值大于右值,即l>=r;进入循环,我们定义中间值为(l+r)/2,如果我们所要找的值小于中间值,那么我们让r=mid-1,因为我们判断过了所要找的值为小于值,所以限定范围可以变到[1,49],如果所要找的目标值大于等于中间值,那么范围就变成[50,100]。
第二种情况,如果所要找的值小于中间值,那么r=mid,范围为[1,50),大于等于中间值的话,l=mid,范围为[50,100)。
④、当目标值和mid值一样时,计入此时的下标,并打印,如果没有找到,就输出没找到。
三、流程图。
四、代码实现。
#include<iostream> #include<algorithm> using namespace std; int main() { int n; int target; int l=0; int mid; cin>>n; cin>>target; int r=n-1; int a[n]; for(int i=0; i<n; i++) { cin>>a[i]; } sort(a,a+n); while(l<=r) { //左闭右闭写法 如果左闭右开那么是(l<r) mid=(r+l)/2; if(target==a[mid]) { break; } else if(target<a[mid]) { r=mid-1; } else { l=mid+1; } } if(l<=r) { cout<<mid<<endl; } else { cout<<"没找到!!!"<<endl; } return 0; }
五、结果