C语言练习之二分法

目录

前言

一、思路

二、源代码以及运行截图

源代码:

运行截图:

总结


52a50d42995544038d9488f547c43122.gif

前言

二分法查一个数
编写代码在一个整形有序数组中查找具体的某个数
要求:找到了就打印数字所在的下标,找不到则输出:找不到。

一、思路

设数组的第一个值下标为left,最后一个值下标为right;
假设left和right的中间值为mid = left+(right-left)/2
设置一个循环,判断mid对应的数是否等于所查找的数input
若arr[mid]不等于input就判断arr[mid]和input的关系
①arr[mid]>input时:left不变,让right = mid;
②arr[mid]<input时:right不变,让left = mid;
一直循环直到出现两种情况结束:
①当left>right时,输出找不到
②当arr[mid] == input时,输出mid所对应的数组元素的小标

二、源代码以及运行截图

为了方便大家的交流和学习,我将程序源代码和运行截图放置在下方。

源代码:

#include<stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9 };
	int left = 0;
	int right = sizeof(arr)/sizeof(arr[0])-1;//计算数组的元素个数,但是由于数组下标由0开始,所以-1得到数组最后一位元素的下标
//要注意的是,如果这个部分int right = sizeof(arr)/sizeof(arr[0]),也就是没有减一的情况,
//相应的下面循环部分的条件就要改为left<right,
//因为这种写法的right是数组最后一个元素的下一个int类型数据的下标,也就是出现了越界访问,这时的left就不可能出现等于right这种情况。
    int mid = 0;
	int input = 0;
	printf("请输入您要查找的数字:>");
	scanf("%d", &input);
	while (left <= right)//当right = left时mid也有可能等于input所以要用<=
	{
		mid = left + (right - left) / 2;//用left+(right-left)/2,而不用(left+right)/2是担心后者(right+left)的值过大超过了整形的取值范围造成溢出,使结果不准确
		if (arr[mid] == input)
		{
			printf("找到了,下标为%d\n", mid);
			break;
		}
		if (arr[mid] > input)//input<arrr[mid]说明input在mid的左侧,所以将right = mid继续在左侧进行寻找。
		{
			right = mid;
		}
		if (arr[mid] < input)//input>arrr[mid]说明input在mid的右侧,所以将left = mid继续在右侧进行寻找。
		{
			left = mid;
		}
	}
	return 0;
}

运行截图:

0e11c8cec4dc4c0daf70a9693ae1095a.png


总结

  以上就是今天要讲的内容,本文简单的介绍了用C语言在一个有序整数数组中用二分查找法查找一个数返回它的下标的思路,还进一步展示了代码的运行结果验证了作者的思路。

本文的作者也只是一个正在学习C语言等编程知识的萌新,若这篇文章中有哪些不正确的内容,请在评论区向作者指出(也可以私信作者),欢迎大佬们指点,也欢迎其他正在学习C语言的萌新和作者进行交流。

最后,如果本篇文章对你有所启发的话,也希望可以支持支持作者,后续作者也会定期更新学习记录。谢谢大家!

dbe90b9d469f43f989ae523f3666cc58.gif

 

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

codeJinger

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

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

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

打赏作者

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

抵扣说明:

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

余额充值