【二分查找】详细讲解(C语言折半查找)

本文详细介绍了二分查找算法的实现过程,包括其前提条件、流程图解析及C语言实现代码。通过实例展示如何通过二分查找高效定位目标值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天我们来实现二分查找,二分查找还算循环题里面一道比较有难度的题,今天我们就来看一下二分查找如何实现。

 

目录

原理图

流程图

语言简述


二分查找的前提条件:

1、数据必须有序

2、必须采取顺序存储(也就是数组,不能是链表)

好的,那我们先来看看原理图和流程图:

原理图

流程图

语言简述

 现在我来简述一下二分查找的流程:

先将low赋值为0,然后将high赋值为数组的最大下标,(可以用sizeof计算),进入循环。

将循环条件设为low<=high,然后将mid值赋为(high+low)/2,将查找的值与arr[mid]进行比较,如果arr[mid]大于target就是在左半边,把high的值赋为mid-1,将high挪到mid的左边,(将high赋值为mid-1而不是high=mid,这样可以避免target的下标是最小值或最大值查找不到的情况,你或者可以这样想,因为arr[mid]已经不等于target了,还不如将直接将high移动到mid的左边,不必将high赋值为mid 的值,多此一举)。

如果arr[mid]小于target就是在右半边,即将low赋值为mid+1,直到arr[mid]的值等于target,我们就可以将mid的值给index并break循环,最后判断index是否等于-1,等于-1则就是没找到,不等于就输出index;

 有人就想了,为什么要low<=high。首先,low>high就没有意义了,这肯定是判断为假的。然后就是low=high,这个条件是十分有用的,在C语言中这样除以2是会省略掉小数的,所以mid的值会小于或等于(low+high)/2真实的值,判断arr[mid]与target大小时,最后一步high、low、mid会处于重合的状态,因为mid总为high和low的中间值,是不可能跳出他们的,所以我们要保留low=high的情况,即最后一步来判断arr【mid】是否等于target,等于,则记录下mid的值。不等于就输出找不到了。

 

最后,附上二分查找的代码

#include <stdio.h>
int main()
{
	int target = 0;
	int index = -1;
	int arr[] = { 2,5,6,7,8,11,32,44,56,66,74,88,97 };
	//随便定义的一个有序数组
	scanf("%d", &target);
	int low = 0;     
	int high = sizeof (arr)/sizeof (arr[0])-1;//将high赋值为最大下标
	int  mid = 0;
	while (low <= high)              
	//结束条件:low>high结束循环
	{
		mid = (low+high) / 2;         
		//每次进入循环重新计算mid的值
		if (arr[mid] < target)
		{
			low = mid+1;              
			//arr[mid]笑了,将low一道mid的右边一格
        }
		else if (arr[mid] > target)
		{
			high = mid-1;             
			//arr[mid]大了,将high移到mid的左边一格
		}
		else
		{
			index = mid;              
			//将mid的值记录下来,接着就跳出循环
			break;
		}
    }
	if (index == -1)
	{
		printf("没找到\n");
	}
	else
		printf("下标是:%d\n", index);
	return 0;
}

最后,都看到这了,希望大家评论留个赞呗~~

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Brant_zero2022

素材免费分享不求打赏,只求关注

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

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

打赏作者

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

抵扣说明:

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

余额充值