C语言入门——第十七课

news2024/9/28 21:25:08

一、二分查询

1.概念

二分查询又被称为二分查找,是一种在有序数组或序列中快速查找到对应元素的一种方法。每次查找范围缩小至原来的一半。

①前提条件

数组和列表必须有序,否则无法进行二分查找。

②初始化

确定查找数组和列表的左边界(通常为数组或列表第一个元素)和右边界(通常为数组和列表最后一个元素)。

③循环

  • 计算中间元素的序列
  • 比较中间元素和目标元素
    • 如果中间元素等于目标元素,那么查询结束,返回中间元素的索引。
    • 如果目标元素大于中间元素,说明目标元素在中间元素的右半部分,那么左边界移到中间元素的右边。
    • 如果目标元素小于中间元素,说明目标元素在中间元素的左半部分,那么右边界移至中间元素的左边。

④结束条件

如果查找到目标元素的索引,退出。

或者如果左边元素的索引大于右边元素,说明目标元素不在数组内,那么退出。 

2.代码

int BinaryFindValue(const int* arr, int n, int value)
{
	int pos = -1;
	if (n < 1 || arr == NULL)	return pos;
	int left = 0;
	int right = n-1;
	while (left<=right)
	{
		int mid = (right - left +1 ) / 2 + left;
		if (value < arr[mid])
		{
			right = mid - 1;
		}
		else if (value > arr[mid])
		{
			left = mid + 1;
		}
		else
		{
			pos = mid;
			break;
		}
	} 
		return pos;
}
int main()
{
	const int n = 5;
	int arr[n] = { 10,11,12,13,14 };
	int val = 0;
	scanf("%d", &val);
	int m = BinaryFindValue(arr, n, val);
	printf("%d", m);
}

也可以将这一行写成这样

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

修改后: 

int mid = (right - left + 1) >> 1 + left;

 >> 是右移位操作符,在计算机中执行二进制位的右移。>> 1 表示将二进制位向右移动一位,相当于除以2。

注意这里有个问题:

int mid =((right - left + 1) >> 1) + left;

加号大于右移操作符,这样写的话是1+left然后右移,所以要给前面加上括号。

最终正确代码

int BinaryFindValue(const int* arr, int n, int value)
{
	int pos = -1;
	if (n < 1 || arr == NULL)	return pos;
	int left = 0;
	int right = n-1;
	while (left<=right)
	{
		int mid = ((right - left + 1) >> 1) + left;
		if (value < arr[mid])
		{
			right = mid - 1;
		}
		else if (value > arr[mid])
		{
			left = mid + 1;
		}
		else
		{
			pos = mid;
			break;
		}
	} 
		return pos;
}
int main()
{
	const int n = 5;
	int arr[n] = { 10,11,12,13,14 };
	int val = 0;
	scanf("%d", &val);
	int m = BinaryFindValue(arr, n, val);
	printf("%d", m);
}

3. Q&A

Q:下面这个代码有问题,请详细说明原因

A:

问题一:是left<right判断条件,如果目标值是右边界值的话没有办法正确输出值。具体看下面的图示。

问题二:是使用(left+right)/2,如果left和right足够大,他们的mid很可能超出最大整数的范围,容易溢出。

修改:

① 修改判断条件,让left<=right的时候退出循环,这样就可以查找到边界的目标元素。

②修改查找中间元素的计算方式,所以使用下面的方式只对区域进行取半。

4.优化一

如果我的序列中有多个重复的数字,我想要找到最左端数字的下标,你需要怎么做?

添加一个判断

while (arr[mid - 1] == value)
			{
				mid--;
			}
			pos = mid;
			break;

判断arr[mid]和value相等的时候,它的前一个值是否也相等,但是这样写是错误的,因为如图,在下面的示例中,要找到12最左边元素的下标值,mid-1判断到mid=0下标的时候,再-1会造成越界,所以我们要对于判断条件增加。

增加一个条件mid-1>=0,防止越界行为,老师在这里增加的条件是mid>left,也是相同的道理,两种写法都可以。 

//while ((mid>left) && (arr[mid - 1] == value))
while ((mid-1 >= 0) && (arr[mid - 1] == value))
			{
				mid--;
			}
			pos = mid;
			break;
int BinaryFindValue(const int* arr, int n, int value)
{
	int pos = -1;
	if (n < 1 || arr == NULL)	return pos;
	int left = 0;
	int right = n-1;
	while (left<=right)
	{
		int mid =((right - left + 1) >> 1) + left;
		if (value < arr[mid])
		{
			right = mid - 1;
		}
		else if (value > arr[mid])
		{
			left = mid + 1;
		}
		else
		{
			while ((mid-1 >= 0) && (arr[mid - 1] == value))
			{
				mid--;
			}
			pos = mid;
			break;
		}
	} 
		return pos;
}
int main()
{
	const int n = 13;
	int arr[n] = { 12,12,12,13,13,13,13,13,24,24,24,25,26};
	int val = 0;
	scanf("%d", &val);
	int m = BinaryFindValue(arr, n, val);
	printf("%d", m);
}

5.优化二

在这里查找最左端元素的时候,你使用的是递归查询,请问怎么样使用二分法继续进行最左端元素的查找。

使用递归方法继续查找呢?

暂无思路,待补充……

二、结构体

1.定义

结构体是由我们自己设计的一种类型。

结构体和数组的区别:数组中所有元素的类型一致,但是结构体中元素的类型不需要一致。

结构体的定义

struct Student //结构体名
{
    //成员列表
};

这里结束的时候记得写分号哦!

注意: 在C语言中,这里的Student是结构体名,struct Student是结构体类型名。在进行创建结构体变量时,需要使用结构体类型名创建。但是在C++中结构体类型名和结构体名没有区别。

Student sx;//错误
struct Student sx;//正确 

2.初始化 

结构体的在声明的时候不需要初始化,因为它此时还是类型,不会开辟空间,所以不能赋初值。在定义结构体变量时,系统才会给结构体分配空间。

初始化顺序需要与结构体声明次序保持一致。

①使用花括号初始化

struct Student
{
	char s_name[20];
	int age;
};
int main()
{
	struct Student sx = { "lizeyu",23 };
	printf("%s %d\n", sx.s_name, sx.age);
}

结构体嵌套结构体初始化,也是使用花括号初始化。

struct Date
{
	int year;
	int month;
	int day;
};
struct Student
{
	char s_name[20];
	Date birthday;
	int age;
};
int main()
{
	struct Student sx = { "lizeyu",{2000,8,21},23 };
	printf("%s %d\n", sx.s_name, sx.age);
}

或者写成这个样子也是可以的:

struct Student sx = { "lizeyu",2000,8,21,23 };

3.结构体在内存中的存储

如果结构体内的数组是按照[ ]方式声明的,定义变量的时候,栈区为数组分配对应字节的空间。

如果声明结构体成员列表的时候使用指针的方式声明数组,那么栈区的指针指向被存储在.data区的数组。

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

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

相关文章

js ::after简单实战

::after的作用是在元素后面再加个XXX样式 工作中遇到了一个表格&#xff0c;鼠标指到单元格要有个整行编辑态的效果&#xff0c;下面写个简单的demo 有人可能会说了&#xff0c;直接修改某个单元格的hover样式不就行了嘛&#xff0c;问题是如果鼠标指到单元格和单元格直接的…

自己动手打包构建编译cri-dockerd

1.背景 本机是 armv7l架构cpu&#xff0c;发现官方文档中竟然没有&#xff0c;因此需要自己编译下&#xff1b; [rootcontainer0 ~]# uname -a Linux container0 5.4.206-v7l.1.el7 #1 SMP Mon Jul 25 14:13:29 UTC 2022 armv7l armv7l armv7l GNU/Linux2.打包/构建/编译 gi…

Linux—简介安装常用命令系统中软件安装项目部署

目录 1. 前言1.1 什么是Linux1.2 为什么要学Linux1.3 学完Linux能干什么 2. Linux简介2.1 主流操作系统2.2 Linux发展历史2.3 Linux系统版本 3. Linux安装3.1 安装方式介绍3.2 安装VMware3.3 安装Linux3.4 网卡设置3.5 安装SSH连接工具3.5.1 SSH连接工具介绍3.5.2 FinalShell安…

北醒携全球首款256线车规量产激光雷达亮相广州国际车展

11月17日&#xff0c;北醒携全球首款256线车规量产激光雷达亮相广州国际车展。在车展期间&#xff0c;北醒还公布了与广州花都区人民政府达成投资合作&#xff0c;获滴滴自动驾驶投资以及与捷普联合打造的全球首条量产256线级别车规激光雷达的生产线即将贯通的等多条利好信息&a…

如何提高图片转excel的效果?(软件选择篇)

在日常的工作中&#xff0c;我们常常会遇到一些财务报表类的图片需要转换成可编辑的excel&#xff0c;但是&#xff0c;受各种条件的限制&#xff0c;常常只能通过手工录入这种原始的方式来实现&#xff0c;随着人工智能、深度学习以及网络技术的发展&#xff0c;这种原始的录入…

【C++】泛型编程 ⑩ ( 类模板的运算符重载 - 函数实现 写在类外部的同一个 cpp 代码中 | 类模板 的 外部友元函数二次编译问题 )

文章目录 一、类模板 - 函数声明与函数实现分离1、类模板 外部 实现 构造函数2、类模板 外部 实现 普通函数3、类模板 外部 实现 友元函数( 1 ) 错误示例及分析 - 类模板 的 外部友元函数 二次编译 问题( 2 ) 正确写法 二、代码示例 - 函数声明与函数实现分离1、代码示例2、执行…

深度学习之基于Pytorch的昆虫分类识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介系统架构技术亮点 二、功能三、系统四. 总结 一项目简介 # 深度学习基于 Pytorch 的昆虫分类识别系统介绍 深度学习在图像分类领域取得了显著的成就&#…

logic-flow 使用过程中遇到的bug - 拖动节点到画布的时候,鼠标松开,节点不落在画布,仍旧跟着鼠标走

背景&#xff1a; 插件&#xff1a;logicFlow 用途&#xff1a;画流程图 bug表现&#xff1a; 初始化的样子&#xff1a; bug的样子&#xff1a; 拖动第一个节点的时候&#xff0c;一切正常&#xff08;无论哪个节点作为第一个节点&#xff0c;都是正常的&#xff0c;但是拖动…

C语言回文数(1106:回文数(函数专题))

题目描述 一个正整数&#xff0c;如果从左向 右读&#xff08;称之为正序数&#xff09;和从右向左读&#xff08;称之为倒序数&#xff09;是一样的&#xff0c;这样的数就叫回文数。输入两个整数m和n&#xff08;m<n)&#xff0c;输出区间[m&#xff0c;n]之间的回文数。 …

Flowable工作流高级篇

文章目录 一、任务分配和流程变量1.任务分配1.1 固定分配1.2 表达式分配1.2.1 值表达式1.2.2 方法表达式 1.3 监听器分配 2.流程变量2.1 全局变量2.2 局部变量2.3 案例讲解 二、候选人和候选人组1.候选人1.1 定义流程图1.2 部署和启动流程实例1.3 任务的查询1.4 任务的拾取1.5 …

转录组学习第四弹-数据质控

数据质控 将SRR转为fastq之后&#xff0c;我们需要对fastq进行质量检查&#xff0c;排除质量不好的数据 1.质量检查&#xff0c;生成报告文件 ls *fastq.gz|while read id;do fastqc $id;done并行处理 ls *fastq.gz|xargs fastqc -t 102.生成 html 报告文件和对应的 zip 压缩…

2 Advanced Learning Algorithms

文章目录 Week1Neurons and brainNeural network layerForward propagationBuild a netural network ------codeAGIMatrix multiplication ------code Week2Tensorflow--- training detailsactivation functionsMultclass and SoftmaxClassification with multiple outputsAdam…

Android DatePicker(日期选择器)、TimePicker(时间选择器)、CalendarView(日历视图)- 简单应用

示意图&#xff1a; layout布局文件&#xff1a;xml <?xml version"1.0" encoding"utf-8"?> <ScrollView xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"…

【C/PTA】函数专项练习(一)

本文结合PTA专项练习带领读者掌握函数&#xff0c;刷题为主注释为辅&#xff0c;在代码中理解思路&#xff0c;其它不做过多叙述。 目录 6-1 输出星期名6-2 三整数最大值6-3 数据排序6-4 多项式求值 6-1 输出星期名 请编写函数&#xff0c;根据星期数输出对应的星期名。 函数原…

Redis 5 种基本数据类型详解

Redis 共有 5 种基本数据类型&#xff1a;String&#xff08;字符串&#xff09;、List&#xff08;列表&#xff09;、Set&#xff08;集合&#xff09;、Hash&#xff08;散列&#xff09;、Zset&#xff08;有序集合&#xff09;。 这 5 种数据类型是直接提供给用户使用的&…

中国出海主力系列专访之三七互娱:亚马逊云科技助力三七互娱海外“出圈”之路

如果问&#xff0c;在众多的中国出海赛道中哪一条拥有基数最大的粉丝拥趸&#xff1f;以网络游戏、社交媒体、直播、短视频为代表的泛娱乐赛道便成为当仁不让的领跑者。 在东京、新加坡、开罗、伦敦、纽约、慕尼黑等国际都市&#xff0c;当地的年轻人会随时随地的打开“中国造”…

QT修改windowTitle的名字以及图片

1.修改名字:点击ui的QMainWindow,然后找到windowTitle的选项修改即可 2.修改windowTitle的图片,依旧是找到windowIcon,选择资源,这个资源可以是你放到qrc里面的图片也可以是外置的图片 3.然后运行就可以看到效果了

数字化转型导师坚鹏:数字化时代银行网点厅堂营销5大痛点分析

数字化时代银行网点厅堂营销存在以下5大痛点&#xff1a; 1、业务办理时间较长。目前很多银行业务办理时间仍然较长&#xff0c;可能的原因包括银行业务办理流程比较复杂、柜员操作技能不够熟练、银行系统的稳定性欠佳、网点某段时间客户比较多等。 2、现场提交材料太多。银行…

详解python淘宝秒杀抢购脚本程序实现

文章目录 前言一、官网下载火狐浏览器二、下载geckodriver&#xff0c;并解压到火狐浏览器文件夹根目录三、添加火狐浏览器根目录到系统环境变量四、下载并安装python及pycharm开发工具五、进入淘宝六、使用Pycharm运行脚本&#xff0c;新建python文件&#xff0c;将代码复制到…

Linux 系列之 在一个文本中查找指定的数据

我 | 在这里 &#x1f575;️ 读书 | 长沙 ⭐软件工程 ⭐ 本科 &#x1f3e0; 工作 | 广州 ⭐ Java 全栈开发&#xff08;软件工程师&#xff09; &#x1f383; 爱好 | 研究技术、旅游、阅读、运动、喜欢流行歌曲 &#x1f3f7;️ 标签 | 男 自律狂人 目标明确 责任心强 ✈️公…