一、二分查找算法简介
1.介绍
二分查找也称折半查找(BinarySearch),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
中文名 | 外文名 | 别名 | 提出者 | 提出时间 |
---|---|---|---|---|
二分查找 | BinarySearch | 折半查找 | John Mauchly | 1946年 |
二分查找的优点是速度较快,时间复杂度为O(logn),但是缺点是它需要查找数的这张表,必须有序。
4.算法思想
假设目标值在闭区间
[l, r]
中, 每次将区间长度缩小一半,当l = r
时,我们就找到了目标值。这样我们就可以用O(logn)的时间复杂度,找出需要查找的数
3.查找过程
首先,表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较:
如果两者相等,则查找成功;
否则利用中间位置记录将表分成前、后两个子表,继续查找。如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表;
否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
二、二分查找的实现
现在就是二分查找的实现了,二分查找实现有两种办法,一种是手写,另一种是用STL。
1.STL实现
在C++的STL库中也是有二分查找的,但是要调用的话,记得要加上#include <algorithm>
头文件。
(1)binary_search()
这个函数是在从小到大排好序的基本类型数组上进行二分查找。
binary_search(数组名 + n1, 数组名 + n2,需要查找的数);
n1
表示从数组的第几位开始查找
n2
表示查找到第几位
如果数组从0开始,n1可以不写。
(2)lower_bound()
lower_bound(数组名 + n1, 数组名 + n2, 需要查找的数);
注意:这个函数返回的是查找出的数的下标,需要用一个指针来存储
找到是查找区间里下标最小的,大于等于值的元素。如果找不到,会指向下标为n2的元素。因为n2不在查找区间内,如果要判断是否找到可以用这个作为依据。
(3)upper_bound()
upper_bound(数组名 + n1, 数组名 + n2, 需要查找的数);
注意:这个函数和lower _bound()一样返回的是查找出的数的下标,需要用一个指针来存储
找到的是查找区间里下标最小的,大于值的元素(这里是大于,不要和前面弄混了)。如果找不到,p指向下标为n2的元素。
LATEX 崩了
e
你的意思是不是说看上去有点。。。难看
lowerbound()
这是什么
lower _bound()
e
敲音猴,怎么弄的。。。
lower _bound()
还有你的O(logn)
空格都没了
格式也不对
O(logn)
空格我会弄hh
格式!
都搞好了应该
\log
不是log
并没有搞好
哦
原来还有一个O(log n)
\log
!必须要用
\log
?
你说的是O(logn)
用
\log
而不是log
哦,一定要这样吗
我强迫症
两个不都差不多吗
额
这样不好看吗,O(log n)
必须!
要不我点踩
额
珂是,我觉得O(log n)更好看搞不搞
额
行了喵
看到一样的强迫症人了捏
这是你古的审题解规则,比较规范
还有算法名真的不要用 LaTeX 啊…看不下去
字母与汉字之间要加空格!!!早看不下去了怒了