# 二分
## 简述
二分法也叫二分查找,是在**有序**数组中进行的一个查找操作,在这里我强调有序
我们假设一个情景:你要在一个数组中查找一个数是否存在,你会怎么办,最简单的想法是用for 循环遍历一遍如果存在返回 1 否则返回 0 ,这种情况当然很简单但是如果
数组种的数太多的话,列入这个数组有 1 亿个数用for 循环的复杂度是 O(n) , 这种情况下在算法竞赛中是不可能通过的,因此我们在这里引入二分的用法:
## 基本思想
对于一个数组 arr[] = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] 我们用二分法如何查找其中的 6 呢?
我们需要三个辅助变量 int low = 1 , upper = 9 ; int mid = (low + upper) / 2 (5) ;
如果 low <= upper
此时 arr[mid] < 6
则 low= mid + 1 , mid = (low + upper ) / 2 (7);
如果 low <= upper
此时 arr[mid] > 6
则 upper = mid - 1 , mid = (low + upper) / 2 (6) ;
如果 low <= upper
此时 arr[mid] = 6 ;
则 low = mid + 1 ,mid = (low + upper ) / 2 (6) ;
此时low > upper结束循环
程序如下:
```
#include <bits/stdc++.h>
using namespace std;
int main() {
int arr[11] = { 0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 } ;
int low = 1,upper = 9,mid ;
while ( low <= upper ) {
mid = (low + upper) / 2 ;
if ( arr[mid] <= 6 ) {
low = mid + 1 ;
} else {
upper = mid - 1 ;
}
}
printf("%d\n",arr[mid]) ;
return 0;
}
```
## 当然二分的用法不仅于此
你或许认为有序这个条件有些难以达到,但是二分确实是一个非常强有力的工具
接下来给大家介绍一系列题目大家做一下感受一下,可能其中有很多其他的想法
[Stages](https://vjudge.net/problem/CodeForces-1011A)
[They Are Everywhere](https://vjudge.net/problem/CodeForces-701C)
[The Frog's Games](https://vjudge.net/problem/HDU-4004)
[Trailing Zeroes (III)](https://vjudge.net/problem/LightOJ-1138)
[Pie](https://vjudge.net/problem/HDU-1969)
[Sweet Journey](https://vjudge.net/problem/HDU-5477)
[pairs](https://vjudge.net/problem/HDU-5178)
- 简介
- 零基础快速入门ACM
- C语言快速入门
- C语言快速入门
- C/C++基础
- 输入输出
- 数组和字符串
- 数组
- 字符数组
- 函数和递归
- C++标准容器库(STL)
- Vector
- Map
- Set
- String
- Stack
- Queue
- Priority_queue
- 贪心
- 硬币问题
- 区间调度问题
- 字典序最小问题
- 独木舟问题
- 搜索
- DFS
- BFS
- 剪枝
- 记忆化搜索
- 常用技巧
- 倍增
- 高精度
- 大数加法
- 大数减法
- 大数乘法
- 大数除法
- 大数阶乘
- 输入挂
- 前缀和
- 二分
- 本地预处理
- 尺取
- 枚举
- 坐标离散化
- 分治
- 数列分治
- 树上分治
- 平面分治
- 计算几何
- 凸包
- 点积
- 叉积
- 线段关系
- 皮克定理
- 最近点对
- 数据结构
- 线段树
- 树状数组
- 并查集
- 动态规划
- 基础知识
- 信息学竞赛中的动态规划
- 动态规划初步
- 最长上升子序列(LIS)
- 最长公共子序列(LCS)
- 最大子段和
- 背包问题
- 部分背包
- 0 1 背包
- 完全背包
- 多重背包
- 背包的可行性问题
- 线性DP
- 树形DP
- 区间DP
- 数位DP
- 动态规划优化
- 字符串
- KMP算法
- 拓展KMP
- 字符串Hash
- Manacher算法
- 后缀数组
- Trie树
- 博弈论
- Nim博弈
- Bash博弈
- 斐波那契博弈
- 威佐夫博弈
- SG函数
- 数论
- 整数研究
- 素数判断
- 素数筛选
- 快速幂
- 算数基本定理
- 最大公约数(Gcd)
- 费马小定理
- 扩展欧几里得
- 逆元
- 同余定理
- 组合数学
- 容斥原理
- 抽屉原理
- 卢卡斯(Lucas)
- 卡特兰(Catalan)
- 著名函数
- 欧拉函数
- 莫比乌斯函数
- 线性代数
- 矩阵运算
- 矩阵快速幂
- 图论
- 存图方法
- 邻接矩阵
- 邻接表
- Vector存图
- 链式前向星
- 图的遍历
- 拓扑排序
- 最短路
- Dijkstra算法
- SPFA算法
- Floyed 算法
- 最小生成树
- Prim算法
- Kruskal算法
- 最近公共祖先 (LCA)
- 二分图匹配
- 网络流
- 其他
- 莫队