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;
}

五、结果

 

posted @ 2023-04-23 21:01  七安。  阅读(14)  评论(0编辑  收藏  举报