C语言:写一个函数,实现一个整型有序数组的二分查找

news2024/9/25 19:25:08

题目:

写一个函数,实现一个整型有序数组二分查找,找出要找的数字数组中对应的下标

                    

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

                       

思路:

总体思路:

(一)自定义函数部分:

                

(1).

参数:

int arr[] -- 数组首地址

 int k -- 要在数组中找的数字

 int sz -- 数组长度

              

定义左右下标

                   

(2).

使用二分查找法

               

(二)主函数部分:

           

定义有序数组,设置要查找的值,求出数组元素个数

               

调用自定义函数

               

判断自定义函数的返回值打印相应的情况

                


                 

自定义函数部分:

第一步:

(1). 形参的设置:

int arr[] -- 数组首地址

int k -- 要在数组中找的数字

int sz -- 数组长度

             

(2). 定义左右下标 -- left right

                     

实现代码:

#include <stdio.h>

int binary_search(int arr[], int k, int sz)//形参
{
	int left = 0; //左下标
	int right = sz - 1; //右下标


}

int main()
{

	return 0;
}

实现图片:

                 


                 

第二步:

使用二分查找方法

         

(1). 使用while循环

          

(2). 生成中间值下标 mid

int mid = left + (right - left) / 2;

left 小的一边(right - left)两者的差值(right - left)/ 2 差值的一半

left + (right - left) / 2,即 小的一边 加上 差值的一半

这时 两边是一样的任意一边都是平均值中间值

              

(3).

如果中间值 小于 要找的值

舍弃中间值和中间值左边的所有数调整 左下标left left = mid + 1

如果中间值 大于 要找的值

舍弃中间值和中间值右边的所有数调整 右下标rightright = mid - 1

如果中间值 等于 要找的值

返回中间值下标mid

               

(4). 找不到返回 -1

                     

实现代码:

int binary_search(int arr[], int k, int sz)//形参
{
	int left = 0; //左下标
	int right = sz - 1; //右下标

	//使用while循环
	while (left <= right)
	{
		//生成中间值下标 mid :
		int mid = left + (right - left) / 2;

		//二分查找:
		if (arr[mid] < k)//中间值 小于 要找的值
		{
			left = mid + 1;
			//舍弃中间值和中间值左边的所有数,
			//调整 左下标left :left = mid + 1。
		}
		else if (arr[mid] > k)//中间值 大于 要找的值
		{
			right = mid - 1;
			//舍弃中间值和中间值右边的所有数,
			//调整 右下标right :right = mid - 1。
		}
		else if (arr[mid] == k)//中间值 等于 要找的值
		{
			return mid;
			//返回中间值下标mid。
		}
	} 
	if (left > right)
	{
		return -1; //找不到则返回-1
	}
}

实现图片:

                 


                 

主函数部分:

(1). 定义有序数组,设置要查找的值,求出数组元素个数

               

(2). 调用自定义函数

                

(3). 判断自定义函数返回值打印相应的情况

                     

实现代码:

#include <stdio.h>

int binary_search(int arr[], int k, int sz)//形参
{
	int left = 0; //左下标
	int right = sz - 1; //右下标

	//使用while循环
	while (left <= right)
	{
		//生成中间值下标 mid :
		int mid = left + (right - left) / 2;

		//二分查找:
		if (arr[mid] < k)//中间值 小于 要找的值
		{
			left = mid + 1;
			//舍弃中间值和中间值左边的所有数,
			//调整 左下标left :left = mid + 1。
		}
		else if (arr[mid] > k)//中间值 大于 要找的值
		{
			right = mid - 1;
			//舍弃中间值和中间值右边的所有数,
			//调整 右下标right :right = mid - 1。
		}
		else if (arr[mid] == k)//中间值 等于 要找的值
		{
			return mid;
			//返回中间值下标mid。
		}
	} 
	if (left > right)
	{
		return -1; //找不到则返回-1
	}
}

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; //定义有序数组
	int k = 7; //设置要查找的值
	int sz = sizeof(arr) / sizeof(arr[0]); //求出数组元素个数
	// 整个数组大小 / 单个数组元素大小 = 数组元素个数

	//调用自定义函数:
	int ret = binary_search(arr, k, sz); //ret接收返回的下标

	//判断自定义函数的返回值,打印相应的情况:
	if (ret == -1) //未找到,返回-1
	{
		printf("找不到\n");
	}
	else
	{
		printf("找到了,下标是:%d\n", ret);
	}

	return 0;
}

实现图片:

                    

最终代码和实现效果

最终代码:

#include <stdio.h>

int binary_search(int arr[], int k, int sz)//形参
{
	int left = 0; //左下标
	int right = sz - 1; //右下标

	//使用while循环
	while (left <= right)
	{
		//生成中间值下标 mid :
		int mid = left + (right - left) / 2;

		//二分查找:
		if (arr[mid] < k)//中间值 小于 要找的值
		{
			left = mid + 1;
			//舍弃中间值和中间值左边的所有数,
			//调整 左下标left :left = mid + 1。
		}
		else if (arr[mid] > k)//中间值 大于 要找的值
		{
			right = mid - 1;
			//舍弃中间值和中间值右边的所有数,
			//调整 右下标right :right = mid - 1。
		}
		else if (arr[mid] == k)//中间值 等于 要找的值
		{
			return mid;
			//返回中间值下标mid。
		}
	} 
	if (left > right)
	{
		return -1; //找不到则返回-1
	}
}

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; //定义有序数组
	int k = 7; //设置要查找的值
	int sz = sizeof(arr) / sizeof(arr[0]); //求出数组元素个数
	// 整个数组大小 / 单个数组元素大小 = 数组元素个数

	//调用自定义函数:
	int ret = binary_search(arr, k, sz); //ret接收返回的下标

	//判断自定义函数的返回值,打印相应的情况:
	if (ret == -1) //未找到,返回-1
	{
		printf("找不到\n");
	}
	else
	{
		printf("找到了,下标是:%d\n", ret);
	}

	return 0;
}

实现效果:

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

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

相关文章

融云《社交泛娱乐出海作战地图》,手把手教你拿下出海“最后一公里”难题

社交泛娱乐出海&#xff0c;已然是当下互联网出海的主力。关注【融云全球互联网通信云】了解更多 不少国内互联网巨头都将社交泛娱乐作为海外市场重点布局赛道。从较为传统的音视频、短视频社交出海&#xff0c;到逐渐直播出海、元宇宙社交出海&#xff0c;社交泛娱乐出海版图…

微信小程序实现tab及瀑布流页面

一、效果 二、代码 复制代码可以直接用 1、json代码 {"usingComponents": {},"navigationStyle": "custom" } 2、xml代码 <!--pages/find_module/findPage.wxml--> <view class"container_serach"><!-- 搜索模块 -…

Java EE 企业级应用开发教程题库(第二版)

前言 Java EE这是一门偏向于实践的课&#xff0c;奈何考试理论居多。一学期想搞懂三个框架&#xff0c;嘿嘿&#xff0c;难哦&#xff01;如果你是大一大二的同学&#xff0c;认认真真学习&#xff0c;真的有用。如果你是大三的同学&#xff0c;像就业并且走这个方向的同学&…

VMware Horizon 8 运维系列(一)windows系统重启被禁用的ipv6功能

前言 Horizon 8 在创建桌面池之前,需要对模板虚拟机进行配置,其中会用到windows优化工具,通过禁用一些不必要的服务或功能,让系统达到优化的效果。 最近客户提出一个需求:需要对虚拟机开启ipv6功能,并同时使用ipv6地址。通过查看模板系统,ipv6已经被优化工具禁用,所以需…

SSM整合快速入门案例(二)

文章目录 前言一、表现层与前端数据传输协议定义二、表现层与前端数据传输协议实现三、异常处理器四、项目异常处理五、前后台协议联调实现CRUD- - 查询- - 添加- - 修改- - 删除 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c…

Netty核心源码剖析(五)

1.Netty核心组件EventLoop源码剖析 1>.NioEventLoop继承图 说明: ①.ScheduledExecutorService接口表示是一个定时任务接口,EventLoop可以接受定时任务; ②.EventLoop接口:Netty 接口文档说明该接口作用:一旦Channel注册了,就处理该Channel对应的所有I/O操作; ③.Single…

学成在线----day7

1、 视频处理-技术方案 1. 作业分片方案 掌握了xxl-job的分片广播调度方式&#xff0c;下边思考如何分布式去执行学成在线平台中的视频处理任务。 任务添加成功后&#xff0c;对于要处理的任务会添加到待处理任务表中&#xff0c;现在启动多个执行器实例去查询这些待处理任务…

FPGA基础知识-层次建模的概念

学习目标&#xff1a; 提示&#xff1a;这里可以添加学习目标 理解数字电路设计中自底向上和自顶向下的设计方法&#xff1b; 解释verilog中模块和模块实例之间的区别&#xff1b; 学习从4中不同的抽象角度来描述同一个模块&#xff1b; 解释仿真中的各个组成部分&#xf…

动态NAT过载配置与验证实验

动态NAT过载配置与验证实验 【实验目的】 部署端口地址转换。熟悉端口地址转换的应用方法。验证配置。 【实验拓扑】 实验拓扑如图所示。 实验拓扑 设备参数如表所示。 设备参数表 设备 接口 IP地址 子网掩码 默认网关 R1 f0/0 192.168.10.1 255.255.255.0 N/A …

《低代码指南》低代码开发平台Noodl即将开源

Noodl 是一个低代码开发平台,让设计师、开发者能够用低代码的可视化编程方法构建强大的 Web 应用。目前 Noodl 已被亚马逊、三星、沃尔玛等财富 500 强企业应用于原型设计到生产环境中。 日前,Noodl 官方发出公告表示,将从现有的付费订阅模式向开源模式过渡。 Noodl 目前的…

FineReport 连接mysql报错 当前驱动加载路径...

报错内容&#xff1a; 原因为帆软自带的jar包与当前使用的mysql&#xff08;8.0&#xff09;版本不一致&#xff0c;需要去官网下载对应连接的jar包 官网下载地址… 下载后在帆软对应路径替换掉jar包即可 FineReport_11.0\webapps\webroot\WEB-INF\lib

海格里斯HEGERLS四向穿梭车系统比件箱自动化解决方案有哪些突出优势?

随着仓储物流、电商行业的快速发展&#xff0c;自动化立体库的型式和技术日益完善&#xff0c;除了典型的单深度单货位立体库外&#xff0c;也逐渐发展了双深度和多货位的立体仓库。在自动化存储设备方面&#xff0c;除堆垛机外&#xff0c;利用四向穿梭车、子母车等技术构成的…

软件自动化测试基本流程(附流程图)

“自动化测试与软件开发过程从本质上来讲是一样的,无非是利用自动化测试工具(相当于软件开发工具),经过对测试需求的分析(软件过程中的需求分析),设计出自动化测试用例(软件过程中的需求规格),从而搭建自动化测试的框架(软件过程中的概要设计),设计与编写自动化脚本(详细设计与…

网络安全合规-网络安全架构

一、安全框架及模型定义 信息安全模型是用于精确和形式的描述信息系统的安全特征,以及用于解释系统安全相关行为的理由。 安全模型的作用&#xff1a; 准确地描述安全的重要方面与系统行为的关系。 提高对成功实现关键安全需求的理解层次。 从中开发出一套安全性评估准则&…

【来不及刷题之】37、排序链表(链表归并排序)

使用直接插入排序时间复杂度太多无法通过&#xff0c;使用归并排序&#xff0c;主要有三个步骤&#xff1a; 寻找链表的中间结点&#xff0c;断开成两个等长的链表 对这两个链表分别排序 &#xff08;递归&#xff09; 合并两个排序链表 思路比较简单&#xff0c;但是这里寻…

全解析!汽车APP面临的18种攻击风险

目录 车企App普遍面临的攻击风险 技术风险 合规风险 《白皮书》提供两大安全解决方案 App加固 App隐私合规检测 近日&#xff0c;顶象发布《车企App安全研究白皮书》。该白皮书总结了目前汽车公司App所面临的主要技术威胁和合规风险&#xff0c;详细分析了这些风险产生的…

<Android开发> 集成so库

&#xff1c;Android开发&#xff1e; 集成so库 &#xff1c;Android开发&#xff1e; HAL层集成第三方so库 一 前言 在笔者的另一个文章&#xff1c;Android开发&#xff1e; HAL层集成第三方so库 分析了如何在hal层将第三方的so库文件集成到系统中&#xff1b;本文其实与其…

用组件注解符精简Spring配置文件

一、利用组件注解符精简Spring配置文件 &#xff08;一&#xff09;创建新包 创建net.huawei.spring.day02包 &#xff08;二&#xff09;复制四个类 &#xff08;三&#xff09;修改杀龙任务类 package net.huawei.spring.day02;import org.springframework.stereotype.C…

索引的最左匹配原则全面分析

简介 组合索引中的最左优先&#xff0c;以组合索引中最左边的列为起点任何连续的索引都能匹配上。如果遇到范围查询(>、<、between、like)就会停止匹配。 准备 表 CREATE TABLE test (id bigint(11) NOT NULL,column1 int DEFAULT NULL,column2 int DEFAULT NULL,col…

振弦采集仪在岩土工程安全监测使用的解决方案

振弦采集仪是一种岩土工程安全监测仪器&#xff0c;主要用于监测建筑物、桥梁、隧道、地铁等工程结构的动态响应&#xff0c;以及岩土体的振动情况。其工作原理是通过振弦传感器采集结构或岩土体的振动信号&#xff0c;再通过数据采集系统进行处理和分析&#xff0c;得出结构或…