C语言:使用 普通方法 和 二分查找算法(折半查找算法) 在一个有序数组中查找具体的某个数字n

news2025/7/10 6:48:15

题目:

从键盘输入数字n,在一个 有序数组 中查找具体的某个数字n。

                    

 =========================================================================

                       

思路一:普通方法

(逻辑简单,在无序数组中也可以使用,但效率较低,需要逐个查找)

总体思路:

(一). 设置初始数组,生成相关变量

               

(二). 使用for循环数组中进行逐个查找

for循环 中使用 if条件判断语句 判断n是否在数组中

        找到使用 break 跳出循环打印相应信息

                   

(三). 未找到跳出 for循环 后,再使用 if语句 判断是否已遍历完了数组

未找到 n 且已遍历完数组打印相应信息

                


              

第一步:

(1). 设置初始数组int arr[];

                     

(2). 生成相关变量

int n = 0; -- 存放从键盘输入的要查找的值

int i = 0; -- 循环变量

                  

(3). 实现输入数据获取数据 -- scanf()函数

                     

实现代码:

//思路一:
#include <stdio.h>
int main()
{
	//设置初始数组:
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	//数组下标:   0 1 2 3 4 5 6 7 8 9

	int n = 0; //获取从键盘输入的要查找的值
	int i = 0; //循环变量

	//输入数据和获取数据:
	scanf("%d", &n);


	return 0;
}

实现图片:

                 


                 

第二步:

(1). 编写for循环循环遍历数组中的元素

              

(2). 编写for循环中的if条件判断语句

判断数组遍历的元素是否和输入的n一致一致则打印相应信息后提前break跳出循环

                     

实现代码:

//思路一:
#include <stdio.h>
int main()
{
	//设置初始数组:
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	//数组下标:   0 1 2 3 4 5 6 7 8 9

	int n = 0; //获取从键盘输入的要查找的值
	int i = 0; //循环变量

	//输入数据和获取数据:
	scanf("%d", &n);

	//编写for循环:循环遍历数组中的元素
	for (i = 0; i < 10; i++)
	{
		//编写for循环中的if条件判断语句:
		if (arr[i] == n)
			//循环判断数组遍历的元素是否和n相同
		{
			printf("找到了,该值在数组中对应的下标是:%d\n", i);
			break;
			//相同则打印相应信息后break跳出循环
		}
	}

	return 0;
}

实现图片:

                 


                 

第三步:

如果for循环遍历数组元素后都没有找到n的话,

再使用一个if条件判断语句,判断是否已遍历完了数组元素

已遍历完数组且没有找到n打印对应信息

                     

实现代码:

//思路一:
#include <stdio.h>
int main()
{
	//设置初始数组:
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	//数组下标:   0 1 2 3 4 5 6 7 8 9

	int n = 0; //获取从键盘输入的要查找的值
	int i = 0; //循环变量

	//输入数据和获取数据:
	scanf("%d", &n);

	//编写for循环:循环遍历数组中的元素
	for (i = 0; i < 10; i++)
	{
		//编写for循环中的if条件判断语句:
		if (arr[i] == n)
			//循环判断数组遍历的元素是否和n相同
		{
			printf("找到了,该值在数组中对应的下标是:%d\n", i);
			break;
			//相同则打印相应信息后break跳出循环
		}
	}

	//如果for循环遍历数组元素后都没有找到n的话:
	//再使用一个if条件判断语句,判断是否已遍历完了数组元素,
	//已遍历完数组且没有找到n,打印对应信息。
	if (i == 10) //10超过了数组下标,说明数组中没有这个值
	{
		printf("数组中没有该值。\n");
	}

	return 0;
}

实现图片:

                    

思路一:最终代码和实现效果

最终代码:

//思路一:
#include <stdio.h>
int main()
{
	//设置初始数组:
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	//数组下标:   0 1 2 3 4 5 6 7 8 9

	int n = 0; //获取从键盘输入的要查找的值
	int i = 0; //循环变量

	//输入数据和获取数据:
	scanf("%d", &n);

	//编写for循环:循环遍历数组中的元素
	for (i = 0; i < 10; i++)
	{
		//编写for循环中的if条件判断语句:
		if (arr[i] == n)
			//循环判断数组遍历的元素是否和n相同
		{
			printf("找到了,该值在数组中对应的下标是:%d\n", i);
			break;
			//相同则打印相应信息后break跳出循环
		}
	}

	//如果for循环遍历数组元素后都没有找到n的话:
	//再使用一个if条件判断语句,判断是否已遍历完了数组元素,
	//已遍历完数组且没有找到n,打印对应信息。
	if (i == 10) //10超过了数组下标,说明数组中没有这个值
	{
		printf("数组中没有该值。\n");
	}

	return 0;
}

实现效果:

                    

 =========================================================================

                       

思路二:二分查找算法(折半查找算法)-- 重点!

(在有序数组查找中效率更高,一次查找就能排除一半的值)

总体思路:

                


                

第一步:

(1). 设置初始数组int arr[]

            

(2). 生成相关变量

int n = 0; -- 存放从键盘输入的要查找的值

int i = 0; -- 循环变量

int sz = sizeof(arr) / sizeof(arr[0]) -- 数组元素个数。

             

(3). 实现输入数据获取数据 -- scanf()函数

                     

实现代码:

//思路二:
#include <stdio.h>
int main()
{
	//设置初始数组:
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//升序(有序数组)
	//数组下标:   0 1 2 3 4 5 6 7 8 9

	int n = 0; //获取从键盘输入的要查找的值
	int i = 0; //循环变量
	int sz = sizeof(arr) / sizeof(arr[0]); //数组元素个数
	//sizeof(arr):计算数组总大小(单位是字节)
	//sizeof(arr[0]):计算数组中单个元素大小
	//用 sizeof(arr) / sizeof(arr[0]) :总大小 除以 单个元素大小 == 元素个数

	//输入数据和获取数据:
	scanf("%d", &n);

	return 0;
}

实现图片:

                  


                 

第二步:

(1). 创建 左下标left 右下标right

           

(2). 设置一个 变量flag,用来设置未找到情况下的处理方式

                     

实现代码:

//思路二:
#include <stdio.h>
int main()
{
	//设置初始数组:
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//升序(有序数组)
	//数组下标:   0 1 2 3 4 5 6 7 8 9

	int n = 0; //获取从键盘输入的要查找的值
	int i = 0; //循环变量
	int sz = sizeof(arr) / sizeof(arr[0]); //数组元素个数
	//sizeof(arr):计算数组总大小(单位是字节)
	//sizeof(arr[0]):计算数组中单个元素大小
	//用 sizeof(arr) / sizeof(arr[0]) :总大小 除以 单个元素大小 == 元素个数

	//输入数据和获取数据:
	scanf("%d", &n);

	//创建 左下标 和 右下标:
	int left = 0; //数组第一个下标是0,左下标
	int right = sz - 1;//数组从0开始,用 元素个数-1 得右下标

	//设置一个flag:
	int flag = 0; //用来设置未找到情况下的处理方式

	return 0;
}

实现图片:

                 


                 

第三步:

(1). 使用while循环结合左右下标进行循环查找

             

(2). 确定 中间下标mid

                     

实现代码:

//思路二:
#include <stdio.h>
int main()
{
	//设置初始数组:
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//升序(有序数组)
	//数组下标:   0 1 2 3 4 5 6 7 8 9

	int n = 0; //获取从键盘输入的要查找的值
	int i = 0; //循环变量
	int sz = sizeof(arr) / sizeof(arr[0]); //数组元素个数
	//sizeof(arr):计算数组总大小(单位是字节)
	//sizeof(arr[0]):计算数组中单个元素大小
	//用 sizeof(arr) / sizeof(arr[0]) :总大小 除以 单个元素大小 == 元素个数

	//输入数据和获取数据:
	scanf("%d", &n);

	//创建 左下标 和 右下标:
	int left = 0; //数组第一个下标是0,左下标
	int right = sz - 1;//数组从0开始,用 元素个数-1 得右下标

	//设置一个flag:
	int flag = 0; //用来设置未找到情况下的处理方式

	//使用while循环结合左右下标进行循环查找:
	while (left <= right)
		//left <= right:说明被左右下标包裹的数组还有值,还有值继续循环判断
	{
		//确定中间下标mid:
		int mid = (left + right) / 2;

		//进行查找:

	}

	return 0;
}

实现图片:

                 


                 

第四步:

(1). 循环中找到对应元素的情况处理

               

(2). 循环中未找到对应元素的情况处理

                     

实现代码:

//思路二:
#include <stdio.h>
int main()
{
	//设置初始数组:
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//升序(有序数组)
	//数组下标:   0 1 2 3 4 5 6 7 8 9

	int n = 0; //获取从键盘输入的要查找的值
	int i = 0; //循环变量
	int sz = sizeof(arr) / sizeof(arr[0]); //数组元素个数
	//sizeof(arr):计算数组总大小(单位是字节)
	//sizeof(arr[0]):计算数组中单个元素大小
	//用 sizeof(arr) / sizeof(arr[0]) :总大小 除以 单个元素大小 == 元素个数

	//输入数据和获取数据:
	scanf("%d", &n);

	//创建 左下标 和 右下标:
	int left = 0; //数组第一个下标是0,左下标
	int right = sz - 1;//数组从0开始,用 元素个数-1 得右下标

	//设置一个flag:
	int flag = 0; //用来设置未找到情况下的处理方式

	//使用while循环结合左右下标进行循环查找:
	while (left <= right)
		//left <= right:说明被左右下标包裹的数组还有值,还有值继续循环判断
	{
		//确定中间下标mid:
		int mid = (left + right) / 2;

		//进行查找:
		//(1).循环中找到对应元素的情况处理:
		if (arr[mid] == n)
		{
			printf("找到了,该值在数组中对应的下标是:%d\n", mid);
			flag = 1; //找到就把flag设为1,说明找到了
			break; //找到就break跳出循环
		}
		//(2).循环中未找到对应元素的情况处理:
		else if (arr[mid] < n) 
			//中间值小于要找的值,排除mid和小于mid左边的值
		{
			left = mid + 1; 
			//因为mid左边(包括mid)都舍弃了,所以 mid+1 刚好就是新的左下标
		}
		else
			//中间值大于要找的值,排除mid和大于mid右边的值
		{
			right = mid - 1;
			//因为mid右边(包括mid)都舍弃了,所以 mid-1 刚好就是新的右下标
		}
	}

	return 0;
}

实现图片:

                 


                 

第五步:

退出循环,说明没有找到对应元素

看flag的值,打印相应的情况。

                     

实现代码:

//思路二:
#include <stdio.h>
int main()
{
	//设置初始数组:
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//升序(有序数组)
	//数组下标:   0 1 2 3 4 5 6 7 8 9

	int n = 0; //获取从键盘输入的要查找的值
	int i = 0; //循环变量
	int sz = sizeof(arr) / sizeof(arr[0]); //数组元素个数
	//sizeof(arr):计算数组总大小(单位是字节)
	//sizeof(arr[0]):计算数组中单个元素大小
	//用 sizeof(arr) / sizeof(arr[0]) :总大小 除以 单个元素大小 == 元素个数

	//输入数据和获取数据:
	scanf("%d", &n);

	//创建 左下标 和 右下标:
	int left = 0; //数组第一个下标是0,左下标
	int right = sz - 1;//数组从0开始,用 元素个数-1 得右下标

	//设置一个flag:
	int flag = 0; //用来设置未找到情况下的处理方式

	//使用while循环结合左右下标进行循环查找:
	while (left <= right)
		//left <= right:说明被左右下标包裹的数组还有值,还有值继续循环判断
	{
		//确定中间下标mid:
		int mid = (left + right) / 2;

		//进行查找:
		//(1).循环中找到对应元素的情况处理:
		if (arr[mid] == n)
		{
			printf("找到了,该值在数组中对应的下标是:%d\n", mid);
			flag = 1; //找到就把flag设为1,说明找到了
			break; //找到就break跳出循环
		}
		//(2).循环中未找到对应元素的情况处理:
		else if (arr[mid] < n) 
			//中间值小于要找的值,排除mid和小于mid左边的值
		{
			left = mid + 1; 
			//因为mid左边(包括mid)都舍弃了,所以 mid+1 刚好就是新的左下标
		}
		else
			//中间值大于要找的值,排除mid和大于mid右边的值
		{
			right = mid - 1;
			//因为mid右边(包括mid)都舍弃了,所以 mid-1 刚好就是新的右下标
		}
	}

	//退出循环,说明没有找到对应元素
	if (flag == 0)
	{
		printf("没找到\n");
	}

	return 0;
}

实现图片:

                    

思路二:最终代码和实现效果

最终代码:

//思路二:
#include <stdio.h>
int main()
{
	//设置初始数组:
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//升序(有序数组)
	//数组下标:   0 1 2 3 4 5 6 7 8 9

	int n = 0; //获取从键盘输入的要查找的值
	int i = 0; //循环变量
	int sz = sizeof(arr) / sizeof(arr[0]); //数组元素个数
	//sizeof(arr):计算数组总大小(单位是字节)
	//sizeof(arr[0]):计算数组中单个元素大小
	//用 sizeof(arr) / sizeof(arr[0]) :总大小 除以 单个元素大小 == 元素个数

	//输入数据和获取数据:
	scanf("%d", &n);

	//创建 左下标 和 右下标:
	int left = 0; //数组第一个下标是0,左下标
	int right = sz - 1;//数组从0开始,用 元素个数-1 得右下标

	//设置一个flag:
	int flag = 0; //用来设置未找到情况下的处理方式

	//使用while循环结合左右下标进行循环查找:
	while (left <= right)
		//left <= right:说明被左右下标包裹的数组还有值,还有值继续循环判断
	{
		//确定中间下标mid:
		int mid = (left + right) / 2;

		//进行查找:
		//(1).循环中找到对应元素的情况处理:
		if (arr[mid] == n)
		{
			printf("找到了,该值在数组中对应的下标是:%d\n", mid);
			flag = 1; //找到就把flag设为1,说明找到了
			break; //找到就break跳出循环
		}
		//(2).循环中未找到对应元素的情况处理:
		else if (arr[mid] < n) 
			//中间值小于要找的值,排除mid和小于mid左边的值
		{
			left = mid + 1; 
			//因为mid左边(包括mid)都舍弃了,所以 mid+1 刚好就是新的左下标
		}
		else
			//中间值大于要找的值,排除mid和大于mid右边的值
		{
			right = mid - 1;
			//因为mid右边(包括mid)都舍弃了,所以 mid-1 刚好就是新的右下标
		}
	}

	//退出循环,说明没有找到对应元素
	if (flag == 0)
	{
		printf("没找到\n");
	}

	return 0;
}

实现效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/619635.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

日常培训管理-参训名单/BootstrapTable获取表数据 / js 删除两个数组中id相同的对象/

---2022.11.9 1、 现在有一个功能是从下面待选名单中选中&#xff0c;再点击这个添加按钮&#xff0c;就会将这些人添加到上面这个参训名单&#xff0c;然后再给其中每个人手动打分。分打完 BootstrapTable中有两组数据&#xff0c;在下面待选名单数据条目前面中打钩选中&am…

从零开始学习CTF——CTF基本概念

这一系列把自己学习的CTF的过程详细写出来&#xff0c;方便大家学习时可以参考。 一、CTF简介 01」简介 中文一般译作夺旗赛&#xff08;对大部分新手也可以叫签到赛&#xff09;&#xff0c;在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。 CTF…

odoo-028 odoo前端页面显示跟后台数据库内容不一致

文章目录 一、问题二、排查三、总结 版本&#xff1a;odoo13 一、问题 同步多端数据的时候发现&#xff0c;产品product.template页面显示的内容跟用接口查询出来的不一样&#xff0c;接口查询的结果中name值总是后面多一些数据。 页面显示&#xff1a;六甲基二硅胺锂 1.0M T…

开源且免费:全面评估排名前五的缺陷管理工具

软件缺陷管理是一个关于发现&#xff0c;记录&#xff0c;追踪&#xff0c;处理和报告软件缺陷的过程。这是软件开发过程中的一个重要环节&#xff0c;它可以帮助开发团队保持代码的质量并及时修复问题。 一、早期小团队使用的免费缺陷管理工具 在项目早期或者团队规模较小的…

kafka事务(伪事务)

事务要点知识 Kafka的事务控制原理 主要原理&#xff1a; 开始事务-->发送一个ControlBatch消息&#xff08;事务开始&#xff09; 提交事务-->发送一个ControlBatch消息&#xff08;事务提交&#xff09; 放弃事务-->发送一个ControlBatch消息&#xff08;事务终…

瓦坎达的科技真的很厉害吗

就漫威电影宇宙来说&#xff0c;瓦坎达的科技真的很厉害吗 厉不厉害我不敢保证&#xff0c;但是这个IP段的服务器是真的好用 43.241.19.1 43.241.19.2 43.241.19.3 43.241.19.4 43.241.19.5 43.241.19.6 43.241.19.7 43.241.19.8 43.241.19.9 43.241.19.10 43.241.19.11 43.2…

使用ETLCloud强大的自定义规则实现自定义数据处理算法

实时数据处理规则有什么作用&#xff1f; 在大数据中的实时数据采集、ETL批量数据传输过程中很多数据处理过程以及数据质量都希望实时进行处理和检测并把不符合要求的脏数据过滤掉或者进行实时的数据质量告警等。 在数据仓库建设过程中&#xff0c;每家企业的数据处理过程中肯…

Java调用Groovy动态加载接口实现类,热部署不需要编译

pom <dependency><groupId>org.codehaus.groovy</groupId><artifactId>groovy-all</artifactId><version>2.4.3</version></dependency> Java接口&#xff1a; public interface Run {public void speed(int s); } Groovy实…

基于SSM的图书馆借阅管理系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着社会的发展和信息…

十二、Docker日志管理

Docker日志管理 Docker的日志大致有两种&#xff0c;一是Docker 引擎日志&#xff0c;也就是 dockerd服务自身运行时的日志&#xff1b;二是容器内的服务产生的日志。后一种有一定使用经验的童鞋应该发现有时候我们能通过docker logs查看容器日志&#xff0c;有时候又不能&…

就这水平也去大厂面试?你是怎么敢的啊

面试一直都是一个热门话题&#xff0c;软件测试员当然也逃不过~纵使你是一个技能全部满点的超优秀软件测试员&#xff0c;卡在面试这一关也是万万不可的。特别是大厂的测试员&#xff0c;他们面试所问的东西&#xff0c;你在学校通常接触不道&#xff0c;所以没有哪个应届生是一…

国内元宇宙游戏陆续开放,将带来科技娱乐新鲜感

自元宇宙概念兴起至今&#xff0c;国内多家互联网厂商纷纷参与其中&#xff0c;除了在区块链、人工智能、图像处理、云计算等专业技术领域深入布局&#xff0c;也通过大范围投资或收购的方式来扩大自身的元宇宙游戏版图。围绕这一新兴概念&#xff0c;一场产、学、研的实践正在…

高效科研工具(三):高效检索阅读paper-arXiv网站(arXiv使用大全、掌握研究热点、前沿动态)

高效科研工具&#xff08;三&#xff09;&#xff1a;高效检索阅读paper-arXiv网站&#xff08;arXiv使用大全、掌握研究热点、前沿动态&#xff09; 目录 0、前言&#x1f60f; 1、arXiv网站介绍&#x1f9d0; 2、arXiv网站使用&#x1f60e;&#x1f60e; 3、arXiv网站使用…

语义分割结果可视化(原图+语义掩码+图例)

语义分割结果可视化&#xff08;原图语义掩码图例&#xff09; 由于实习工作需要把语义分割结果可视化出来&#xff0c;要使用自定义颜色来区分不同的label&#xff0c;并绘制出图例并插入在图像右端。本文将介绍如何实现这样的语义分割结果图。 文章目录 语义分割结果可视化&a…

Mysql执行计划怎么看

执行计划就是sql的执行查询的顺序&#xff0c;以及如何使用索引查询&#xff0c;返回的结果集的行数 EXPLAIN SELECT * from A where X? and Y? 1.id :是一个有顺序的编号&#xff0c;是查询的顺序号&#xff0c;有几个 select 就显示几行。id的顺序是按 select 出现的顺序增…

13 【代理配置 插槽】

1.Vue脚手架配置代理 本案例需要下载axios库npm install axios 配置参考文档 Vue-Cli devServer.proxy vue.config.js 是一个可选的配置文件&#xff0c;如果项目的 (和 package.json 同级的) 根目录中存在这个文件&#xff0c;那么它会被 vue/cli-service自动加载。你也可以…

老人跌倒检测识别预警算法 yolov7

老人跌倒检测识别预警系统采用yolov7网络模型技术&#xff0c;老人跌倒检测识别预警算法对老人的行为进行实时监测。当老人发生跌倒时&#xff0c;系统将自动发出警报&#xff0c;及时通知现场护理人员进行处理。YOLOv7 的发展方向与当前主流的实时目标检测器不同&#xff0c;研…

MySQL表操作:提高数据处理效率的秘诀(进阶)(1)

&#x1f495;**“生命不在于相信奇迹&#xff0c;而在于创造奇迹。”——朱学恒**&#x1f495; &#x1f43c;作者&#xff1a;不能再留遗憾了&#x1f43c; &#x1f386;专栏&#xff1a;MySQL学习&#x1f386; &#x1f697;本文章主要内容&#xff1a;MySQL对表操作进阶…

Node.js从基础到项目实践

摘要&#xff1a; Node.js是一个基于Chrome V8引擎的JavaScript运行时环境&#xff0c;它允许开发者使用JavaScript构建高性能的服务器端应用程序。本文将介绍Node.js的基础知识&#xff0c;并通过项目实践的方式帮助读者深入理解Node.js的用法和功能。从基础到项目实践&#x…

建造者模式的运用

文章目录 一、建造者模式的运用1.1 介绍1.2 建造者模式结构1.3 建造者模式类图1.4 组装自行车案例1.4.1 组装自行车案例类图1.4.2 代码 1.5 优缺点1.6 使用场景1.7 模式扩展1.7.1 原始代码1.7.2 重构代码 一、建造者模式的运用 1.1 介绍 将一个复杂对象的构建与表示分离&…