【算法】带你快速搞懂 二分查找算法问题(图解+练习)


目录

❤️一:二分查找分析简介❤️

❤️二:二分查找代码实现❤️

​编辑

❤️三:二分查找代码分析图解❤️

❤️四:解决二分查找相关题型❤️

💕4.1:二分查找题型一💕

💕4.2:二分查找题型二💕


❤️一:二分查找分析简介❤️

        二分查找算法(Binary Search Algorithm)是一种用来在有序数组中查找特定元素的算法。该算法的基本思想是通过将待查找的元素与数组中间的元素进行比较,然后根据比较结果将待查找元素的搜索范围缩小一半。通过不断缩小搜索范围,最终可以在数组中快速定位到目标元素。

二分查找算法的基本步骤:

  1. 首先将待查找的元素与数组中间元素进行比较。
  2. 如果相等,则返回元素的索引位置。
  3. 如果待查找元素小于中间元素,则在左半部分继续查找。
  4. 如果待查找元素大于中间元素,则在右半部分继续查找。
  5. 重复以上步骤,直到找到目标元素或者搜索范围为空。

❤️二:二分查找代码实现❤️

代码实现:

// 二分查找算法
// 猜数字
#include<stdio.h>

// 二分查找算法
int Search(int* arr, int sz, int num)	// arr:代表被查找的数组,sz:数组的大小,num:被查找的数字
{
	int left = 0;
	int right = sz - 1;
	int i = 1;
	
	while (left <= right)
	{
		int mid = (left + right) / 2;

		printf("第%d次查找:left = %-5d mid = %-5d right = %-5d\n", i, left, mid, right);
		++i;

		if (arr[mid] > num)			// 中间位置数字比num大,缩减范围
		{
			right = mid - 1;
		}
		else if (arr[mid] < num)	// 中间位置数字比num小,缩减范围
		{
			left = mid + 1;
		}
		else						// arr[mid]==num,找到该数字
		{
			return mid;				// 返回下标
		}
	}
	return -1;		// left>right:非法,即没有找到
}

int main()
{
	int i = 0;
	int arr[100] = { 0 };
	// 初始化arr数组	arr[0]=1,arr[1]=2.....arr[99]=100;(是有序的)
	for (i = 0; i < 100; i++)
	{
		arr[i] = i + 1;
	}
	// 输入要猜的数字
	int guess = 0;
	printf("请输入要猜的数字\nguess =>");
	scanf("%d", &guess);
	// 二分查找算法
	int j = Search(arr, 100, guess);
	if (j > 0)
		printf("找到啦,该数字在arr数组中下标为%d的位置\n", j);
	else
		printf("没有找到\n");

	return 0;
}

运行结果:

❤️三:二分查找代码分析图解❤️

        该代码中数组arr是一个由1-10的有序数组:arr[0]=1,arr[1]=2, ... ,arr[9]=10。假设要猜的数字是数字3。

步骤一:

因为要猜的数字arr[mid]==5>3,所以此时需要 right = mid-1,也就是:

步骤二:

此时,right==3,left==0,mid==1。又因为arr[mid]==2<3,所以需要 left = mid+1,也就是:

步骤三:

 此时 arr[mid]==3==guess。即找到了该数字。循环完毕。


总结:二分查找算法的时间复杂度为 O(log n),其中 n 为数组元素个数。相较于线性查找算法,二分查找算法的效率更高,尤其适用于大型有序数组的查找操作。

❤️四:解决二分查找相关题型❤️

(●'◡'●) 练习巩固 (●'◡'●)👍

💕4.1:二分查找题型一💕

二分查找-I_牛客题霸_牛客网 (nowcoder.com)

💕4.2:二分查找题型二💕

二分查找-II_牛客题霸_牛客网 (nowcoder.com)


每日鸡汤:心疼过去不如想通,想通了就会豁然开朗,放下包袱,迎接更轻松的明天

祝愿大家都有一个好的未来,不辜负现在的努力!!!🦖🦖🦖 

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值