二分查找【入门】
已结束
ACM/ICPC
开始于: 2024-12-1 14:00
508
小时
主持人:
42
二分查找算法(Binary Search Algorithm)是一种用于在有序数组中查找特定元素的高效算法。它的基本思想是通过比较目标值和数组中间元素的大小关系,从而缩小查找范围,直到找到目标值或确定目标值不存在为止。
算法步骤:
- 将数组按照某种规则(通常是升序排列)排列。
- 设定初始搜索范围为整个数组。
- 每次取搜索范围的中间值,与目标值进行比较。
- 如果中间值等于目标值,则返回中间值的索引;如果中间值大于目标值,则在左半部分继续查找;如果中间值小于目标值,则在右半部分继续查找。
- 重复上述步骤,直到找到目标值或搜索范围缩小至空。
算法特点:
- 时间复杂度为O(log n),是一种高效的查找算法。
- 适用于有序数组,不适用于链表等非随机访问结构。
- 二分查找是一种迭代的算法,也可以使用递归实现。
示例:
假设有一个有序数组arr = [1, 3, 5, 7, 9, 11, 13, 15, 17],要查找目标值为7。
- 初始搜索范围为整个数组,左指针left = 0,右指针right = 8。
- 计算中间索引mid = (0 + 8) / 2 = 4,对应元素arr[4] = 9,大于目标值7。
- 更新右指针为mid - 1,即right = 3,缩小搜索范围为左半部分。
- 继续查找,计算新的中间索引mid = (0 + 3) / 2 = 1,对应元素arr[1] = 3,小于目标值7。
- 更新左指针为mid + 1,即left = 2,缩小搜索范围为右半部分。
- 继续查找,计算新的中间索引mid = (2 + 3) / 2 = 2,对应元素arr[2] = 5,小于目标值7。
- 更新左指针为mid + 1,即left = 3,缩小搜索范围为右半部分。
- 继续查找,计算新的中间索引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<<-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