本文章内容由c++实现,如需c语言代码请私信作者。
二分查找为算法入门必学算法,我会在接下来的文章中介绍原理及代码实现,如果对您有帮助的话希望可以支持一下。
题目链接:704. 二分查找 - 力扣(LeetCode);
如果从该数组中寻找数字0有什么方法呢?
1.遍历查找
原理
一个一个数遍历,看是否有与其相等的数,相等的数的下标即为输出结果。如果遍历结束依旧未查到与其相等的数则返回-1。
代码实现
#include<iostream>
using namespace std;
int main()
{
int arr[11]={-5,-4,-3,-2,-1,0,1,2,3,4,5};
for (int i=0;i<11;i++) {
if(arr[i]==0) {
cout << i;
break;
}
}
if (i==11)
cout << -1;
return 0;
}
运行结果![](https://img-blog.csdnimg.cn/direct/1a2e51b504364f3d9526ee90e408a798.png)
2.二分查找
原理
步骤一(赋值)
l、r、m分别代表左下标、右下标、中间下标,首先将l赋值为0,将r赋值为10(因为此数组有11个数,最右边的数下标为10),那么作为中间下标的m值为 (l+r)/ 2。
步骤二(比较)
将arr[m]与目标值进行比较(本实验中目标值为0,可以自行更改),如果arr[m]等于目标值,则输出m此时的值,如果arr[m]大于目标值,则说明arr[m]右边的值(包括arr[m])均大于目标值,所以将r变为m-1。同理可得,若arr[m]小于目标值,将l变为m+1。在变化的过程中,l与r的差值逐渐变小,若两者相等则说明找到了目标值,若l > r,则说明未找到目标值,返回-1。
代码实现
#include<iostream>
using namespace std;
int main()
{
int arr[11]={-5,-4,-3,-2,-1,0,1,2,3,4,5};
int l,r,m;
l = 0;
r = 10;
while(l <= r) {
m = (l+r) >> 1; //右移一位相当于除以2
if (arr[m]==0) {
cout << m;
break;
}
else if (arr[m] > 0) r = m - 1;
else l = m + 1;
}
if(l > r)
cout << -1;
return 0;
}
运行结果![](https://img-blog.csdnimg.cn/direct/1a2e51b504364f3d9526ee90e408a798.png)
二分查找的优势
在本实验中二分的查找优势并不明显,但若随着数据的增多,如果有10000000个数字,遍历查找需要经过10000000次查找,而二分查找每次可以减少一半的值,需要log2(10000000)次,即24次,运算速度大大提快。