二分查找【入门】

已结束 ACM/ICPC 开始于: 2024-12-1 14:00 508 小时 主持人: 42

二分查找算法(Binary Search Algorithm)是一种用于在有序数组中查找特定元素的高效算法。它的基本思想是通过比较目标值和数组中间元素的大小关系,从而缩小查找范围,直到找到目标值或确定目标值不存在为止。

算法步骤

  1. 将数组按照某种规则(通常是升序排列)排列。
  2. 设定初始搜索范围为整个数组。
  3. 每次取搜索范围的中间值,与目标值进行比较。
  4. 如果中间值等于目标值,则返回中间值的索引;如果中间值大于目标值,则在左半部分继续查找;如果中间值小于目标值,则在右半部分继续查找。
  5. 重复上述步骤,直到找到目标值或搜索范围缩小至空。

算法特点

  • 时间复杂度为O(log n),是一种高效的查找算法。
  • 适用于有序数组,不适用于链表等非随机访问结构。
  • 二分查找是一种迭代的算法,也可以使用递归实现。

示例

假设有一个有序数组arr = [1, 3, 5, 7, 9, 11, 13, 15, 17],要查找目标值为7。

  1. 初始搜索范围为整个数组,左指针left = 0,右指针right = 8。
  2. 计算中间索引mid = (0 + 8) / 2 = 4,对应元素arr[4] = 9,大于目标值7。
  3. 更新右指针为mid - 1,即right = 3,缩小搜索范围为左半部分。
  4. 继续查找,计算新的中间索引mid = (0 + 3) / 2 = 1,对应元素arr[1] = 3,小于目标值7。
  5. 更新左指针为mid + 1,即left = 2,缩小搜索范围为右半部分。
  6. 继续查找,计算新的中间索引mid = (2 + 3) / 2 = 2,对应元素arr[2] = 5,小于目标值7。
  7. 更新左指针为mid + 1,即left = 3,缩小搜索范围为右半部分。
  8. 继续查找,计算新的中间索引mid = (3 + 3) / 2 = 3,对应元素arr[3] = 7,与目标值相等,返回索引3。

通过以上步骤,二分查找算法成功在有序数组中找到目标值7的索引为3。



2179 二分查找:



#include<bits/stdc++.h>
using namespace std;

int main(){ int n,a[1000005],x; //x查询数字 scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } scanf("%d",&x); int left=1,right=n,mid; while(left<=right){ mid=left+(right-left)/2; if(a[mid]==x) { cout<<mid; return 0; } else if(a[mid]>x) right=mid-1; else if(a[mid]<x) left = mid+1;

}
cout&lt;&lt;-1;
return 0;

}


左边界

#include<bits/stdc++.h>
using namespace std;
int n,a[100050],q,x; //q查询次数
int binary(int y){
    int left=1,right = n,mid;
    while(left<=right){
        mid = left+right>>1;
        if(a[mid]>=y){
            right = mid-1;
        }
        else left= mid+1;
    }
    //left左边界
    if(a[left]==y) return left;
    else return -1;
    
}

int main(){
    
    scanf("%d",&n);
    for(int i=1 ;i<=n;i++){
        scanf("%d",&a[i]);
    }
    scanf("%d",&q);
    while(q--){
        scanf("%d",&x);
        cout<<binary(x)<<" ";
   
    }
    
    
    
    return 0;
}
				有边界
			<br />
#include<bits/stdc++.h>
using namespace std;
/*
1、数据读入
2、查找目标数
    如果找到继续看右边还有吗?
    左边界右移
*/

int n,q,a[100050],x;
int binary(int y){
    int left = 1,right=n,mid;
    while(left<=right){
        mid = left+(right-left)/2;
        if(a[mid]<=y) left = mid+1;
        else right = mid-1;
    }
    if(a[right]==y) return right;
    else return -1;
    
}




int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        
    }
    scanf("%d",&q); //进行q次询问
    while(q--){
        scanf("%d",&x);
        cout<<binary(x)<<" ";
    }
    
}
			<br />

状态
已结束
规则
ACM/ICPC
题目
3
开始于
2024-12-1 14:00
结束于
2024-12-22 18:00
持续时间
508 小时
主持人
参赛人数
42