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

news2024/11/27 14:39:29

        基础算法之一,相当重要。在普通的机试中如果没有数据类型和时空限制,基本上选择自己最熟悉的就好。本篇只总结选择排序和插入排序,侧重应用,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;
} 

测试,没什么问题:

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

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

相关文章

HTML 【实用教程】(2024最新版)

核心思想 —— 语义化 【面试题】如何理解 HTML 语义化 ?仅通过标签便能判断内容的类型&#xff0c;特别是区分标题、段落、图片和表格 增加代码可读性&#xff0c;让人更容易读懂对SEO更加友好&#xff0c;让搜索引擎更容易读懂 html 文件的基本结构 html 文件的文件后缀为 …

VMware虚拟机配置桥接网络

转载&#xff1a;虚拟机桥接网络配置 一、VMware三种网络连接方式 VMware提供了三种网络连接方式&#xff0c;VMnet0, VMnet1, Vmnet8&#xff0c;分别代表桥接&#xff0c;Host-only及NAT模式。在VMware的编辑-虚拟网络编辑器可看到对应三种连接方式的设置&#xff08;如下图…

深度解析Ubuntu版本升级:LTS版本升级指南

深度解析Ubuntu版本升级&#xff1a;Ubuntu版本生命周期及LTS版本升级指南 Ubuntu是全球最受欢迎的Linux发行版之一&#xff0c;其版本升级与维护策略直接影响了无数用户的开发和生产环境。Canonical公司为Ubuntu制定了明确的生命周期和发布节奏&#xff0c;使得社区、企业和开…

viscode-插件

vue组件生成&#xff1a; vue.json {"Print to console": {"prefix": "vue", "body": ["<!-- $1 -->","<template>","<div>","</div>","</template>&q…

全面解析 TypeScript 泛型的二三事

2024年了相信大家都已经在日常开发的过程中使用上了 TypeScript 了。TypeScript 增强了代码可靠性和可维护性&#xff0c;确保减少运行时错误并提高开发人员的工作效率。 TypeScript 通过类型声明 使得 javascript 拥有了强类型校验。而泛型的是类型声明中最重要的一环&#x…

Git在多人开发中的常见用例

前言 作为从一个 svn 转过来的 git 前端开发&#xff0c;在经历过git的各种便捷好处后&#xff0c;想起当时懵懂使用git的胆颤心惊&#xff1a;总是害怕用错指令&#xff0c;又或者遇到报错就慌的场景&#xff0c;想起当时查资料一看git指令这么多&#xff0c;看的头晕眼花&am…

STM32F103C8T6核心板原理图和PCB分享

PCB图 原理图 资料下载地址&#xff1a; 原理图PCB库: https://545c.com/d/45573183-61875742-29897c?p7526 (访问密码: 7526)

Unity【入门】场景切换和游戏退出及准备

1、必备知识点场景切换和游戏退出 文章目录 1、必备知识点场景切换和游戏退出1、场景切换2、鼠标隐藏锁定相关3、随机数和自带委托4、模型资源的导入1、模型由什么构成2、Unity支持的模型格式3、如何指导美术同学导出模型4、学习阶段在哪里获取模型资源 2、小项目准备工作需求分…

小柴带你学AutoSar系列一、基础知识篇(7)术语

目录 缘起 AUTOSAR 专业术语 RH850 专业术语 其他相关术语 flechazohttps://www.zhihu.com/people/jiu_sheng 小柴冲刺嵌入式系统设计师系列总目录https://blog.csdn.net/qianshang52013/article/details/

WordPress网站违法关键词字过滤插件下载text-filter

插件下载地址&#xff1a;https://www.wpadmin.cn/2025.html 插件介绍 WordPress网站违法关键词字过滤插件text-filter由本站原创开发,支持中英文关键字自动替换成**号&#xff0c;可以通过自定义保存修改按钮增加“预设关键字”&#xff0c;也可以导入定义好的txt文本形式的关…

医院挂号系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;患者管理&#xff0c;医生管理&#xff0c;专家信息管理&#xff0c;科室管理&#xff0c;预约信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;专家信息&#xff0…

算法011:最大连续的1的个数

最大连续的1的个数. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/max-consecutive-ones-iii/ 乍一看&#xff0c;这道题很奇怪&#xff0c;什么叫最多翻转k个0&a…

Raylib实现拖拽视口显示

拖拽看左上角数字 #include <raylib.h> // 重整原因&#xff1a;解决新函数放大缩小之下&#xff0c;raylib 的网格采样部分&#xff0c;选择数组的一部分刷新倒缓冲区里 // 从直接建立缓冲区&#xff0c;到先在数组里进行移动&#xff0c;然后再设置检查缓冲区// 最大距…

批量文本编辑管理神器:一键修改多处内容,轻松转换编码,助力工作效率飞跃提升!

在信息爆炸的时代&#xff0c;文本处理已成为我们日常工作中不可或缺的一部分。无论是处理文档、整理数据还是编辑资料&#xff0c;都需要对大量的文本进行管理和修改。然而&#xff0c;传统的文本编辑方式往往效率低下&#xff0c;容易出错&#xff0c;难以满足现代工作的高效…

JimuReport 积木报表 v1.7.7 版本发布,一款免费的报表工具

项目介绍 一款免费的数据可视化报表工具&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完…

go语言的异常处理机制

error 在go语言中&#xff0c;异常被定义为实现了error接口的类型&#xff0c;error接口只定义了一个返回string类型Error&#xff08;&#xff09;方法&#xff0c;任何实现了Error()方法的类型都可以被定义为异常&#xff0c;以下是一个自定义的异常类型&#xff1a; typ…

28行代码完成深度学习模型——线性模型 01

在这里插入代码片## 线性模型 机器学习中的线性模型是一种预测模型&#xff0c;它基于线性关系来预测输出值。这种模型假设输入特征&#xff08;自变量&#xff09;和输出&#xff08;因变量&#xff09;之间存在线性关系。线性模型通常具有以下形式&#xff1a; y x*w b 其…

代码随想录算法训练营第二十七天|452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间

452. 用最少数量的箭引爆气球 如何使用最少的弓箭呢&#xff1f; 直觉上来看&#xff0c;貌似只射重叠最多的气球&#xff0c;用的弓箭一定最少&#xff0c;那么有没有当前重叠了三个气球&#xff0c;我射两个&#xff0c;留下一个和后面的一起射这样弓箭用的更少的情况呢&am…

生成式AI的短板在于“Token”的存在

生成式AI模型处理文本的方式与人类不同。理解它们基于“token”的内部环境&#xff0c;可能有助于解释一些奇怪行为和固有局限性。 从小型设备上的Gemma到OpenAI领先行业的GPT-4o&#xff0c;大多数模型都是基于一种称为Transformer的架构。由于Transformer在将文本与其他类型…

Golang | Leetcode Golang题解之第220题存在重复元素III

题目&#xff1a; 题解&#xff1a; func getID(x, w int) int {if x > 0 {return x / w}return (x1)/w - 1 }func containsNearbyAlmostDuplicate(nums []int, k, t int) bool {mp : map[int]int{}for i, x : range nums {id : getID(x, t1)if _, has : mp[id]; has {retu…