二分查找

jyssh / 2023-05-12 / 原文

二分查找是一种在有序数组中查找特定元素的算法。它的基本思想是将数组分成两部分,判断目标元素在哪一部分中,然后继续在该部分中进行查找,直到找到目标元素或者确定目标元素不存在为止。这种算法的时间复杂度为O(log n),比线性查找的时间复杂度O(n)更快。

例如,寻找n个从小到大顺序的中指定的数字位置,可以:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6+10,inf = 0x3f3f3f3f;
int a[N];
int n,m; 
void find(int x)
{
    int l = 1,r = n;
    while(l<=r)
    {
        int mid = (l+r)/2;
        if(a[mid]==x)
        {
            cout<<mid<<endl;
            return ;
        }
        else if(a[mid]>x)l = mid+1;
        else r = mid-1;
    }
    cout<<"None"<<endl;
    return;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=1;i<=m;i++)
    {
        int x;scanf("%d",&x);
        find(x);
    }
     return 0;
}

 

3750: 二分查找

描述

 

将n个从小到大排序的整数(n<1000000)从1~n进行编号,并给出一个待查找的整数,请使用二分法进行查找。

 

 

 

输入

 

第一行为n(n<1000000)和m(m<100000),n表示序列中的元素个数,m表示查询次数。

第二行为n个从小到大排序的整数,以空格分隔;

接下来有m行,每行一个待查询的整数。

 

 

输出

 

对于每次查询,如果能够在序列中找到待查询的整数,则输出编号(如果存在多个编号,返回编号最小的),如果不存在,则输出None。

 

 

样例输入

 10 2

1 2 4 5 6 7 8 9 10 11

10

12

样例输出

 9

None

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6+10,inf = 0x3f3f3f3f;
int a[N];
int n,m; 
void find(int x)
{
    int l = 1,r = n;
    while(l<=r)
    {
        int mid = (l+r)/2;
        if(a[mid]==x)
        {
            while(a[mid]==x)mid--;
            cout<<mid+1<<endl;
            return ;
        }
        else if(a[mid]>x)r = mid-1;
        else l = mid+1;
    }
    cout<<"None"<<endl;
    return;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=1;i<=m;i++)
    {
        int x;scanf("%d",&x);
        find(x);
    }
     return 0;
}

 

7379: 二分查找II

描述

 

将n个从大到小排序的整数(n<1000000)从1~n进行编号,并给出一个待查找的整数,请使用二分法进行查找。

 

 

输入

 

第一行为n(n<1000000)和m(m<100000),n表示序列中的元素个数,m表示查询次数。

第二行为n个从大到小排序的整数,以空格分隔;

接下来有m行,每行一个待查询的整数。

 

 

输出

 

对于每次查询,如果能够在序列中找到待查询的整数,则输出编号(如果存在多个编号,返回编号最大的),如果不存在,则输出None。

 

 

样例输入

 

10 2
11 10 9 8 7 6 5 4 2 1
10
12

样例输出

2
None

 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6+10,inf = 0x3f3f3f3f;
int a[N];
int n,m; 
void find(int x)
{
    int l = 1,r = n;
    while(l<=r)
    {
        int mid = (l+r)/2;
        if(a[mid]==x)
        {
            while(a[mid]==x)mid++;
            cout<<mid-1<<endl;
            return ;
        }
        else if(a[mid]>x)l = mid+1;
        else r = mid-1;
    }
    cout<<"None"<<endl;
    return;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=1;i<=m;i++)
    {
        int x;scanf("%d",&x);
        find(x);
    }
     return 0;
}
View Code