前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言练习之二分法

C语言练习之二分法

作者头像
摘星
发布2023-04-28 09:57:35
3030
发布2023-04-28 09:57:35
举报
文章被收录于专栏:C/C++学习

前言

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

一、思路

设数组的第一个值下标为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所对应的数组元素的小标

二、源代码以及运行截图

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

源代码:

代码语言:javascript
复制
#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
0e11c8cec4dc4c0daf70a9693ae1095a.png

总结

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、思路
  • 二、源代码以及运行截图
    • 源代码:
      • 运行截图:
      • 总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档