【C语言】二分查找(详解)

这篇具有很好参考价值的文章主要介绍了【C语言】二分查找(详解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【C语言】二分查找(详解),秒懂C语言,算法,c语言,开发语言,数组

🎥 岁月失语唯石能言的个人主页        

🔥个人栏专:秒懂C语言

若在许我少年时,一两黄金一两风    

目录

一、二分查找的思路 

二、思路分析

2.1定义变量

2.2逻辑分析

三、代码实现

总结


一、二分查找的思路 

       二分查找是一种高效的查找算法,尤其适用于有序数组。它的基本思想是通过将查找区间逐步缩小一半,从而快速定位目标元素。对于大型数据集,二分查找的效率远高于线性查找。然而,它要求数据必须有序,且实现相对复杂一些。总的来说,二分查找是一种非常实用和强大的工具,在许多场景下都能发挥出其独特的优势。

   举个例子:

        朋友让你猜他刚买的一件衣服的价格,告诉你在(0~100)元之间。

        我们一般都是先猜中间价位50元,他说猜低了,你再猜75元,这样一步步的缩减范围。直到锁定86元。你只要用几次二分查找就能找到价格。而你要是从一开始猜你得猜86次,速度和效率提升非常大。


二、思路分析

例子:        int arr[] = {1,2,3,4,5,6,7,8,9,10};

首先题目会给你一个有序数组,让你找出某个数字比如说7的下标.

2.1定义变量

  • 首先我们定义lift,right,key,mid四个变量。left的下标为0;right的下标用sizeof(arr)/sizeof(arr[0])-1   (整个数组的大小)/(一个数组元素的大小)-1   因为数组的下标是从0开始所以要减1。
  • mid = (left + right) / 2;
    如果left和right比较大的时候可能会越界,这时候可以改良一下:
  • mid = left+(right-left)/2;

【C语言】二分查找(详解),秒懂C语言,算法,c语言,开发语言,数组

2.2逻辑分析

  • 然后我们需要拿arr[mid](50元)key去比较大小然后不断缩小范围。
  • 如果arr[mid] == key那就说明找到了,直接打印。
  • 如果arr[mid] > key说明你猜大了那你就要缩小范围1~100就要改成1~49(因为50比价格贵不需要取50元)所以right下标就要改成mid-1
  • 同理,如果arr[mid] < key说明你猜小了那你就要缩小范围1~100就要改成51~100,left的下标改成mid+1
  • 当然有人会担心mid = (left + right) / 2(left + right)是奇数除出来不是整数怎么办。/ 符号位会自动舍掉余数不用当心。
if (arr[mid] == key)
{
	printf("找到了,下标是%d\n", mid);
	break;
}
if (arr[mid] > key)
{
	right = mid - 1;
}
if (arr[mid] < key)
{
	left = mid + 1;
}
  • 然后在使用while循环来实现不断猜数字的过程
  • while的条件就设置成left <= right,只要范围内还有数字就继续排查直到找出,例如3~5,直到找到只剩5~5,找到5。
  • 或者全都找完了还找不到,这时候leftright会继续加减。这时left 就会大于 right,就打印找不到。
while (left <= right)
{
	mid = (left + right) / 2;

	if (arr[mid] == key)
	{
		printf("找到了,下标是%d\n", mid);
		break;
	}
	if (arr[mid] > key)
	{
		right = mid - 1;
	}
	if (arr[mid] < key)
	{
		left = mid + 1;
	}
	
}
if (left > right)
	printf("找不到\n");
return 0;

同理,如果是降序数组的话只需要把 right = mid - 1;和 left = mid + 1;交换位置就行:

【C语言】二分查找(详解),秒懂C语言,算法,c语言,开发语言,数组


三、代码实现

这是升序的代码:

#include <stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int left = 0;
	int right = sizeof(arr) / sizeof(arr[0]) - 1;
	int key = 7;//要找的数字
	int mid = 0;//记录中间元素的下标
	while (left <= right)
	{
		mid = (left + right) / 2;

		if (arr[mid] == key)
		{
			printf("找到了,下标是%d\n", mid);
			break;
		}
		if (arr[mid] > key)
		{
			right = mid - 1;
		}
		if (arr[mid] < key)
		{
			left = mid + 1;
		}
		
	}
	if (left > right)
		printf("找不到\n");
	return 0;
}

这是降序代码:

#include <stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int left = 0;
	int right = sizeof(arr) / sizeof(arr[0]) - 1;
	int key = 7;//要找的数字
	int mid = 0;//记录中间元素的下标
	while (left <= right)
	{
		mid = (left + right) / 2;

		if (arr[mid] == key)
		{
			printf("找到了,下标是%d\n", mid);
			break;
		}
		if (arr[mid] > key)
		{
			left = mid + 1;
		}
		if (arr[mid] < key)
		{
			right = mid - 1;
		}

	}
	if (left > right)
		printf("找不到\n");
	return 0;
}

往期文章推荐:

C语言如何生成随机数以及设置随机数的范围。(超详细):

【C语言】函数调用及创建,并将数组传参到函数:

【C语言】——函数递归,用递归简化并实现复杂问题:


总结

以上就是关于二分查找的相关知识,二分查找虽然性能比较优秀,但应用场景也比较有限,底层必须依赖数组,并且还要求数据是有序的。所以我们在选用算法时需要从多方面考虑。

【C语言】二分查找(详解),秒懂C语言,算法,c语言,开发语言,数组文章来源地址https://www.toymoban.com/news/detail-759762.html

到了这里,关于【C语言】二分查找(详解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • C语言:写一个函数,实现一个整型有序数组的二分查找

    C语言:写一个函数,实现一个整型有序数组的二分查找

    写一个 函数 ,实现一个 整型有序数组 的 二分查找 ,找出 要找的数字 在 数组中对应的下标 。                       =========================================================================                         (一)自定义函数部分:                  (1). 参数: int arr[]

    2024年02月08日
    浏览(12)
  • C++二分算法(二分查找&二分答案)细节详解

     二分算法可以分为 二分查找 和 二分答案 。 以在一个 升序数组 中查找一个数为例。它每次考察数组当前部分的 中间元素 ,如果中间元素刚好是要找的,就结束搜索过程;如果中间元素小于所查找的值,那么左侧的只会更小,不会有所查找的元素,只需到右侧查找;如果

    2024年02月08日
    浏览(12)
  • 【C语言】二分查找(详解)

    【C语言】二分查找(详解)

    🎥 岁月失语唯石能言的个人主页         🔥 个人栏专: 秒懂C语言 ⭐ 若在许我少年时,一两黄金一两风      目录 一、二分查找的思路  二、思路分析 2.1定义变量 2.2逻辑分析 三、代码实现 总结         二分查找是一种高效的查找算法,尤其适用于有序数组。它的基

    2024年02月04日
    浏览(7)
  • C++二分查找算法:有序矩阵中的第 k 个最小数组和

    C++二分查找算法:有序矩阵中的第 k 个最小数组和

    二分查找算法合集 C++二分查找算法:查找和最小的 K 对数字 十分接近m恒等于2 给你一个 m * n 的矩阵 mat,以及一个整数 k ,矩阵中的每一行都以非递减的顺序排列。 你可以从每一行中选出 1 个元素形成一个数组。返回所有可能数组中的第 k 个 最小 数组和。 示例 1: 输入:

    2024年02月05日
    浏览(15)
  • Java 语言实现二分查找算法

    【引言】 二分查找算法是一种高效且常用的查找算法。它适用于已排序的数组或列表,并通过将目标值与中间值进行比较,来确定目标值在左侧还是右侧。本文将使用Java语言实现二分查找算法,并详细讲解其思想和代码实现。 【算法思想】 二分查找的核心思想是不断缩小查

    2024年02月11日
    浏览(11)
  • 【算法】【Python3、动态规划、贪心、二分查找】力扣1671. 得到山形数组的最少删除次数

    1671. 得到山形数组的最少删除次数 给定一个整数数组 nums ,我们定义该数组为山形数组当且仅当: nums 的长度至少为 3。 存在一个下标 i 满足 0 i len(nums) - 1 且: nums[0] nums[1] ... nums[i - 1] nums[i] nums[i] nums[i + 1] ... nums[len(nums) - 1] 现在,给定整数数组 nums ,我们的目标是将其变为

    2024年01月18日
    浏览(14)
  • c语言经典算法—二分查找,冒泡,选择,插入,归并,快排,堆排

    c语言经典算法—二分查找,冒泡,选择,插入,归并,快排,堆排

             1、前提条件:数据有序,随机访问;          2、实现:递归实现,非递归实现          3、注意事项:                 循环退出条件:low =high,low = high.说明还有一个元素,该元素还要与key进行比较                 mid的取值:mid=(low + high)/2;mid = l

    2024年02月05日
    浏览(15)
  • Offer必备算法_二分查找_八道力扣OJ题详解(由易到难)

    Offer必备算法_二分查找_八道力扣OJ题详解(由易到难)

    目录 二分查找算法原理 ①力扣704. 二分查找 解析代码 ②力扣34. 在排序数组中查找元素的第一个和最后一个位置 解析代码 ③力扣69. x 的平方根  解析代码 ④力扣35. 搜索插入位置 解析代码 ⑤力扣852. 山脉数组的峰顶索引 解析代码 ⑥力扣162. 寻找峰值 解析代码 ⑦力扣153. 寻

    2024年02月19日
    浏览(8)
  • 【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值

    【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值

    《博主简介》 小伙伴们好,我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌ 更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍 感谢小伙伴 们点赞、关注! class   Solution :      def   mySqrt ( self ,  x :   int )   -   int :       

    2024年02月04日
    浏览(19)
  • 【题解】二分查找-I、二维数组中的查找

    题目链接:二分查找-I 解题思路:遍历 代码如下: 这种解题思路很明显没有很好的利用题目中强调的数组是升序的,既然是升序,那肯定前半部分偏小,后半部分偏大,如果我们能知道应该去前半部分还是后半部分寻找target,效率相对就提升很多了,于是我们有了下面的分

    2024年02月14日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包