数据结构与算法-选择排序

引言

        在计算机科学中,数据结构和算法是两个至关重要的基石。它们共同决定了程序的效率、可读性和可维护性。本文我们将聚焦于一种基础而直观的排序算法——选择排序,并探讨其内在的工作机制以及在实际应用中的优缺点。

一、什么是选择排序?

        选择排序(Selection Sort)是一种简单直观的排序算法。它的基本思想是在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

二、选择排序的步骤详解

  1. 初始化:首先,在待排序的数组中选出一个基准元素,通常我们选择第一个元素作为初始基准。

  2. 查找最小(或最大)值:遍历从第二个元素开始到数组结尾的所有元素,找出其中的最小(或最大)值及其索引。

  3. 交换位置:将找到的最小(或最大)值与其所在位置之前的基准元素交换位置,这样基准元素的位置就确定了,它左边的元素都比它小(或大),右边的则还没有比较过。

  4. 重复过程:之后,对剩余未排序的部分进行同样的操作,即选取剩余部分的第一个元素为新的基准,重复上述查找和交换的过程,直至整个序列有序。

三、选择排序的时间复杂度和空间复杂度

四、选择排序的优点与缺点

  1. 时间复杂度:由于无论哪种情况下都需要对数组进行n(n-1)/2次比较,因此选择排序的时间复杂度为O(n²),这在处理大量数据时效率较低。

  2. 空间复杂度:选择排序是原地排序算法,只需要常量级的额外空间,故其空间复杂度为O(1)。

优点

  • 实现简单,逻辑清晰,易于理解。
  • 不依赖于原始数据的特性,对输入数据的随机性不敏感。
  • 空间效率高,只需要常量级的辅助空间。

缺点

  • 效率相对低下,尤其对于大数据集,因其线性阶的比较次数导致性能瓶颈明显。
  • 不稳定排序,即相等元素的顺序可能会在排序过程中发生改变。

五、选择排序的图解过程

图解小结

1. 选择排序一共有数组大小-1次排序

2. 每一轮排序,又是一个循环,循环的规则:

2.1 先假定当前这个数是最小数

2.2 然后和后面的每一个数比较,如果发现有比当前更小的数,就重新确定最小数并记录其下标

2.3 当遍历到数组的最后时,就得到本轮最小数和其下标

2.4 交换

六、选择排序的代码实践 

1.展示每一次选择排序过程

        int minIndex1 = 0;int min1 = arr[0];for (int j = 0 + 1; j < arr.length; j++) {if (min1 > arr[j]) {min1 = arr[j];minIndex1 = j;}}if (minIndex1 != 0) {arr[minIndex1] = arr[0];arr[0] = min1;}System.out.println("第一轮的遍历为");System.out.println(Arrays.toString(arr));int minIndex2 = 1;int min2 = arr[1];for (int j = 1 + 1; j < arr.length; j++) {if (min2 > arr[j]) {min2 = arr[j];minIndex2 = j;}}if (minIndex2 != 1) {arr[minIndex2] = arr[1];arr[1] = min2;}System.out.println("第二轮的遍历为");System.out.println(Arrays.toString(arr));

2.总结规律得到过程  

    //    有上述规律可见public static void selectSort(int[] arr) {for (int i = 0; i < arr.length; i++) {int minIndex = i;int min = arr[i];for (int j = 1 + i; j < arr.length; j++) {if (min > arr[j]) {min = arr[j];minIndex = j;}}if (minIndex != i) {arr[minIndex] = arr[i];arr[i] = min;}System.out.printf("第%d轮的遍历为", i + 1);System.out.println(Arrays.toString(arr));}}

七、总结

        尽管选择排序在效率上相比其他高级排序算法如快速排序、归并排序等存在劣势,但在某些特定场景下仍有其独特价值。例如,在内存资源非常有限的嵌入式系统或者硬件受限环境下,选择排序可以作为备选方案。此外,由于其实现简单,也常被用于教学示例,帮助初学者理解和掌握排序算法的基本思路。

        选择排序虽然在效率上并不占优,但在理解和实现上却极为简洁明了,对于初学者而言,它是理解排序算法原理的良好起点。在实际开发中,我们可以根据具体场景选择更为高效的排序算法如快速排序、归并排序等。然而,理解选择排序的底层逻辑有助于我们更好地掌握其他复杂的排序算法,也是提升编程素养的重要一步。

 

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

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

相关文章

xss.haozi.me:0x07

<img src1 onerroralert(1)

tomcat下载安装配置教程

tomcat下载安装配置教程 我是使用tomcat下载安装及配置教程_tomcat安装-CSDN博客 此贴来进行安装配置&#xff0c;原文21年已经有些许不同。 下载tomcat 官网&#xff1a;http://tomcat.apache.org/ 我们老师让安装8.5以上&#xff0c;所以我直接选择版本9 点击9页面之后…

HTTPS的实现原理

图片来源&#xff1a;HTTPS 详解一&#xff1a;附带最精美详尽的 HTTPS 原理图 - 个人文章 - SegmentFault 思否 加密流程按图中的序号分为&#xff1a; 客户端请求 HTTPS 网址&#xff0c;然后连接到 server 的 443 端口 (HTTPS 默认端口&#xff0c;类似于 HTTP 的80端口)。…

Windows批处理:bat文件学习

目录 第一章、快速了解Windows批处理1.1&#xff09;Windows批处理相关概念介绍1.1.1&#xff09;批处理的起源1.1.2&#xff09;bat文件介绍 1.2&#xff09;Demo1.2.1&#xff09;创建文件添加命令1.2.2&#xff09;bat脚本中的命令解释 第二章、实例2.1&#xff09;点击bat文…

navicat安装11.3

一、安装navicat 1、下载navicat 2、解压压缩包 3、点击exe文件 4、输入密钥&#xff1a; NAVH-WK6A-DMVK-DKW3 5、点击打开&#xff1a; 输入连接参数&#xff1a; 6、查看连接好仓库 7、 在使用navicat来编写sql语句 8、编写语句 连接不上问题&#xff0c;检查问题&#…

【Vue3】深入理解Vue中的ref属性

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

Redis 之三:Redis 的发布订阅(pub/sub)

概念介绍 Redis 发布订阅 (pub/sub) 是一种消息通信模式&#xff0c;它允许客户端之间进行异步的消息传递 Redis 客户端可以订阅任意数量的频道。 模型中的角色 在该模型中&#xff0c;有三种角色&#xff1a; 发布者&#xff08;Publisher&#xff09;&#xff1a;负责发送信…

嵌入式中7个底层数据结构分解

在编程的世界里&#xff0c;数据结构是构建信息框架的骨架。就像现实生活中的建筑需要精心设计的结构一样&#xff0c;我们的数据也需要合适的结构来保证程序的高效和稳定。今天&#xff0c;我们就像探险家一样&#xff0c;一起去探索七大数据结构的奥秘&#xff0c;并揭开它们…

光路科技:工业以太网交换机引领工业互联网新篇章

随着全球范围内工业4.0的浪潮不断涌动&#xff0c;工业互联网作为其核心驱动力&#xff0c;正引领着工业生产向智能化、网络化的崭新阶段迈进。在这一转型的浪潮中&#xff0c;光路科技凭借其卓越的工业互联设备与创新解决方案&#xff0c;正为工业互联网领域的发展注入新的活力…

Linux环境基础开发工具使用

目录 1.Linux软件包管理器yum 什么是软件包 关于 lrzsz 查看软件包 2.Linux开发工具 2.1.vim的基本概念 2.2vim的基本操作 2.3vim命令模式命令集 1.插入模式 2.从插入模式切换为命令模式 3.移动光标 4.删除文字 5.复制 6.替换 7.撤销上一次的操作 8.更改 2.4v…

[动态规划]---part1

前言 作者&#xff1a;小蜗牛向前冲 专栏&#xff1a;小蜗牛算法之路 专栏介绍&#xff1a;"蜗牛之道&#xff0c;攀登大厂高峰&#xff0c;让我们携手学习算法。在这个专栏中&#xff0c;将涵盖动态规划、贪心算法、回溯等高阶技巧&#xff0c;不定期为你奉上基础数据结构…

Linux设备模型(九) - bus/device/device_driver/class

一&#xff0c;设备驱动模型 1&#xff0c;概述 在前面写的驱动中&#xff0c;我们发现编写驱动有个固定的模式只有往里面套代码就可以了&#xff0c;它们之间的大致流程可以总结如下&#xff1a; 实现入口函数xxx_init()和卸载函数xxx_exit() 申请设备号 register_chrdev_r…

Spring源码:手写SpringDI

我们是在实现了SpringIOC的基础上&#xff0c;进行拓展&#xff0c;IOC实现源码可以查看&#xff1a;手写SpringIOC 文章目录 一、分析二、实现1、构造注入1&#xff09;分析2&#xff09;版本1BeanReferenceBeanDefinitionGenericBeanDefinitionDefaultBeanFactory1、改造构造…

ES入门六:Suggesters Api实践

都是负担在很多app上&#xff0c;当我们输入某些内容时候&#xff0c;它会立即做一些补全操作&#xff0c;如果我想实现上述的需求&#xff0c;我们就可以使用ES提供的Suggesters Api。那Suggesters是如何做到的那&#xff1f;简单来说&#xff0c;Suggesters会将输入的文本拆分…

【网站项目】167固定资产管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

谁才是“内卷”之王?众多洗地机品牌哪家清洁力最强?清洁最干净?

在如今快节奏的生活中&#xff0c;家庭清洁工作愈发显得繁琐而耗时。添可洗地机凭借其高效的一体化清洁功能和智能化操作&#xff0c;为现代家庭生活带来了极大的便利。面对众多款品牌洗地机型号&#xff0c;消费者不禁会问&#xff1a;哪家洗地机清洁力最强&#xff1f;在性能…

解决tomcat双击startup.bat一闪而过的问题

这种问题可能是tomcat找不到你的jdk环境配置路径 1、首先在tomcat的bin文件夹找到startup.bat 和catalina.bat两个文件 2、startup.bat用记事本打开 在末尾添加pause 3、保存修改&#xff0c;双击startup.bat如果出现这种问题&#xff0c;就是找不到jdk路径 4、用记事本打开ca…

STM32CubeMX实战教程: TIM6、TIM7 - 基本定时器

目录 一、基本定时器的作用 二、常用型号的TIM时钟频率 三、CubeMX配置 四、编写执行代码 一、基本定时器的作用 基本定时器&#xff0c;主要用于实现定时和计数功能。作用包括&#xff1a; 定时功能&#xff1a;可以产生周期性的中断&#xff0c;用于实现定时任务。例如&…

什么是Docker容器?

Docker是一种轻量级的虚拟化技术&#xff0c;同时是一个开源的应用容器运行环境搭建平台&#xff0c;可以让开发者以便捷方式打包应用到一个可移植的容器中&#xff0c;然后安装至任何运行Linux或Windows等系统的服务器上。相较于传统虚拟机&#xff0c;Docker容器提供轻量化的…

linux安装mysql5.7

linux安装mysql5.7 一、下载mysql5.7二、解压包介绍三、上传包到linux四、卸载mariadb五、安装mysql六、修改权限七、启动mysql八、使用过navicat创作不易&#xff0c;笔记不易&#xff0c;如觉不错&#xff0c;请三连&#xff0c;谢谢~~ 一、下载mysql5.7 去mysql官方下载&am…