二分查找知识点 详细解说

NOIP和CSP初赛中通常都会出二分查找的题目,那么,什么是二分查找呢?

二分查找是一种算法,它用于查找一个有序递增数列中的一个数,使用这种算法可以大大减少遍历的时间,方便于查找。那么二分查找是怎么实现的呢?

比如,有一个有序递增数列:1 2 3 4 5

通常使用二分查找的时候会定义三个变量:lbound(左边界)、rbound(右边界)、mid(求中位数)。我们先用mid求这个有序递增数列的中位数。

这个有序递增数列的中位数是3,左边界初始化为1,右边界初始化为数的数量(在次有序递增数列里为5),此时就可以开始二分查找了。

假如要查找2,那么我们先用2跟中位数mid比较,发现2小了,说明要查找的数在整个数列的左边,右边没有要查找的数,故可以把右边界设为中位数,继续查找。此时,左边界还是为1,右边界为mid(中位数),中位数mid变成了2,用2跟中位数2比较,发现相同,说明已经找到了要查找的数,输出该数在整个序列中的位置(中位数mid)。

那么我们来总结一下刚刚的查找过程:

整个查找只用了2次就找到了要查找的数,如果用传统查找法(就是依次遍历数列),在最坏的情况下要遍历n次。由此可见,二分查找非常方便。同时,我们发现了一个规律,求中位数可以使用一个公式(左边界 + 右边界)/ 2。

学习了二分查找的过程,来做做这道题试试水:

100以内查找一个数最坏的情况下使用二分查找需要几次(向上取整)?(  )

A.5           B.6          C.7         D.8

正确答案是C,因为是向上取整,所以除以2得到小数后应省略小数再加1。100除以2得50,50除以2得25,25除以2向上取整得13,13除以2向上取整得7,7除以2向上取整得4,4除以2得2,2除以2得1。此时,查找结束,一共是7次。所以,100以内查找一个数最坏的情况下使用二分查找需要7次。

那么怎样用C++代码打二分查找呢?

把基础的代码先打好:

#include <iostream>
#include <algorithm>
using namespace std;

int main (void)
{
    ios::sync_with_stdio(false);
    long n = 0, x = 0;
    int a[1000010] = {0};
    cin >> n;
    for (long i = 1; i <= n; i++) cin >> a[i];
    cin >> x;
    //二分查找代码
    return 0;
}

接下来到二分查找的核心代码,这里我把左边界lbound简化为l,把右边界rbound简化为r,中位数mid不变:

while(l<=r){
    //满足条件再查找
    mid=(l+r)/2;//利用公式求中位数
    if(a[mid]==x){//如果找到了要查找的数
        cout<<mid;//输出该数在数列中的位置
        return 0;//程序结束
    }
    else if(a[mid]<x){
        //如果小于中位数就把左边界设为中位数加1
        l=mid+1;
    }
    else{
        //如果小于中位数就把右边界设为中位数减1
        r=mid-1;
    }
}

打完这些代码后,还有一个情况,就是如果要查找的数不在这个数列里怎么办。直接在二分查找函数外输出-1完事。

以上是二分查找知识点的详细解说,希望能对读者起作用。

Activity 是 Android 应用程序的基本组成部分之一,它负责展示用户界面和处理与用户的交互。Activity 可以看作是一个具有生命周期的窗口,它可以接收来自系统或用户的事件并作出响应。 Activity 的主要作用是管理用户界面和应用程序状态,它可以通过 setContentView() 方法加载布局文件并显示用户界面,同时也可以实现用户与应用程序之间的通信和数据交互。例如,当用户点击按钮或输入文本时,Activity 可以响应这些事件并执行相应的操作。 Activity 还可以通过 Intent 启动其他 Activity,实现多个界面的切换和交互。在启动另一个 Activity 时,当前 Activity 可以传递一些数据给被启动的 Activity,也可以接收被启动的 Activity 返回的数据。 Activity 生命周期包括以下几个阶段: 1. onCreate():在 Activity 创建时被调用,用于初始化界面和数据。 2. onStart():在 Activity 可见但没有获取焦点时被调用,用于执行一些初始化操作。 3. onResume():在 Activity 可见并获取焦点时被调用,用于开始执行程序逻辑。 4. onPause():在 Activity 失去焦点但仍可见时被调用,用于释放资源和保存数据。 5. onStop():在 Activity 不再可见时被调用,用于释放资源和保存数据。 6. onDestroy():在 Activity 被销毁时被调用,用于释放资源和清理数据。 Activity 生命周期中的每个阶段都提供了一些回调方法,可以在这些方法中执行一些操作,例如初始化界面、加载数据、保存状态等。 总的来说,Activity 是 Android 应用程序的基本组成部分之一,它负责展示用户界面和处理与用户的交互,通过生命周期管理应用程序状态,实现多个界面的切换和交互。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值