力扣-704.二分查找(小白便于理解C++版)

本文章内容由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;
 } 

 运行结果

 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;
 } 

运行结果

 二分查找的优势

在本实验中二分的查找优势并不明显,但若随着数据的增多,如果有10000000个数字,遍历查找需要经过10000000次查找,而二分查找每次可以减少一半的值,需要log2(10000000)次,即24次,运算速度大大提快。

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值