插入排序,选择排序,冒泡排序,顺序搜索,二分搜索,迭代,求最大公因数,最小公倍数等简单模板

news2024/9/23 17:14:25

目录

1.排序

1.插入排序模板

2.冒泡排序模板

3.选择排序模板

2.搜索

1.顺序搜索

2.二分搜索

3.迭代

1.基础迭代

​编辑

4.求最大公因数,最小公倍数

1.最直接的方法

取巧一点

2.辗转相除法(欧几里得法)


1.排序

1.插入排序模板

插入排序就如同一副扑克牌,我们一张一张的开始摸牌,一张一张的放,找到相应的位置,让后面的牌往后挪一格,再把这个牌放到挪往后的这个空位上

#include<stdio.h>
#include<math.h>
#include<string.h>

int main(){
	for(int i = 1; i <= 6; i++) scanf("%d",&a[i]);
	//摸6张牌,从小到大排序
	for(int i = 1; i <= 6; i++){
		int temp = a[i];//摸牌
		for(int j = i; j > 0&&a[j-1] > temp; j--){
			//从第i张牌开始比较,只要前一张牌比它大并且没比较到第一张牌就换位置
			a[j] = a[j+1];//往后挪一格
		}
		a[i] = temp;//新牌落位
	}
	return 0;
}

2.冒泡排序模板

冒泡排序

冒泡排序其实我之前写过一个模板

http://t.csdnimg.cn/ghWXo

这次多加点注释,讲的更详细

冒泡排序其实它的名字就十分的形象,就把每个元素都看作是一个泡泡,每次都比较泡泡的大小,如果那个泡泡更大,就让它到前面去,这样一遍又一遍的比较下去,使得泡泡成功变为从小到大的排序

借助动图理解

#include<stdio.h>
#include<math.h>
#include<string.h>

int main(){
	int a[7];
	for(int i = 1; i <= 6; i++) scanf("%d",&a[i]);
	//将6个元素,从小到大排序
	for(int i = 1; i <= 5; i++){
		int flag = 0;
		//6个元素只用冒泡5次,或者说n个元素,冒泡n-1次
		//对于最后一次冒泡的时候,它后面的元素都已经比较好了
		for(int j = 1; j <= 6-i; j++){
			//6个元素要冒泡6-冒泡的次数
			//举个例子,三个数,第一次冒泡,要比较两次
			//对第二次来说,却只要比较一次就可以了
			if(a[j] > a[j+1])
			{//如果这个数比它的下一个数大,就交换位置
				int t = a[j+1];
				a[j+1] = a[j];
				a[j] = t;
				flag = 1;//flag有优化的作用,如果在进行完这个if后
				//flag仍然为0,说明一次比较都没有进行,即说明此时已经排序好了
			}
		}
		if(flag == 0) break;
	}
	for(int i = 1; i <= 6; i++) printf("%d ",a[i]);
	return 0;
}

3.选择排序模板

选择排序是找一个数组中最大的那个数,把它放在第一个位置,再从剩下的数中找到最大的放在第二个位置,以此类推,直到只有两个数,把这两个数中更大的放在倒数第二个位置,另外一个放在最后

#include<stdio.h>
#include<math.h>
#include<string.h>

int main(){
	int a[7];
	for(int i = 1; i <= 6; i++) scanf("%d",&a[i]);
	for(int i = 1; i <= 5; i++){
		int k = i;//记录下标
		for(int j = k+1; j <= 6; j++){
			if(a[j] < a[k]) k = j;
		}//此时k为值最大的那个数的下标
		if(k!=i) {int t = a[k]; a[k] = a[i]; a[i] = t;}
	}
	for(int i = 1; i <= 6; i++) printf("%d ",a[i]);
	return 0;
}

2.搜索

1.顺序搜索

顺序搜索就是写个循环从头搜索到尾,效率很低

2.二分搜索

二分搜索就是对一个已经排序好的数组,不断的二分找我们要找的那个数字

http://t.csdnimg.cn/J6kJd

这是我之前写过的一个二分模板,这次写个更加规范的

#include<stdio.h>
#include<math.h>
#include<string.h>

int main(){
	int a[] = {1,2,3,4,5,6,7,8,9,10};
	int left = 0,right = 9,mid,found;
	//left为第一个数的下标,也就是0
	//right为第二个数的下标,也就是1
	//mid为二分的那个值
	//found用来判断是否找到了,找到则为1
	found = 0;
	int x;
	scanf("%d",&x);
	//要找x
	while(left <= right && !found){
		mid = (left + right)/2;
		if(a[mid] > x) right = mid - 1;
		else if(a[mid] < x) left = mid + 1;
		else if(a[mid] == x) found = 1;
	}
	if(found == 1) printf("found");
	else printf("nofound");
	return 0;
}

3.迭代

1.基础迭代

#include<stdio.h>
const int N = 1e5 + 10;

int main(){
	int a[N];
	int n,i;
	scanf("%d",&n);
	a[1] = 1,printf("%5d",a[1]);
	a[2] = 1,printf("%5d",a[2]);
	for( i = 3; i <= n;i++){
		a[i] = a[i - 1] + a[i - 2];
		printf("%5d",a[i]);
	}
	return 0 ;
}

4.求最大公因数,最小公倍数

最大公因数 的英文是 "Greatest Common Divisor"

最小公倍数 Least Common Multiple

以下用gcd代表最大公因数,用lcm代表最小公倍数

1.最直接的方法

让那两个数中更大的那个数一直加一,直到能被那两个数整除为止,得到的这个数就是最小公倍数

让那两个数中更小的那个数一直减一,直到那两个数能被这个数整除为止,得到的这个数就是最大公因数

#include<stdio.h>
#include<math.h>
#include<string.h>

int lcm(int x,int y){
	int max = x>y?x:y;
	while(max%x != 0||max%y != 0) max++;
	//只要max不能同时被这两个数整除就加一
	return max;
}

int gcd(int x,int y){
	int min = x < y?x:y;
	while(x % min != 0|| y % min != 0) min--;
	//直到那两个数能被这个数整除为止
	return min;
}
int main(){
	int x,y;
	scanf("%d%d",&x,&y);
	//找x和y的最小公倍数和最大公因数
	int lc,gc;
	lc = lcm(x,y);
	gc = gcd(x,y);
	printf("%d %d",lc,gc);
	return 0;
}

取巧一点

最小公倍数其实就是x乘y除以最大公因数

可以变成这样

#include<stdio.h>
#include<math.h>
#include<string.h>

int gcd(int x,int y){
	int min = x < y?x:y;
	while(x % min != 0|| y % min != 0) min--;
	//直到那两个数能被这个数整除为止
	return min;
}

int lcm(int x,int y){
	return x*y/gcd(x,y);
}

int main(){
	int x,y;
	scanf("%d%d",&x,&y);
	//找x和y的最小公倍数和最大公因数
	int lc,gc;
	lc = lcm(x,y);
	gc = gcd(x,y);
	printf("%d %d",lc,gc);
	return 0;
}

2.辗转相除法(欧几里得法)

这是之前写的,现在写个更具模板化的

http://t.csdnimg.cn/s0mdb

#include<stdio.h>
#include<math.h>
#include<string.h>

int gcd(int x,int y){
	int t;
	while(y){
		t = x % y;
		x = y;
		y = t;
	}
	return x;
}

int lcm(int x,int y){
	return x*y/gcd(x,y);
}

int main(){
	int x,y;
	scanf("%d%d",&x,&y);
	//找x和y的最小公倍数和最大公因数
	int lc,gc;
	lc = lcm(x,y);
	gc = gcd(x,y);
	printf("%d %d",lc,gc);
	return 0;
}

辗转相除法,也称为欧几里得算法,是一种用于计算两个正整数最大公约数(Greatest Common Divisor, GCD)的古老而有效的算法。它的基本原理是利用了数学中的一个重要定理:对于任意两个整数a和b(假设a>b),它们的最大公约数与b和a除以b的余数c的最大公约数相同,即gcd(a, b) = gcd(b, c)。

以下是一个例子来说明辗转相除法的原理:

假设我们要找到15750和27216的最大公约数。

1. 首先,我们将较大的数27216除以较小的数15750,得到商1和余数11466(27216 = 1 × 15750 + 11466)。

2. 然后,我们将上一步的除数15750作为新的被除数,余数11466作为新的除数进行下一轮计算。将15750除以11466,得到商1和余数4284(15750 = 1 × 11466 + 4284)。

3. 接着,我们将上一步的除数11466作为新的被除数,余数4284作为新的除数进行下一轮计算。将11466除以4284,得到商2和余数3198(11466 = 2 × 4284 + 3198)。

4. 再次交换被除数和除数,将4284作为新的被除数,3198作为新的除数。将4284除以3198,得到商1和余数1086(4284 = 1 × 3198 + 1086)。

5. 继续这个过程,将3198作为新的被除数,1086作为新的除数。将3198除以1086,得到商3和余数22(3198 = 3 × 1086 + 22)。

6. 最后,将1086作为新的被除数,22作为新的除数。将1086除以22,得到商49和余数0(1086 = 49 × 22 + 0)。

由于我们已经得到了余数为0,这意味着当前的除数22就是原问题中两个数15750和27216的最大公约数。

所以,15750和27216的最大公约数为22。这就是辗转相除法的原理和一个实际应用的例子。通过反复进行除法和交换除数和余数的操作,直到余数为0,最后的除数就是两个原始数的最大公约数。

不会写?不要怕!

和我一起念口诀歪踢尔科斯歪尔科斯y,t,x,y,x,(

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

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

相关文章

机器学习---比较单个学习器与Bagging集成的偏差-方差分解、在Iris数据集的不同特征子集上使用不同的分类器进行训练和可视化

1. Bagging 说明并比较了预期均方误差的偏差方差分解&#xff0c;单个学习器与bagging集成的比较。 在回归中&#xff0c;估计器的预期均方误差可以根据偏差、方差和噪声进行分解。 在回归问题的数据集上的平均值上&#xff0c;偏差项测量估计器的预测与问题的最佳可能估计器…

2023版本QT学习记录 -6- UDP通信之UDP接收端

———————UDP接收端——————— &#x1f384;动图演示 &#x1f384;发送端通信步骤思维导图 &#x1f384;添加组件 QT core gui network&#x1f384;添加头文件 #include "qudpsocket.h"&#x1f384;创建接收对象 QUdpSocket *recvsocket;&…

2023年12月25日学习总结——MLP

&#x1f4a1;我准备每一天都写一个学习总结&#xff0c;周末再把每日的学习总结汇总成专门的文章 &#x1f506;我的学习总结主要是为了自己的个人学习&#xff0c;没有商业用途&#xff0c;侵删 okkk开始今日学习 目录 1、今日计划学习内容2、今日学习内容深入学习MLP&#…

MySQL的事务-隔离级别

上篇&#xff0c;整理了MySQL事务的原子性&#xff0c;这篇继续整理MySQL事务的一致性、隔离性和持久性。 2. 一致性指的是事务开始前和结束后&#xff0c;数据库的完整性约束没有被破坏&#xff0c;这保证了数据的完整性和一致性。一致性必须确保数据库从一个一致的状态转换到…

结构体的对齐规则

1.引入 我们在掌握了结构体的基本使⽤后。 现在我们深⼊讨论⼀个问题&#xff1a;计算结构体的大小。 这也是⼀个特别热门的考点&#xff1a; 结构体内存对齐。 2.具体分析 ⾸先我们得掌握结构体的对⻬规则&#xff1a; 1. 结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量…

智能变电站协议系列-3、MMS协议示例(IEC61850)

文章目录 一、前言二、资料收集三、libiec61850的MMS协议的操作文件的示例运行及抓包分析1、协议理解2、代码查看及示例运行3、wireshark抓包及分析 四、最后 一、前言 接下来我们来分析一下MMS协议&#xff0c;该协议比较抽象&#xff0c;从定义上和理解上都比较抽象&#xf…

阶段七-GitEE

Git&#xff1a;版本控制软件 Git的优点 1.1 协同修改 多人并行不悖的修改服务器端的同一个文件。 1.2 数据备份 不仅保存目录和文件的当前状态&#xff0c;还能够保存每一个提交过的历史状态。 1.3 版本管理 在保存每一个版本的文件信息的时候要做到不保存重复数据&…

【Git】fatal: bad boolean config value ‘true~‘ for ‘core.longpaths‘

windwos操作系统git config设置错了参数值&#xff0c;解决方法。 出现原因 在拉取代码时&#xff0c;仓库中存在文件名过长得文件&#xff0c;拉取报错了“filename too long” 解决 git config --system core.longpaths true结果在复制命令时&#xff0c;粘贴到命令行多了一…

第19章总结

一.Java绘图类 1.Graphics类 Graphics类是所有图形上下文的抽象基类&#xff0c;它允许应用程序在组件以及闭屏图像上进行绘制。Graphics类封装了Java支持的基本绘图操作所需的状态信息&#xff0c;主要包括颜色、字体、画笔、文本、图像等。 2.Graphics2D类 Graphics2…

【MySQL】脏读、不可重复读、幻读介绍及代码解释

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 数 据 库 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 结语 我的其他博客 前言 数据库事务隔离级别是关系数据库管理系统中一个重要的概念&#xff0c;它涉及到多个事务并发执行…

Shell三剑客:awk(awk编辑编程)二

一、IF 语句 IF 条件语句语法格式 #方式一&#xff1a; if (condition)action #方式二&#xff1a;使用花括号语法格式 if (condition) {action1;action2; ... } {if(表达式)&#xff5b;语句1;语句2;...&#xff5d;} IF 语句实例 #判断数字是奇数还是偶数 [rootlocalhost ~…

Kafka生产环境问题总结与性能优化实践

Kafka可视化管理工具kafka-manager 安装及基本使用可参考: httos://wwwcnbloas.com/dadonaaa/o/8205302.html 线上环境规划 1. 消息丢失情况: 消

数据入表倒逼数据治理,国有企业如何做好数据资产管理

数据是驱动数字经济发展的核心生产要素&#xff0c;数据资产化是释放数据要素价值的重要方式。国有企业作为驱动数字化转型升级的排头兵&#xff0c;在数据资产入表的背景下&#xff0c;如何充分发挥海量规模数据和应用场景等优势&#xff0c;如何解决数据难点&#xff0c;管好…

ES8生产实践——Kibana对接Azure AD实现单点登录

基本概念介绍 什么是单点登录 单点登录&#xff08;Single Sign-On&#xff0c;SSO&#xff09;是一种身份验证和访问控制机制&#xff0c;允许用户使用一组凭据&#xff08;通常是用户名和密码&#xff09;仅需登录一次&#xff0c;即可访问多个应用程序或系统&#xff0c;而…

算法基础之最长公共子序列

最长公共子序列 核心思想&#xff1a; 线性dp 集合定义 : f[i][j]存 a[1 ~ i] 和 b[1 ~ j] 的最长公共子序列长度 状态计算&#xff1a; 分为取/不取a[i]/b[j] 共四种情况 其中 中间两种会包含两个都不取的情况(去掉) 但是因为取最大值 有重复也没事用f[i-1][j] 和 f[i][j-1]表…

GNN 图神经网络

GCN 邻接矩阵A&#xff1a;adjacency matrix用来表示节点间的连接关系。 度矩阵D&#xff1a;degree matrix用来表示节点的连接数 特征矩阵X&#xff1a;feature matrix用来表示节点的特征

openGauss学习笔记-172 openGauss 数据库运维-备份与恢复-导入数据-分析表172.1 分析表172.2 表自动分析

文章目录 openGauss学习笔记-172 openGauss 数据库运维-备份与恢复-导入数据-分析表172.1 分析表172.2 表自动分析 openGauss学习笔记-172 openGauss 数据库运维-备份与恢复-导入数据-分析表 执行计划生成器需要使用表的统计信息&#xff0c;以生成最有效的查询执行计划&#…

Sam Altman 晒网友新年愿望清单;AI Pin 明年 3 月开始交付丨 RTE 开发者日报 Vol.112

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

什么是非功能性测试?

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

AI爆文写作变现:如何让自己的文章减少AI味,提升写作质量

利用AI实现自媒体写作变现&#xff0c;核心就是爆文写作提示词&#xff08;Prompt&#xff09; 对新手来说&#xff0c;缺少好用的爆文提示词&#xff0c;这无疑是大家碰到的一个难点。 如何创建属于自己的高效AI指令&#xff0c;无疑是大家最关心的问题。 本篇文章将一步一…