【十大排序算法】选择排序

在这里插入图片描述

选择就像是在谱曲,每个决定就是一个音符,只有将它们有序地安排在一起,才能奏响美妙的乐章。

文章目录

  • 一、选择排序的思想
  • 二、选择排序的发展历程
  • 三、选择排序具象化
  • 四、选择排序算法实现
  • 五、选择排序的特性
  • 推荐阅读

一、选择排序的思想

选择排序(Selection Sort)是一种简单直观的排序算法。它的基本思想是,每次从待排序的数据元素中选择最小(或最大)的一个元素,放到已排序序列的末尾,直到所有元素均排序完毕。

这个过程可以用下面的步骤来描述:

  1. 首先,在待排序序列中找到最小(或最大)的元素,将其与序列中的第一个元素交换位置,这样最小(或最大)的元素就放到了序列的第一个位置。
  2. 然后,在剩余的未排序序列中,找到最小(或最大)的元素,将其与序列中的第二个元素交换位置,这样第二小(或第二大)的元素就放到了序列的第二个位置。
  3. 依此类推,重复以上步骤,直到所有元素都排序完毕。

选择排序的特点是简单直观,实现也比较容易,但是由于每次都要在剩余的未排序序列中查找最小(或最大)的元素,所以其时间复杂度较高,为 O ( n 2 ) O(n^2) O(n2)。因此,选择排序适用于数据量较小的情况。

二、选择排序的发展历程

选择排序是一种简单直观的排序算法,其发展历史可以追溯到 20 世纪初期。

  1. 早期方法:选择排序的基本思想可以追溯到早期的人工排序方法。在计算机出现之前,人们就已经使用手工方法对物品进行排序,例如根据尺寸或其他属性进行选择和排列。
  2. 算法形式化:选择排序的第一个严格定义可以追溯到 20 世纪 50 年代。这时,计算机科学家开始将排序算法形式化为算法和程序。选择排序作为最简单的排序算法之一,很快就被提出并研究。
  3. 早期计算机应用:随着计算机的发展,选择排序成为早期计算机应用中常用的排序算法之一。虽然它不是最有效的排序算法,但它的简单性和直观性使得它在早期的计算机系统中得到了广泛应用。

三、选择排序具象化

场景假设:我们需要将下图序列使用选择排序按从小到大进行排序。
workspace.png

  1. 1 1 1:在当前序列中找到最小的元素即 1 1 1 与第 1 1 1 个元素(即: 4 4 4)交换位置

workspace.png

  1. 2 2 2:在当前序列中找到最小的元素即 2 2 2 与第 2 2 2 个元素(即: 3 3 3)交换位置

workspace (1).png

  1. 3 3 3:在当前序列中找到最小的元素即 3 3 3 与第 3 3 3 个元素(即: 4 4 4)交换位置

workspace (2).png

  1. 4 4 4:在当前序列中找到最小的元素即 4 4 4 与第 4 4 4 个元素(即: 5 5 5)交换位置

workspace (3).png

  1. 5 5 5:不需要做任何操作,因为所有元素已排序好

workspace.png
我们可以发现:其实 n n n 个元素,只需要 n − 1 n - 1 n1 趟选择就可以完成排序。

四、选择排序算法实现

// 选择排序算法实现
public void selectionSort(int[] arr) {
    int n = arr.length; // 获取数组长度

    // 外层循环,遍历数组中的每个元素(除最后一个元素)
    for (int i = 0; i < n - 1; i++) {
        int minIndex = i; // 假设当前位置为最小值的索引

        // 内层循环,在未排序的部分中找到最小值的索引
        for (int j = i + 1; j < n; j++) {
            if (arr[j] < arr[minIndex]) { // 如果当前元素比最小值还小
                minIndex = j; // 更新最小值的索引
            }
        }

        // 将找到的最小值与当前位置的元素交换
        int temp = arr[minIndex];
        arr[minIndex] = arr[i];
        arr[i] = temp;
    }
}

算法时间复杂度分析:

情况时间复杂度计算公式
最好情况 O ( n 2 ) O(n^2) O(n2) T ( n ) = ∑ i = 1 n ( n − i + 1 ) = n ( n + 1 ) 2 = O ( n 2 ) T(n) = \sum_{i = 1}^{n}(n - i + 1) = \frac{n(n + 1)}{2} = O(n^2) T(n)=i=1n(ni+1)=2n(n+1)=O(n2)
平均情况 O ( n 2 ) O(n^2) O(n2) T ( n ) = ∑ i = 1 n ( n − i + 1 ) = n ( n + 1 ) 2 = O ( n 2 ) T(n) = \sum_{i = 1}^{n}(n - i + 1) = \frac{n(n + 1)}{2} = O(n^2) T(n)=i=1n(ni+1)=2n(n+1)=O(n2)
最坏情况 O ( n 2 ) O(n^2) O(n2) T ( n ) = ∑ i = 1 n ( n − i + 1 ) = n ( n + 1 ) 2 = O ( n 2 ) T(n) = \sum_{i = 1}^{n}(n - i + 1) = \frac{n(n + 1)}{2} = O(n^2) T(n)=i=1n(ni+1)=2n(n+1)=O(n2)

五、选择排序的特性

选择排序具有以下特性:

  1. 不稳定性:在选择排序中,相同元素的相对位置可能会发生变化,导致算法是不稳定的。例如,考虑数组 [ 5 , 2 , 5 , 1 ] [5, 2, 5, 1] [5,2,5,1],第一个 5 5 5 1 1 1 会交换位置,导致第一个 5 5 5 与第二个 5 5 5 的相对位置改变。
  2. 简单直观:选择排序是一种简单直观的排序算法,易于理解和实现。它的核心思想是每次从待排序的元素中选择最小(或最大)的元素,将其放到已排序序列的末尾。
  3. 时间复杂度:选择排序的时间复杂度为 O ( n 2 ) O(n^2) O(n2),其中 n n n 是数组的长度。这是因为它包含了两层嵌套的循环,每次内层循环都要遍历剩余未排序的部分来寻找最小值。
  4. 空间复杂度:选择排序的空间复杂度为 O ( 1 ) O(1) O(1),因为它只需要常数级别的额外空间来存储临时变量和进行元素交换。
  5. 适用性:尽管选择排序通常不是最有效的排序算法,但在某些特定情况下,它可能是一个不错的选择。例如,对小型数组或者已经基本有序的数组进行排序时,选择排序的性能可能比较好。
  6. 不需要额外的空间:选择排序是一种原地排序算法,不需要额外的空间来存储临时数据。这意味着它在空间上的开销比较小,适用于内存受限的环境。

推荐阅读

  1. Spring 三级缓存
  2. 深入了解 MyBatis 插件:定制化你的持久层框架
  3. Zookeeper 注册中心:单机部署
  4. 【JavaScript】探索 JavaScript 中的解构赋值
  5. 深入理解 JavaScript 中的 Promise、async 和 await

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[STM32]定位器与PWM的LED控制

目录 1. 深入了解STM32定时器原理&#xff0c;掌握脉宽调制pwm生成方法。 (1)STM32定时器原理 原理概述 STM32定时器的常见模式 使用步骤 (2)脉宽调制pwm生成方法。 2. 实验 (1)LED亮灭 代码 测试效果 (2)呼吸灯 代码 测试效果 3.总结 1. 深入了解STM32定时器原…

绿联云NAS一些探索(1):SSH、包管理器探测、安装docker-compose等

绿联云NAS一些探索SSH、包管理器探测、安装docker-compose等 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https:…

git报错解决方法error: remote origin already exists.

有时想添加远程本地仓库和远程公司仓库&#xff0c;但git remote的时候发现关联的是一样的&#xff0c;你再去关联时会报错&#xff0c;这时候你应该清除你想关联的远程仓库&#xff0c;再次连接就可以了 下面这个错误提示是远程源已经存在 现在你可以这样做 1、查看远程库的信…

Jenkins工作流程原理

持续集成&#xff1a;自动部署打包发布代码 Jenkins工作流程 项目已经基于Jenkins实现了持续集成&#xff0c;每当我们push代码时&#xff0c;就会触发项目完成自动编译和打包。而需要运行某个微服务时&#xff0c;我们只需要经过两步&#xff1a; 第一步&#xff0c;访问je…

双网卡配置IP和路由总结

1.在网络适配器属性IPv4中设置默认网关&#xff08;记网关地址为A&#xff09;&#xff0c;将会在本地路由标中新增一条记录&#xff1a; 网络号子网掩码网关地址0.0.0.00.0.0.0A 2.如果有两个网卡&#xff08;假设一个连接内网&#xff0c;一个连接互联网&#xff09;&#…

muse-ui的select下拉框没有出现在底部

这个是muse-ui的官网文档 Muse-UI 如果进不去的&#xff0c;可以试着翻墙用外网看看&#xff0c;这里很奇怪&#xff0c;我前几天进不去&#xff0c;然后翻墙可以进&#xff0c;这两天不翻墙也能正常进去了 说一下问题&#xff0c;就是当我们使用 muse-ui的下拉框的时候&…

碰撞问题和单调栈的结合-735. 小行星碰撞【有小坑】

题目链接及描述 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/asteroid-collision/description/?envTypestudy-plan…

SpringBoot+Vue在线考试答题系统【附:资料➕文档】

前言&#xff1a;我是源码分享交流Coding&#xff0c;专注JavaVue领域&#xff0c;专业提供程序设计开发、源码分享、 技术指导讲解、各类项目免费分享&#xff0c;定制和毕业设计服务&#xff01; 免费获取方式--->>文章末尾处&#xff01; 项目介绍016&#xff1a; 本…

ubuntu20.04 安装OpenSSL 1.0.2o (借助腾讯AI完全OK)

文章目录 ubuntu20.04安装openssl-1.0.2o安装后看不到版本信息如何解决 腾讯云 AI 代码助手: 要确认 Linux 开发板的 CPU 是多少位的&#xff0c;可以使用以下方法&#xff1a; 打开终端。输入以下命令&#xff0c;然后按回车键&#xff1a; cat /proc/cpuinfo这将显示关于 CP…

李廉洋:6.6黄金原油怎么看?今日行情分析及最新策略。

黄金消息面分析&#xff1a;美指走强未能抑制金价升势。黄金价格大幅上涨&#xff0c;在美国公布喜忧参半的经济数据后&#xff0c;金价与周二的走势发生180度大转弯&#xff0c;这些数据可能保证美联储设定的借贷成本降低。美国10年期基准国债收益率下跌3个基点&#xff0c;至…

PCA算法

PCA算法 原创 小王搬运工 时序课堂 2024-06-06 19:16 四川 1. PCA算法 PCA算法称为主成分分析&#xff0c;是一种无监督学习算法&#xff0c;主要用于数据降维和特征提取。 PCA是一种数据降维模型&#xff0c;它的基本模型是通过线性变换将数据转换到新的空间&#xff0c;这…

[经验] 腰果树的外观特征和特点是什么 #媒体#微信

腰果树的外观特征和特点是什么 腰果树是一种生长在热带和亚热带地区的落叶乔木&#xff0c;其叶子为互生&#xff0c;倒披针形或披针形&#xff0c;整个树枝条生长勃勃&#xff0c;长势喜人。 腰果树的树皮是灰色或深褐色的&#xff0c;有着纵向裂缝&#xff0c;树皮粗糙而有光…

解决 ubuntu 空间占满,删除文件后磁盘没有释放 的问题

今天打开网站页面发现显示不正常&#xff0c;很多资源文件无法正常展示。F12页面后&#xff0c;发现报的HTTPS错误&#xff0c;随后感觉可能是nginx的问题&#xff0c;就直接重启了nginx&#xff0c;nginx重启后发现问题依旧。此时查看nginx日志无任何报错。 心里想着看看磁盘空…

压力测试-性能指标-Jmeter使用-压力测试报告

文章目录 1.压测目的2.性能指标3.Jmeter3.1Jmeter使用3.1.1 运行Jmeter3.1.2 添加线程组3.1.3设置HTTP请求3.1.4 设置监视器 3.2 查看Jmeter压测结果3.2.1 查看结果树3.2.2 查看汇总报告3.2.3 查看聚合报告3.2.4 查看汇总图 1.压测目的 内存泄漏&#xff1a;OOM&#xff0c;重…

linux 下修改屏幕分辨率

在使用麒麟虚拟机时&#xff0c;不知道咋回事&#xff0c;会自动改变分辨率。 使用界面设置分辨率选项修改时&#xff0c;下面的保存修改按钮显示不出来&#xff0c;无法完成设置。 所以需要使用命令行修改一下分辨率&#xff0c;修改命令如下所示&#xff1a; 1、执行xrand…

使用jspdf将html页面生成pdf文件

1、下载jspdf插件包 npm i jspdf2、在utils文件夹下创建一个单独的文件&#xff08;名字无具体要求&#xff09; // 页面导出为pdf格式&#xff0c;title表示为下载的标题&#xff0c;html表示要下载的页面 import html2Canvas from html2canvas // 不用单独去下载这个包&…

内网安全--隧道技术代理技术

注:本文仅做技术交流,请勿非法破坏... 目录 项目: 1-Ngrok 用法 2-Frp 用法 3-Nps 用法 4-Spp 用法 工具: windows下: Proxifier(推荐~) Sockscap ccproxy Linux下: Proxychains 用法 http://t.csdnimg.cn/88Ew7 隧道技术&#xff1a;解决不出网协议上线的问…

SFML 小demo

文章目录 项目搭建代码实现main.cppobject.hsnake.hcommon.h 使用 demo 做到最后的话其实就只是验证了以前自己的一个想法&#xff0c;但是没有做成一个真正的游戏&#xff0c;可以算是一个 demo 而已吧&#xff0c;没做游戏的界面和关卡&#xff0c;不过完成了核心显式机制和功…

UE5-人物角色动画蓝图

这里主要从零给角色创建移动的蓝图&#xff0c;包含多种状态 创建 首先在角色骨骼网格体上右键创建动画蓝图 进入&#xff0c;在AnimGraph界面创建一个状态机&#xff08;stateMachine&#xff09; Idle 进入状态机&#xff0c;拉出来创建一个newState&#xff0c;这里命名…

【C++修行之道】类和对象(五)日期类的实现、const成员、取地址及const和取地址操作符重载

目录 一、 日期类的实现 Date.h 1.1 GetMonthDay函数&#xff08;获取某年某月的天数&#xff09; 问&#xff1a;这个函数为什么不和其他的函数一样放在Date.cpp文件中实现呢&#xff1f; 1.2 CheckDate函数&#xff08;检查日期有效性&#xff09;、Print函数&#xff08;…