<数据结构>NO9.选择类排序|直接选择排序|堆排序

news2024/9/26 3:31:11

文章目录

  • 选择排序
    • 1.直接选择排序
      • 优化直接选择排序
    • 2. 堆排序

在这里插入图片描述

选择排序

基本思想
选组排序是从待排序数据中选出最大/最小的元素放入到序列的起始位置,直到待排序数据全部有序。

直接选择排序和堆排序的基本思想均符合选择排序。

1.直接选择排序

假设数据按升序排序

基本步骤

  1. 在待排序数据arr[i]-arr[n-1]中选出最小元素
  2. 如果选出的min不处于待排数据第一个位置时,交换min与arr[i]
  3. 重复上述操作直至待排序数据全部有序

下面动图演示直接选择排序

在这里插入图片描述

代码

void SelectSort(int* arr, int sz)
{
	int left = 0;
	while (left < sz - 1)
	{
		int minPos = left;//每次将待排序数组第一个元素设置为最小值
		//选出待排序数据中最小值
		for (int i = left; i < sz; i++)
		{
			if (arr[i] < arr[minPos])
			{
				minPos = i;
			}
		}
		//交换最小值和arr[left]的位置
		if (minPos != left)
			Swap(arr[minPos], arr[left]);
		//更新待排序数据
		left++;
	}
}

注意
这里Swap函数参数使用的是C++的引用,所以不需要传地址

优化直接选择排序

直接选择排序是从一边开始排序,优化后的选择排序可以一趟选出最大值和最小值
最小值放在待排序数组第一个位置,最大值放在待排序数组最后一个位置,从两头开始排序。

void SelectSort(int* arr, int sz)
{
	int left = 0;
	int right = sz - 1;
	while (left < right)
	{
		int minPos = left;
		int maxPos = left;
		//选出待排序区间最值
		for (int i = left; i <= right; i++)
		{
			if (arr[minPos] > arr[i])
				minPos = i;
			if (arr[maxPos] < arr[i])
				maxPos = i;
		}
		//最大值放在区间末尾
		Swap(arr[maxPos], arr[right]);

		//如果最小值在末尾,修正最小值
		if (minPos == right)
			minPos = maxPos;
		//最小值放在区间首部
		Swap(arr[minPos], arr[left]);

		//更新待排序区间
		left++;
		right--;
	}
}

直接选择排序性能分析:

  1. 无论是直接选择排序还是优化后的直接选择排序时间复杂度都是 O ( n 2 ) O(n^2) O(n2)
  2. 空间复杂度均为 O ( 1 ) O(1) O(1)
  3. 不稳定
  4. 实际生活中很少使用直接选择排序,效率低

2. 堆排序

堆排序是根据堆这种数据结构设计的一种算法,他是选择排序的一种。

堆排序的基本思想

  1. 将待排序数据构建为堆
  2. 交换堆顶元素和最后一个元素
  3. 对堆进行调整使之满足堆的性质
  4. 重复上述过程直至所有元素均有序

代码实现

void AdjustDown(int* a, int sz, int parent)
{
	int child = parent * 2 + 1;
	while (child < sz)
	{
		//大堆逻辑-->排升序
		if (child + 1 < sz && a[child] < a[child + 1])
			child++;
		if (a[parent] < a[child])
		{
			Swap(a[parent], a[child]);
			parent = child;
			child = child * 2 + 1;
		}
		else
			break;
	}
}
void HeapSort(int* arr, int sz)
{
	//向下建大堆-->排升序
	for (int i = (sz - 2) / 2; i >= 0; i--)
		AdjustDown(arr, sz, i);

	//排序
	int end = sz - 1;
	while (end > 0)
	{
		Swap(arr[0], arr[end]);
		AdjustDown(arr, end, 0);
		end--;
	}
}

关于堆排序详细解释请移步堆的应用

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

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

相关文章

Codeforces Round 883 (Div. 3)

A. Rudolph and Cut the Rope 只需要按照钉子距离的高度a_{i}和绳子的长度b_{i}的差值进行排序即可 代码 int n; pii a[N]; bool cmp(pii a,pii b) {return a.x-a.y<b.x-b.y; }void solve() {cin>>n;for(int i1;i<n;i)cin>>a[i].x>>a[i].y;sort(a1,…

36.RocketMQ之Broker如何实现磁盘文件高性能读写

highlight: arduino-light Broker读写磁盘文件的核心技术:mmap Broker中大量的使用mmap技术去实现CommitLog这种大磁盘文件的高性能读写优化的。 通过之前的学习&#xff0c;我们知道了一点&#xff0c;就是Broker对磁盘文件的写入主要是借助直接写入os cache来实现性能优化的&…

如何判断开发的商城系统是不是O2O平台?

纵观如今各大电商模式&#xff0c;数O2O发展最为火热&#xff0c;毫不夸张的说&#xff0c;O2O模式已经渗透到了很多行业中&#xff0c;那么哪些平台属于O2O呢?小编收集了一些资料&#xff0c;并将当下O2O平台分为以下这4种类型&#xff0c;下面小编就来带大家一起去了解了解!…

多模态系列论文--CoCa 详细解析

论文地址&#xff1a;CoCa: Contrastive Captioners are Image-Text Foundation Models 代码地址&#xff1a;CoCa CoCa 1 摘要2 网络结构3 损失函数4 实验结果5 总结 1 摘要 CoCa代表Contrastive Captioners的缩写&#xff0c;代表模型用两个目标函数训练出来的&#xff0c;一…

回溯法解决地图填色问题

目录 回溯法 最大度优先 最少可选颜色优先 向前探测 随机产生不同规模的图&#xff0c;分析算法效率与图规模的关系&#xff08;四色&#xff09; 回溯法 回溯法的基本思想是采用递归和深度优先搜索的方法&#xff0c;尝试在一组可能的解中搜索出符合要求的解&#xff0c…

Langchain的新课程;Mozilla开发的AI文档工具遭到开发者批评

&#x1f989; AI新闻 &#x1f680; Mozilla开发的AI文档工具遭到开发者批评&#xff0c;已下线 摘要&#xff1a;Mozilla开发的基于生成式AI的工具AI Help在开发者群体中遭到广泛批评。开发者认为该工具提供的信息常常错误&#xff0c;甚至认为它没有这个功能反而更好。针对…

Flutter 仿抖音、豆瓣、知乎、番茄小说的评论弹窗开发实践

最近用flutter做了一个评论弹窗的功能&#xff0c;本来以为很简单的烂大街的一个功能&#xff0c;结果却遇到了不少的问题&#xff0c;而且这些问题我觉得很有意义&#xff0c;以至于我觉得我如果分享出来可能会对其他人很有帮助。 要做一件事情可能会很容易&#xff0c;但做好…

ModaHub魔搭社区: AI模型社区ModelScope和Hugging Face行业分析报告

目录 引言&#xff1a; 一、github星数&#xff1a; 二、模型数&#xff1a; 三、数据集&#xff1a; 四、演示应用程序数&#xff1a; 五、下载数&#xff1a; 六、开发者、付费企业和公司用户数&#xff1a; 结论&#xff1a; 引言&#xff1a; AI模型开源社区在近年…

MQTT资料储备

1、官网 https://mqtt.org/ MQTT 5.0官方协议 https://docs.oasis-open.org/mqtt/mqtt/v5.0/mqtt-v5.0.html 说明&#xff1a;官网可以获取到好多资料&#xff08;比如常用软件、协议、usecase等&#xff09; 2、安装部署EMQX 当前有好多MQTT服务器&#xff0c;初步选择了EM…

MyBatis查询数据库【秘籍宝典】

0.MyBatis执行流程1.第一个MyBatis查询1.创建数据库和表1.2.添加MyBatis框架依赖【新项目】1.3.添加MyBatis框架依赖【旧项目】1.4.配置连接数据库1.5.配置MyBatis的XML路径2.MyBatis模式开发2.1 添加MyBatis的xml配置 3.增查改删&#xff08;CRUD&#xff09;5.1.增加操作5.2.…

机器学习之多元微积分

机器学习的多元微积分跟高等数学中的多元微积分有很多不同之处。 机器学习中的变量都是向量或者矩阵机器学习中的函数一般都是线性函数&#xff0c;而不是高数中的曲线和曲面、体积等函数。因此&#xff0c;机器学习中的微积分跟线性代数结合在一起。机器学习中导数的分子分母…

Chapter 4: Functions | Python for Everybody 讲义笔记_En

文章目录 Python for Everybody课程简介FunctionsFunction callsBuilt-in functionsType conversion functionsMath functionsRandom numbersAdding new functionsDefinitions and usesFlow of executionParameters and argumentsFruitful functions and void functionsWhy fun…

GEE:GEE上一些好看的可视化参数

作者&#xff1a;CSDN _养乐多_ 为了方便使用&#xff0c;总结了几种可视化参数。 文章目录 一、连续型1.11.21.31.41.5 二、离散型2.1 一、连续型 1.1 var phenoPalette [ff0000,ff8d00,fbff00,4aff00,00ffe7,01b8ff,0036ff,fb00ff]1.2 var evapotranspirationVis {min…

异地手机卡如何在当地办理宽带【纯教程篇】

有一些小伙伴常年在外漂泊会经常使用异地卡套餐&#xff0c;但是当你需要办理宽带业务的时候&#xff0c;很多时候当地的营业厅会让你再办理一张他们本地的手机卡&#xff0c;不方便不说还要多支付一张卡的月租也不划算。 其实呢运营商早就有异地办理宽带的业务&#xff0c;只不…

公司新来了个卷王,还是个00后,我们这帮老油条真干不过...

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。这不&#xff0c;前段时间我们公司来了个00后&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 …

浅析集群、分布式、负载均衡

平时开发或者面试中进场听到集群、分布式、负载均衡等系列的名词&#xff0c;他们之间有什么联系呢&#xff0c;本文就简要的抛砖引玉一下。 集群 1.什么是集群 集群一般指的是服务器集群。集群其实就是一组相互独立的计算机&#xff0c;通过高速的网络组成一个计算机系统。…

深度学习笔记之Transformer(六)Position Embedding铺垫:Skipgram与CBOW模型

深度学习笔记之Transformer——PositionEmbedding铺垫&#xff1a;Skipgram与CBOW模型 引言回顾&#xff1a; Word2vec \text{Word2vec} Word2vec模型补充&#xff1a;关于 Word2vec \text{Word2vec} Word2vec的一些说明 引言 上一节介绍了 Word2vec \text{Word2vec} Word2vec…

【动态规划算法】第九题:64. 最小路径和

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你…

Todo-List案例版本一

初级使用e.target.value 记得安装npm i nanoid与UUID类似 快捷键ctrlH替换内容 src/components/MyHeader.vue <template><div class"todo-header"><input type"text" placeholder"请输入你的任务名称&#xff0c;按回车键确认&quo…

express框架中使用ejs

1.设置模块引擎为ejs app.set("view engine","ejs") 2. 设置模版文件存放位置 说明&#xff1a;模版文件&#xff1a;具有模版语法内容的文件。 app.set(vies,path.resolve(__dirname,"./views")) 3.render渲染 app.get(/home,(req,res)>{/…