选择排序:简单但有效的排序策略

选择排序:简单但有效的排序策略

欢迎来到我们的编程博客!今天,我们将深入探讨一种基础但非常重要的排序算法:选择排序。这种算法简单易学,是理解更复杂排序算法的良好起点。

什么是选择排序?

选择排序是一种简单的比较排序算法。它的基本思想是:遍历整个数组,找到最小(或最大)的元素,然后将它与数组的第一个元素交换位置。接下来,再从剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。再接下来,再从剩下的元素中找到最小的元素,将它与数组的第三个元素交换位置,以此类推重复这个过程,确定接下来的第四,第五,一直到最后的元素,直到整个数组被排序。

选择排序的工作原理

选择排序的核心在于不断选择剩余部分的最小元素,并将其放置到已排序序列的末尾。

  1. 第一轮选择

    (外层循环的第1次):

    • 遍历整个数组,找到最小的元素,此例中为11。11位于索引4处,与数组的第一个元素(64)交换。数组变为 [11, 25, 12, 22, 64]
  2. 第二轮选择

    (外层循环的第2次):

    • 从索引1开始(即剩下的未排序部分),找到最小的元素,此例中为12。12位于索引2处,与当前未排序部分的第一个元素(25)交换。数组变为 [11, 12, 25, 22, 64]
  3. 第三轮选择

    • 从索引2开始,找到最小的元素,此例中为22。22已经在正确的位置,所以无需交换。
  4. 第四轮选择

    • 从索引3开始,仅剩两个元素。25和64中,25较小,但它已经在正确的位置,所以再次无需交换。
  5. 排序完成

    • 此时数组已经完全排序,最终序列为 [11, 12, 22, 25, 64]

在每一轮选择中,我们都减少了搜索的范围,因为排序的部分不再需要检查。通过这种方式,每次都确保至少有一个元素被放置在其最终位置。

def selection_sort(arr):for i in range(len(arr)):# 找到剩余部分最小元素的索引min_idx = ifor j in range(i+1, len(arr)):if arr[j] < arr[min_idx]:min_idx = j# 将找到的最小元素与当前位置的元素交换arr[i], arr[min_idx] = arr[min_idx], arr[i]# 测试数组
arr = [64, 25, 12, 22, 11]
selection_sort(arr)
print("Sorted array is:", arr)

循环次数

和之前提过的冒泡排序类似

外循环

每一次都要从最前面没有被确定下来的位置开始循环,类似的到倒数第二个被确定下来,最后一个也是随之确定的,最后一次同时确定两个数字,而之前的循环都是一次确定一个,总循环N-1次

内循环

每次是不是都要从头开始,就是之前提到的每一次都要从最前面没有被确定下来的位置开始循环,位置是多少第一次是第二个,第二次是第三个,第几次就是第几个加个1,因为我们只要与最开头的那一个进行比较

选择排序的时间复杂度

选择排序的时间复杂度为 O(n^2),其中 n 是数组的长度。这是因为它需要进行两层嵌套循环:外层循环遍历数组,内层循环在剩余元素中寻找最小元素。

for i in range(len(arr)):# 找到剩余部分最小元素的索引min_idx = ifor j in range(i+1, len(arr)):if arr[j] < arr[min_idx]:min_idx = j

这个过程需要两个嵌套的循环:

  1. 外循环:外循环从0到n-1遍历未排序部分的每个元素,确定每次选择的最小元素的位置。
  2. 内循环:内循环从外循环的当前位置开始,遍历未排序部分的其余元素,找到最小元素的位置。

在每一次内循环中,都会执行一次比较操作,用来找到未排序部分的最小元素。因此,总共需要执行大约**(n-1) + (n-2) + … + 1 = (n^2 - n) / 2** 次比较操作。

选择排序的空间复杂度

选择排序的空间复杂度是O(1),也可以称为常数空间复杂度。这意味着无论输入数据的规模如何,选择排序所需的额外内存空间是固定的,与输入数据的大小无关。

选择排序的优势和劣势

优势
  • 简单易懂:选择排序是一种非常简单和直观的排序算法。它的基本思想是通过不断选择未排序部分中的最小(或最大)元素并将其放置在已排序部分的末尾。这个过程易于理解,不需要复杂的逻辑或数据结构。因此,选择排序是一种非常适合教学和学习排序算法的算法。即使对于初学者来说,他们也能够迅速理解和实现它。
  • 原地排序:选择排序是一种原地排序算法,也就是说它不需要额外的存储空间来存储数据。排序过程中只需要进行元素之间的交换,因此它的空间复杂度为O(1)。这使得选择排序在内存有限的情况下很有用,因为它不会占用大量的额外空间,可以在原始数据上进行排序。
劣势
  • 效率较低:选择排序的时间复杂度为O(n^2),其中n是待排序元素的数量。这意味着它的性能在处理大规模数据集时会变得非常低下。对于包含大量元素的列表或数组,选择排序需要执行大量的比较和交换操作,导致排序时间显著增加。因此,对于大型数据集,更高效的排序算法(如快速排序或归并排序)通常更为合适。
  • 不稳定排序:选择排序是一种不稳定的排序算法。不稳定排序意味着在排序过程中,相等元素的相对顺序可能会改变。这可能导致一些问题,特别是在需要保持原始顺序的情况下,选择排序不适用。相反,稳定排序算法能够保持相等元素的相对顺序,这在某些应用中非常重要。
  • 不适合部分有序数据:如果输入数据已经部分有序,选择排序仍然需要执行相同数量的比较和交换操作,因此它不会充分利用数据的有序性。其他一些排序算法,如插入排序,对于部分有序数据表现更好,因为它们可以提前结束排序过程。

结语

选择排序是一种简单且有效的排序方法,尤其适合用于教学和处理小规模数据集。尽管它在大规模数据集上的性能不如一些更高级的排序算法,但它的简易性和直观性使其成为理解排序算法的重要一步。希望这篇博客和代码示例帮助你更深入地理解了选择排序的原理和实现方式。

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

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

相关文章

YOLOv5独家原创改进:自研独家创新MSAM注意力,通道注意力升级,魔改CBAM

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文自研创新改进&#xff1a;MSAM&#xff08;CBAM升级版&#xff09;&#xff1a;通道注意力具备多尺度性能&#xff0c;多分支深度卷积更好的提取多尺度特征&#xff0c;最后高效结合空间注意力 1&#xff09;作为注意力MSAM使用&am…

迷你洗衣机哪个牌子好又实惠?口碑最好的小型洗衣机

不得不说洗衣机的发明解放了我们的双手&#xff0c;而我们从小到大就有这个意识&#xff0c;贴身衣物不可以和普通的衣服一起丢进去洗衣机一起&#xff0c;而内衣裤上不仅有肉眼看见的污渍还有手上根本无法消灭的细菌&#xff0c;但是有一款专门可以将衣物上的细菌杀除的内衣洗…

基于单片机环境监测温湿度PM2.5系统设计

**单片机设计介绍&#xff0c;基于单片机环境监测温湿度PM2.5系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 设计一个基于单片机环境监测温湿度PM2.5的系统是一个非常有意义的项目。以下是一个基本的介绍&#xff1a; …

GAN:DCGAN-深度卷积生成对抗网络

论文&#xff1a;https://arxiv.org/pdf/1511.06434.pdf 发表&#xff1a;ICLR 2016 一、架构创新 1&#xff1a;全卷积网络&#xff1a;用逐步卷积代替确定性的空间池化函数&#xff08;如maxpooling&#xff09;&#xff0c;使网络学习自己的空间下采样。使用这种方法&#…

RFID资产管理系统全功能详解!高效管理从这里开始!

在现代商业环境中&#xff0c;RFID资产管理系统正成为企业管理不可或缺的先进工具。现代企业管理正处于数字化的浪潮中&#xff0c;而RFID资产管理系统正是这场浪潮中的一颗璀璨明珠。在这篇文章中&#xff0c;我们将全方位解析RFID资产管理系统的功能&#xff0c;助您深入了解…

Axios 并发请求指南 - 3 种简单实用的方法

在实际开发中&#xff0c;我们经常需要同时发送多个请求&#xff0c;并在所有请求完成后进行处理&#xff0c;这就是所谓的并发请求。实现 Axios 并发请求的关键是使用 Axios.all 方法&#xff0c;它接受一个 Promise 的数组作为参数&#xff0c;当这些 Promise 都 resolve 时&…

代洋集团:太阳能智能座椅,创新能源的未来篇章

在代洋集团&#xff0c;我们致力于打造一个更绿色&#xff0c;更智能的未来。我们的太阳能智能座椅&#xff0c;就是我们对这一承诺的最新体现。 太阳能智能座椅&#xff0c;一种将绿色能源与智能化完美结合的产品。它利用高效的太阳能电池板&#xff0c;捕获并转化阳光为电能…

GOAT:多模态、终身学习、平台无关的机器人通用导航系统

机器人应用中涉及到的核心技术包括&#xff1a;环境感知与理解、实时定位与建图、路径规划、行为控制等。GOAT通过多模态结合终生学习的方式让你的机器人可以在未知环境中搜索和导航到任何物体。小白也可以零门槛上手。 项目地址&#xff1a;https://theophilegervet.github.i…

【开题报告】基于卷积神经网络的图像脑部MRI图像分割

论文题目 基于卷积神经网络的图像脑部MRI图像分割 一、选题意义 1.课题研究的目的和意义 1.1选题目的 脑部疾病是高致残致死率的疾病之一&#xff0c;对人们的生活质量和生命安全都有着十分重大的影响&#xff0c;所以各个国家都开始对脑部疾病的研究重视起来。帕金森、脑胶质…

最新AIGC创作系统ChatGPT系统源码+DALL-E3文生图+图片上传对话识图/支持OpenAI-GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

使用 Nginx Ingress 快速实现 URL 重写

什么是URL重写 URL重写&#xff08;URL rewriting&#xff09;是一种在Web服务器上修改或转换请求URL的过程。它通常涉及使用服务器配置或规则来更改传入的URL&#xff0c;以便在不改变实际请求资源的情况下&#xff0c;实现不同的行为&#xff0c;如重定向、路径映射、参数处…

如何用眼精星票证识别系统识别名片?

近年来&#xff0c;随着信息化技术的不断发展&#xff0c;越来越多的人开始使用电子名片来进行商务交流和信息传递。然而&#xff0c;如何将纸质名片转化为电子名片并结构化数据&#xff0c;却一直是许多人的难题。本文将介绍一种使用眼精星票证识别系统的方法&#xff0c;将纸…

应用在智能手环距离检测领域的数字红外接近检测模块

智能手环是现代人日常生活中的一种智能配件&#xff0c;可以帮助我们记录运动数据、监测身体健康状况等。然而&#xff0c;对于许多用户来说&#xff0c;关注的问题之一就是智能手环的有效距离和精准度。智能手环通过内置传感器收集数据并将其发送到手机或其他设备上进行处理。…

第二十章多线程

线程简介 java语言提供了并发机制&#xff0c;程序员可以在程序中执行多个线程&#xff0c;每一个线程完成一个功能&#xff0c;并与其他线程并发运行。 一个进程是一个包含有自身地址的程序&#xff0c;每个独立执行的程序都称为进程。也就是说每个正在执行的程序都是一个进…

如果每天工资按代码行数来算,来看看你每天工资是多少

说在前面 &#x1f63c;&#x1f63c;如果每天的工资取决于我们所编写的代码行数&#xff0c;那么我们的生活会发生怎样的改变&#xff1f;来看看你的同事们今天都提交了多少代码吧&#xff0c;看看谁是卷王&#xff0c;谁在摸鱼&#xff08;&#x1f436;&#x1f436;狗头保命…

汇编语言指令大全30条

汇编语言&#xff08;Assembly language&#xff09;是一种低级编程语言&#xff0c;每种计算机都有一种特殊的汇编语言&#xff0c;程序员可以用它编写程序。汇编语言是机器语言的一种高级形式&#xff0c;由一系列的命令组成&#xff0c;这些命令通常由英文单词或缩写表示。 …

DNS协议、ICMP协议、NAT技术

文章目录 一.DNS协议1.DNS背景2.域名简介3.域名解析过程4.使用dig工具分析DNS过程 二.ICMP协议1.ICMP功能2.ICMP协议格式3.ping命令4.一个值得注意的坑5.traceroute命令 三.NAT技术1.NAT技术背景2.NAT IP转换过程3.NAPT4.NAT技术的缺陷5.NAT和代理服务器 四.网络协议总结1.应用…

多线程(进程池代码)

线程池介绍 那究竟什么是线程池呢&#xff1f; 线程池是一种线程使用模式. 线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能. 而线程池维护着多个线程&#xff0c;等待着监督管理者分配可并发执行的任务. 这避免了在处理短时间任务时创建与销毁线程的代价. 线…

19元月租的流量卡有长期套餐吗?看看你选对流量卡了吗!

当我们购买流量卡时&#xff0c;会看到有很多宣传19元长期套餐的流量了&#xff0c;那么这些宣传是真的还是假的呢&#xff1f; ​  其实据小编了解&#xff0c;如果是你在网上申请的大流量卡&#xff0c;而且是运营商推出的正规流量卡&#xff0c;在没有任何套路的情况下&a…

【安装指南】MySQL和Navicat下载、安装及使用详细教程

目录 ⛳️1.【MySQL】安装教程 1.1 获取下载包 1.2 MySQL安装 1.2.1 MySQL工具安装 1.2.2 MySQL环境变量 1.2.3 验证MySQL安装成功 ⛳️2.【Navicat-v15】的安装和无限使用 ⛳️3.【测试Navicat连接MySQL】 ⛳️1.【MySQL】安装教程 1.1 获取下载包 前往官网获取压缩包…