《算法笔记》总结No.3——排序

        基础算法之一,相当重要。在普通的机试中如果没有数据类型和时空限制,基本上选择自己最熟悉的就好。本篇只总结选择排序和插入排序,侧重应用,408中要求的种类更加繁多,此处先不扩展难度~总结最常用的两种排序。

一.选择排序

        选择排序是最简单的排序之一,此处介绍的是简单选择排序:即每次从待排序的序列的序列中选择除最小的元素x,令其与待排序不分的第一个元素y进行交换,这样有序区间每次会扩大一位。完成n趟排序后,所有元素就会是有序的。

        如上图:每次只需要找出最小的,放在乱序的最前面(也可以理解为正序的最后面)即可,函数如下(依旧是vector版本,不喜欢写伪码。。):

void selectSort(vector<int> V)
{
	for(int i=0;i<=V.size()-1;i++)
	{
		int k=i;
		for(int j=i;j<=V.size()-1;j++)
			if(V[j]<V[k])
				k=j;			
		int temp=V[i];
		V[i]=V[k];
		V[k]=temp;				
	}
	for(int i=0;i<=V.size()-1;i++)
		cout<<V[i]<<" ";
} 

主函数进行测试:

	vector<int> X;
	int n=0,x=0; 
	cout<<"请输入要排序的元素个数:";
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>x;
		X.push_back(x);
	}
	selectSort(X);

结果如下:

二.插入排序 

        此处介绍的依旧是最简单的直接插入排序:假设某个序列A,其1到i-1位有序,i到n位无序,那么在1~i-1之间找到一个位置j,将i插入到j后,1~i有序。需要注意的是,i插入到j后,原来的j~i-1会后移一位至j~i+1。

如上,本质上就是将后面的无序元素依次插入到有序元素中~

函数如下:

void insertSort(vector<int> V)
{
	for(int i=1;i<=V.size()-1;i++)   //第1位直接默认有序,从第2位排序到最后一位~ 
	{
		int temp=V[i],j=i;    //临时保存第i位元素,j则从i往前排序 
		while(j>0&&temp<V[j-1])  //只要temp小于前面的元素,循环就一直往前推进 
		{
			V[j]=V[j-1];  //元素后移 
			j--;	
		} 
		V[j]=temp;  //j位置上将原来的i位插入 
	}
	for(int i=0;i<=V.size()-1;i++)
		cout<<V[i]<<" ";
}

测试如下:

三.综合实践 

如下,将下列学生按照成绩从高到底排序:

  • 张三,001,90分
  • 李四,002,100分
  • 王五,003,70分
  • 赵六,004,60分
  • 老扁,005,80分

算法题中经常有类似的题目,首先要做的是定义结构体并赋值:

struct student{
	int score;
	string name;
	string ID;
}; 
student s1={90,"张三","001"};
student s2={100,"李四","002"};
student s3={70,"王五","003"};
student s4={60,"赵六","004"};
student s5={80,"老扁","005"};

 然后乱序压入到同类型的vector中:

	vector<student> s;
	s.push_back(s1);
	s.push_back(s2);
	s.push_back(s3);
	s.push_back(s4);
	s.push_back(s5);

        接下来即可对student类型的vector进行排序,我们这里采用选择排序,直接改编上面的函数即可:注意上面的形参是int型的vector——用来排序整数。而我们这里要对“student”进行排序,因此要将参数类型改编;至于用于比较的元素,直接用v[i].score将属性点出来即可~

void selectSort(vector<student> V)   //更改类型! 
{
	for(int i=0;i<=V.size()-1;i++)
	{
		int k=i;
		for(int j=i;j<=V.size()-1;j++)    
			if(V[j].score>V[k].score)   //直接用score属性比较;此外,要求是升序,因此大的优先 
				k=j;			
		student temp=V[i];    //交换的临时变量要记得换类型~ 
		V[i]=V[k];
		V[k]=temp;				
	}
	for(int i=0;i<=V.size()-1;i++)
		cout<<V[i].name<<":"<<V[i].score<<endl;
} 

测试,没什么问题:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

腾讯课堂即将停止服务?来试试这款开源的知识付费系统

项目介绍 本系统基于ThinkPhp5.0layuiVue开发,功能包含在线直播、付费视频、付费音频、付费阅读、会员系统、分销系统、拼团活动、直播带货、直播打赏、商城系统等。能够快速积累客户、会员数据分析、智能转化客户、有效提高销售、吸引流量、网络营销、品牌推广的一款应用&…

javaIO流(2)

一.字符流 字符流对数据的操作是以一个个字符为单位的,字符流只能读文本文件,并将读到的字节按照编码表转为对应的字符,Reader和Writer是字符流的两个最大的抽象类,InputStreamReader和OutputStreamWriter分别继承了Reader和Writer,它俩的功能就是将读取到的字节转换为字符,所…

【大模型LLM面试合集】大语言模型基础_NLP面试题

NLP面试题 1.BERT 1.1 基础知识 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是谷歌提出&#xff0c;作为一个Word2Vec的替代者&#xff0c;其在NLP领域的11个方向大幅刷新了精度&#xff0c;可以说是近年来自残差网络最优突破性的…

流程图编辑框架LogicFlow-vue-ts和js

LogicFlow官网https://site.logic-flow.cn/LogicFlow 是一款流程图编辑框架&#xff0c;提供了一系列流程图交互、编辑所必需的功能和灵活的节点自定义、插件等拓展机制。LogicFlow支持前端研发自定义开发各种逻辑编排场景&#xff0c;如流程图、ER图、BPMN流程等。在工作审批配…

数据结构/作业/2024/7/7

搭建个场景: 将学生的信息&#xff0c;以顺序表的方式存储&#xff08;堆区)&#xff0c;并且实现封装函数︰1】顺序表的创建&#xff0c; 2】判满、 3】判空、 4】往顺序表里增加学生、5】遍历、 6】任意位置插入学生、7】任意位置删除学生、8】修改、 9】查找(按学生的学号查…

不同层数PCB如何选择合适板厚?

在回答这个问题前&#xff0c;我们首先需要了解什么是PCB厚度。 PCB厚度是指电路板完成后的厚度。 覆铜板的厚度&#xff1a;0.5、0.7、0.8、1.0、1.2、1.5、1.6、2.0、2.4、3.2和6.4毫米。 纸基覆铜板的标称厚度为 0.7 至 1.5 毫米。让我们开始了解更多细节。 标准 PCB 铜厚度…

使用GZip对npm run build打包的vendor.js文件进行压缩

vue-cli项目 安装npm i compression-webpack-plugin -D npm i compression-webpack-plugin -D使用&#xff1a;在vue.config.js文件中 const CompressionPlugin require(compression-webpack-plugin) module.exports {configureWebpack: {plugins: [new CompressionPlugin…

北斗在高铁轨道位移监测中的应用

随着高速铁路的飞速发展&#xff0c;轨道的监测与维护变得至关重要。传统的监测方法已难以满足现代高铁的需求。 近年来&#xff0c;北斗卫星导航系统凭借其高精度、全天候、全球覆盖的优势&#xff0c;在高铁轨道位移监测中发挥了重要作用。 高铁轨道监测系统通过集成北斗卫星…

谷歌正在试行人脸识别办公室安全系统

内容提要&#xff1a; &#x1f9ff;据美国消费者新闻与商业频道 CNBC 获悉&#xff0c;谷歌正在为其企业园区安全测试面部追踪技术。 &#x1f9ff;测试最初在华盛顿州柯克兰的一间办公室进行。 &#x1f9ff;一份内部文件称&#xff0c;谷歌的安全和弹性服务 (GSRS) 团队将…

C/C++ 代码注释规范及 doxygen 工具

参考 谷歌项目风格指南——注释 C doxygen 风格注释示例 ubuntu20 中 doxygen 文档生成 doxygen 官方文档 在 /Doxygen/Special Command/ 章节介绍 doxygen 的关键字 注释说明 注释的目的是提高代码的可读性与可维护性。 C 风格注释 // 单行注释/* 多行注释 */ C 风格注…

Git注释规范

主打一个有用 代码的提交规范参考如下&#xff1a; init:初始化项目feat:新功能&#xff08;feature&#xff09;fix:修补bugdocs:文档&#xff08;documentation&#xff09;style:格式&#xff08;不影响代码运行的变动&#xff09;refactor:重构&#xff08;即不是新增功能…

动手实操微软开源的GraphRAG

微软在今年4月份的时候提出了GraphRAG的概念&#xff0c;然后在上周开源了GraphRAG,Github链接见https://github.com/microsoft/graphrag,截止当前&#xff0c;已有6900Star。 安装教程 官方推荐使用Python3.10-3.12版本&#xff0c;我使用Python3.10版本安装时&#xff0c;在…

【C++】类和对象(中)--下篇

个人主页~ 类和对象上 类和对象中-上篇 类和对象 五、赋值运算符重载1、运算符重载2、赋值运算符重载3、前置和后置重载 六、const成员七、日期类的实现Date.hDate.cpptest.cpptest1测试结果test2测试结果test3测试结果test4测试结果test5测试结果test6测试结果test7测试结果 八…

如何在Excel中对一个或多个条件求和?

在Excel中&#xff0c;基于一个或多个条件的求和值是我们大多数人的常见任务&#xff0c;SUMIF函数可以帮助我们根据一个条件快速求和&#xff0c;而SUMIFS函数可以帮助我们对多个条件求和。 本文&#xff0c;我将描述如何在Excel中对一个或多个条件求和&#xff1f; 在Excel中…

R语言学习笔记2-RRStudio环境配置(Windows版)

R语言学习笔记2-R&RStudio环境配置&#xff08;Windows版&#xff09; 安装 R安装RStudio修改默认工作目录修改镜像验证镜像源修改文件编码 环境测试 安装 R R下载地址&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/CRAN/bin/windows/base/ 点击下载链接并运行安装程…

《网络安全和信息化》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《网络安全和信息化》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《网络安全和信息化》级别&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a;工业和信息化部 主办单位&#…

PostgreSQL主从同步

目录 一、主从复制原理 二、配置主数据库 2.1 创建同步账号 2.2 配置同步账号访问控制 2.3 设置同步参数 3.4 重启主数据库 三、配置从数据库 3.1 停止从库 3.2 清空从库数据文件 3.3 拉取主库数据文件 3.4 配置从库同步参数 3.5 启动从库 四、测试主从 4.1在主库…

家用美容仪维修

美容仪行业是一个随着消费者对外貌和健康关注度不断提高而快速发展的行业。以下是对美容仪行业的详细分析&#xff1a; 一、行业概况 美容仪是一种根据人体生理机能进行调节改善身体和面部的机器&#xff0c;具有美白、嫩肤、祛斑、祛皱、脱毛、减肥等多种功能。随着科技的发…

Mac可以玩Steam吗?苹果电脑可以玩的单机游戏有哪些?

Mac可以玩Steam吗 关于Mac是否能够运行Steam这一问题&#xff0c;答案是肯定的。Steam平台已经支持Mac操作系统&#xff0c;玩家可以通过Steam在Mac上购买、下载和游玩各种优秀的游戏作品。不过&#xff0c;需要注意的是&#xff0c;并非所有的Steam游戏都有Mac版&#xff0c;…

JavaScript 中的面向对象编程--->构造函数--->原型对象与原型链,由浅入深详细讲解!

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;我是前端菜鸟的自我修养&#xff01;今天给大家分享JavaScript 中的面向对象编程--->构造函数--->原型对象与原型链&#xff0c;由浅入深详细讲解&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&am…