二分查找法

作者介绍:友友们好我是沐曦希,可以叫我小沐💕
作者主页:沐曦希的个人博客主页.🎉
作者的gitee:https://gitee.com/muxi-c-language
C语言系列文章:
🎈 1. 循环语句这些知识点你真的会了吗?(1)
🎈2. 分支语句你会了吗?
🎈3. .C语言第五课.
🎈4. C语言第四课.
🎉小沐和友友们一样喜欢编辑,天天敲代码🤭,沉迷学习,日渐消瘦。很荣幸能向大家分享我的所学,和大家一起进步,成为合格的卷王。✨如果文章有错误,欢迎在评论区✏️指正。那么开始今天的学习吧!😘


在这里插入图片描述

1.前言

二分查找是一种算法,其输入是一个有序的元素列表(必须是有序的)✏️,如果查找的元素包含在列表中,二分查找返回其位置,否则返回NULL(空指针)。例如:有一个数组存储了1~100,随机的选择其中一个数字(假设为60),你需要以最少的次数猜到我所选择的数字,每次猜测后,我会告诉你大了,小了和对了。这是很传统的查找方法,检测次数太多,太繁琐,那么便有了二分查找法。

2.二分查找法

“二分查找“也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。查找过程首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。

例如:
一个有序数组存储1~10,设需要查找的数字则为7。

int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int left = 0;
	int right = sizeof(arr) / sizeof(arr[0]) - 1;
	int mid=left+(right-left)/2;//这样为了防止数值过大而溢出

在这里插入图片描述
第一种情况是当被判断为猜大了后:此时right的下标就变为了mid-1,left不变

if (arr[mid] > key)
		{
			right = mid - 1;
		}

在这里插入图片描述
第二种情况是当被判断为猜小后,mid下标变为mid+1,left下标不变。

if (arr[mid] < key)
		{
			left = mid + 1;
		}

在这里插入图片描述

第三种情况是当arr[mid]为所查找的值时候,直接打印下标

if(arr[mid]==k)
    printf("找到了,下标为:>%d",mid);

代码实现:

#include<stdio.h>
int main()
{
	int arr[] = {01,2,3,4,5,6,7,8,9};
	int left = 0;
	int right = sizeof(arr) / sizeof(arr[0]) - 1;
	int key = 7;
	int mid = 0;
	while (left <= right)
	{
		int mid=left+(right-left)/2;
		if (arr[mid] > key)
		{
			right = mid - 1;
		}
		else if (arr[mid] < key)
		{
			left = mid + 1;
		}
		else
			break;
	}
	if (left <= right)
		printf("找到了,下标是:>%d\n", mid);
	else
		printf("找不到\n");
}

在这里插入图片描述
从而实现了简单的一个有序数组的二分查找问题。
如果写一个关于二分查找的函数呢?
代码:

//如果实现一个二分查找函数:
int bin_search(int arr[], int left, int right, int key)
{
      int mid = 0;
     while(left<=right)
     {
         mid = (left+right)>>1;
         if(arr[mid]>key)
         {
             right = mid-1;
         }
         else if(arr[mid] < key)
         {
             left = mid+1;
         }
         else
             return mid;//找到了,返回下标
         }
     }
     return -1;
}

3.写在最后

那么今天的学习就到这里了。友友们觉得不错的可以给个关注,点赞或者收藏哦!😘感谢各位友友们的支持。以下的代码希望各位大佬们自行检验哦,毕竟亲手操作让记忆更加深刻。

你的❤️点赞是我创作的动力的源泉
你的✨收藏是我奋斗的方向
你的🙌关注是对我最大的支持
你的✏️评论是我前进的明灯
创作不易,希望大佬你支持一下小沐吧😘

下一期见了!

  • 68
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 64
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 64
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐曦希

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值