数据结构进阶篇 之【选择排序】详细讲解(选择排序,堆排序)

news2024/7/6 19:07:17

在这里插入图片描述
民以食为天,我以乐为先
嘴上来的嘘寒问暖,不如直接打笔巨款

一、选择排序

1.直接选择排序

1.1 基本思想

1.2 实现原理

1.3 代码实现

1.4 直接选择排序的特性总结

2.堆排序

跳转链接:数据结构 之 堆的应用

二、完结撒❀

–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀-正文开始-❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–

一、选择排序

1.直接选择排序

1.1 基本思想

original版(原始版):

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

optimize版(优化版):

每一次从待排序的数据元素中选出最小和最大的两个元素,分别存放在序列的起始位置和队尾位置,直到全部待排序的数据元素排完。

1.2 实现原理

这里我们讲解optimize版

在元素集合array[0]–array[n-1]中选择值最大和值小的数据元素

若最大值不是这组元素中的最后一个元素,则将它与这组元素中的最后一个元素交换,若最小值不是这组元素中的第一个元素,则将它与这组元素中的第一个元素进行交换

在剩余的array[1]–array[n-2]集合中,重复上述步骤,直到集合剩余1个元素或2个元素

因为我们完成一次循环后就可以将数组开头下标加1,结尾下标减一,所以我们需要记录下标实现交换

这里直接说明,按照上述逻辑执行到数组中剩下两个元素的时候可能会出现BUG,当剩下两个下标对应值不符合逻辑时会相互进行两次交换,但这时只进行一次交换就足够

动态图解:
在这里插入图片描述

1.3 代码实现

//选择排序 同时选出最大和最小的两个数据
void SelectSort(int* a, int n)
{
		int begin = 0;
		int end = n - 1;

		while (begin<end)
		{
			int mini = begin, maxi = begin;
			//选出最大和最小值
			for (int i = begin + 1; i <= end; i++)
			{
				if (a[i] < a[mini])
				{
					mini = i;
				}

				if (a[i] > a[maxi])
				{
					maxi = i;
				}
			}

			Swap(&a[begin], &a[mini]);
			if (begin == maxi)//!!!
			{
				maxi = mini;
			}
			Swap(&a[end], &a[maxi]);
			++begin;
			--end;
		}
}

1.4 直接选择排序的特性总结

1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用

2. 时间复杂度:O(N^2)

3. 空间复杂度:O(1)

4. 稳定性:不稳定

2.堆排序

跳转链接:数据结构 之 堆的应用
堆排序我之前博客有讲大家直接跳转学习即可

二、完结撒❀

如果以上内容对你有帮助不妨点赞支持一下,以后还会分享更多编程知识,我们一起进步。
最后我想讲的是,据说点赞的都能找到漂亮女朋友❤
在这里插入图片描述

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

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

相关文章

拥塞控制算法系列之:Swift-谷歌2020年SIGCOM-包级别端到端TIMELY拥塞控制算法

核心要点&#xff1a; 谷歌 2020 SIGCOM基于delay的AIMD拥塞拆分EC和FC&#xff0c;时延敏感场景优势分别计算EC和FC的wnd&#xff08;最核心&#xff09;保障吞吐和低延迟。Swift 因利用延迟的简单性和有效性而闻名包级别的论文&#xff1a;https://dl.acm.org/doi/pdf/10.11…

防止linux出现大量 FIN_WAIT1

netstat 查看系统连接情况&#xff0c;出现 FIN_WAIT1&#xff1a; 当连接数多时&#xff0c;经常出现大量FIN_WAIT1,可以修改 /etc/sysctl.conf以下参数&#xff1a; net.ipv4.tcp_fin_timeout 10net.ipv4.tcp_keepalive_time 30net.ipv4.tcp_window_scaling 0net.ipv4.tc…

吴恩达机器学习笔记:第 6 周-11机器学习系统的设计(Machine Learning System Design)11.1-11.2

目录 第 6 周 11、 机器学习系统的设计(Machine Learning System Design)11.1 首先要做什么11.2 误差分析11.3 类偏斜的误差度量 第 6 周 11、 机器学习系统的设计(Machine Learning System Design) 11.1 首先要做什么 在接下来的视频中&#xff0c;我将谈到机器学习系统的设…

springdoc-openapi-用户界面如何将请求设置为HTTPS

一、问题描述 当我们的服务接口需要通过HTTPS访问时&#xff0c;通过swagger可视化页面请求接口的时候&#xff0c;发起的是HTTP请求&#xff0c;导致请求无法到达后端&#xff0c;影响测试。 二、解决方法 1、将服务的地址添加到配置文件中 swagger:server-list: #本地环境…

ubuntu-server部署hive-part3-安装mysql

参照 https://blog.csdn.net/qq_41946216/article/details/134345137 操作系统版本&#xff1a;ubuntu-server-22.04.3 虚拟机&#xff1a;virtualbox7.0 部署mysql 下载上传 下载地址 https://downloads.mysql.com/archives/community/ 以root用户上传&#xff0c;/usr/loc…

【信贷后台管理系统之axios的二次封装(四)】

文章目录 一、axios的二次封装二、配置后端接口地址三、登录接口api联调四、贷款申请接口api编写联调 一、axios的二次封装 示例&#xff1a;pandas 是基于NumPy 的一种工具&#xff0c;该工具是为了解决数据分析任务而创建的。 src下新建utils,新建request.js用来封装axios 控…

Set a Light 3D Studio:探索光影艺术的全新维度mac/win中文版

Set a Light 3D Studio 是一款领先的三维建模和渲染软件&#xff0c;它将设计师、艺术家和摄影师的创意想法转化为生动逼真的三维场景。这款软件以其强大的功能和直观的界面&#xff0c;成为行业内众多专业人士的首 选工具。 set.a.light 3D STUDIO中文版软件获取 在Set a Lig…

unity shader学习练笔日记(一)

1、简单顶点/片元着色器 Shader "Unity Shaders Study/Day One/Simple Shader" {Properties{//声明一个Color类型的属性_Color ("Color Tint", Color) (1.0, 1.0, 1.0, 1.0)}SubShader{Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag//在CG代码…

【Go】十八、管道

文章目录 1、管道2、管道的定义3、管道的关闭4、管道的遍历5、管道 协程6、只读、只写管道7、管道的阻塞8、select 1、管道 channel本质是一个队列&#xff0c;先进先出自身线程安全&#xff0c;多协程访问时&#xff0c;不用加锁&#xff0c;channel本身就是线程安全的一个s…

OpenCV 笔记(28):图像降噪算法——中值滤波、高斯滤波

1. 图像噪声 图像降噪(Image Denoising)是指从图像中去除噪声的过程&#xff0c;目的是提高图像质量&#xff0c;增强图像的视觉效果。 图像噪声是指图像中不希望出现的随机亮度或颜色变化&#xff0c;通常会降低图像的清晰度和可辨识度&#xff0c;以及会降低图像的质量并使图…

DFS:深搜+回溯+剪枝解决排列、子集问题

创作不易&#xff0c;感谢三连支持&#xff01;&#xff01; 一、全排列I . - 力扣&#xff08;LeetCode&#xff09; class Solution { public://全局变量vector<vector<int>> ret;vector<int> path;bool check[6];vector<vector<int>> perm…

【NLP】LLM 和 RAG

在这里&#xff0c;我描述了我在过去几年中关于 RAG 系统如何发展的主要经验。分享 Naive RAG、Advanced RAG 和 Modular RAG 框架之间的区别。总结了高云帆等人发表的一篇出色的RAG 技术调查论文的关键见解。 什么是 RAG 框架&#xff1f; OpenAI的GPT系列、Meta的LLama系列…

InterliJ IDEA基本设置

安装好idea后&#xff0c;将软件打开&#xff0c;可以进行基础设置 1.打开软件&#xff0c;先安装插件-汉化包&#xff08;不推荐&#xff0c;最好使用英文版&#xff09;&#xff0c;本次我们使用汉化版本完成基本设置&#xff0c;后期希望大家适应英文版的开发环境。&#x…

Databend 开源周报第 138 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 支持多表插入 …

一次MySQL事务的旅程:Buffer Pool, Binlog, Redo Log揭秘

MySQL中的各种Buffer和Log以及表空间 MySQL中一次事务涉及了各种Buffer,Log和表空间&#xff0c;主要涉及&#xff1a;Buffer Pool, Binlog, Undo Log, Redo Log以及表空间。 我们来探讨下。 Buffer Pool Buffer Pool主要存放在内存中&#xff0c;它是一个缓存区域&#xf…

论文阅读RangeDet: In Defense of Range View for LiDAR-based 3D Object Detection

文章目录 RangeDet: In Defense of Range View for LiDAR-based 3D Object Detection问题笛卡尔坐标结构图Meta-Kernel Convolution RangeDet: In Defense of Range View for LiDAR-based 3D Object Detection 论文&#xff1a;https://arxiv.org/pdf/2103.10039.pdf 代码&…

Python 与机器学习,在服务器使用过程中,常用的 Linux 命令包括哪些?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 本博客旨在分享在实际开发过程中&#xff0c;开发者需要了解并熟练运用的 Linux 操作系统常用命令。Linux 作为一种操作系统&#xff0c;与 Windows 或 MacOS 并驾齐驱&#xff0c;尤其在服务器和开发环…

【Node.js从基础到高级运用】二十一、使用child_process模块创建子进程

引言 在Node.js中&#xff0c;child_process模块是一个提供了创建和管理子进程的能力的核心模块。通过使用child_process模块&#xff0c;Node.js可以执行系统命令、运行其他脚本或应用程序&#xff0c;实现与Node.js进程的并行处理。 child_process模块提供了几种创建子进程的…

环信IM集成教程——Web端UIKit快速集成与消息发送

写在前面&#xff1a; 千呼万唤始出来&#xff0c;环信Web端终于出UIKit了&#xff01;&#x1f389;&#x1f389;&#x1f389; 文档地址&#xff1a;https://doc.easemob.com/uikit/chatuikit/web/chatuikit_overview.html 环信单群聊 UIKit 是基于环信即时通讯云 IM SDK 开…

Docker:探索容器化技术,重塑云计算时代应用交付与管理

一&#xff0c;引言 在云计算时代&#xff0c;随着开发者逐步将应用迁移至云端以减轻硬件管理负担&#xff0c;软件配置与环境一致性问题日益凸显。Docker的横空出世&#xff0c;恰好为软件开发者带来了全新的解决方案&#xff0c;它革新了软件的打包、分发和管理方式&#xff…