选择排序详解(Selection sort)

news2024/12/25 9:12:40
本文已收录于专栏
《算法合集》

目录

  • 一、简单释义
      • 1、算法概念
      • 2、算法目的
      • 3、算法思想
  • 二、核心思想
  • 三、图形展示
  • 四、代码实现
      • 1、优化之前
      • 2、优化之后
  • 五、算法描述
      • 1、问题描述
      • 2、算法过程
  • 六、算法分析
      • 1、时间复杂度
      • 2、空间复杂度
      • 3、算法稳定性


一、简单释义

1、算法概念

  选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小 的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小元素,然后放到已排序的序列的末尾 。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。

2、算法目的

  从要排序的序列中,按指定的规则 (文中以升序为例)选出某一元素,再依规定交换位置后达到排序 的目的。  

3、算法思想

  每一趟从待排序的数据元素中选择最小的一个元素作为首元素 ,以此类推。直到所有元素排完为止。

二、核心思想

  1. –在序列中找到最小元素,放到序列的起始位置作为已排序序列;
  2. –从剩余未排序元素中继续寻找最小元素,放到已排序序列的末尾;
  3. –重复上述步骤,直到所有元素均排序完成。

三、图形展示

在这里插入图片描述

  1、第一次排序:用第一个元素和后面的元素进行对比,2和8对比,8比2大继续向后对比,然后2和1对比,1比2小,拿1继续向后比。此时我们可以发现后面没有比1小的值了。但是根据选择排序的原则,还是需要继续和剩下的元素进行比较的指导比较到7才能确定最小值。最终第一次排序的结果是1和2交换了位置。
在这里插入图片描述

  2、第二次排序:目前1是已经排好序的了,所以1不参与任何的对比。用第二个元素8和后面的元素进行对比,8和2对比,2比8小,拿2和后面的元素进行对比。一直对比到7,才能确定2是最小的元素。最终第二次排序的结果是8和2交换了位置。
在这里插入图片描述
  3、第三次排序:用8和4进行对比,4比8小。把8放回。用4和后面的元素进行对比。4和9进行对比,4比9小,继续向后对比。4和5进行比较,4比5小,继续向后对比。4和7进行对比,4比7小,确定4是最小的元素。最终第三次排序的结果是8和4交换了位置。
在这里插入图片描述
  4、第四次排序:用8和9进行对比,9比8大。继续向后对比。8和5进行比较,5比8小,用5和后面的元素进行对比。5和7进行对比,5比7小。确定5是最小的元素。最终第四次排序的结果是8和5交换了位置。
在这里插入图片描述
  5、第五次排序:按照上面的步骤,以此类推。第五次排序的结果是9和7交换了位置。

在这里插入图片描述
  6、第六、七次排序:第六次和第七次排序没有发生位置的交换。我们可以发现第五次的排序结果整个数组就已经是一个有序的数组的,但是选择排序算法还是进行了无用的排序错误。所以我们是可以优化算法的。

四、代码实现

1、优化之前

/**
 * @BelongsProject: demo
 * @BelongsPackage: com.wzl.Algorithm.DirectSelectionSort
 * @Author: Wuzilong
 * @Description: 选择排序
 * @CreateTime: 2023-04-28 11:25
 * @Version: 1.0
 */

public class DirectSelectionSort {
    public static void main(String[] args) {
        int[] numArray={2,8,1,4,9,5,7};
        //交换需要的中间量
        int temp;
        for (int i=0; i<numArray.length;i++){
            //定义最小值的变量
            int min=i;
            for (int j=i+1;j<numArray.length;j++){
                if (numArray[min]>numArray[j]){
                    //更新最小值的下标
                    min=j;
                }
            }
            temp=numArray[i];
            numArray[i]=numArray[min];
            numArray[min]=temp;
            System.out.println("第"+(i+1)+"轮插入"+Arrays.toString(numArray));
        }
    }
}

运行结果

在这里插入图片描述

2、优化之后

/**
 * @BelongsProject: demo
 * @BelongsPackage: com.wzl.Algorithm.DirectSelectionSort
 * @Author: Wuzilong
 * @Description: 选择排序优化版
 * @CreateTime: 2023-04-28 11:25
 * @Version: 1.0
 */

public class DirectSelectionSort {
    public static void main(String[] args) {
        int[] numArray={2,8,1,4,9,5,7};
        //交换需要的中间量
        int temp;
        for (int i=0; i<numArray.length-1;i++){
            if( i == numArray.length-2){ //如果i=数组的最后两个值
                break;  //退出循环
            }
            //定义最小值的变量
            int min=i;
            for (int j=i+1;j<numArray.length;j++){
                if (numArray[min]>numArray[j]){
                    //更新最小值的下标
                    min=j;
                }
            }
            temp=numArray[i];
            numArray[i]=numArray[min];
            numArray[min]=temp;
            System.out.println("第"+(i+1)+"轮插入"+Arrays.toString(numArray));
        }
    }
}

运行结果
在这里插入图片描述

五、算法描述

1、问题描述

  给定一个 n 个元素的数组,数组下标从 0 开始,采用 选择排序 将数组按照 升序排列。

2、算法过程

整个算法过程分为以下几步:
  1)循环迭代变量 i = 0 → n − 1 i = 0 \to n-1i=0→n−1;
  2)每次迭代,令 m i n = i min = imin=i,j = i + 1 j = i+1j=i+1;
  3)循环执行比较 a [ j ]和 a [ m i n ] ,如果产生 a [ j ] < a [ m i n ] 则执行 m i n = j 执行 j = j + 1,继续执行这一步,直到 j = = n;
  4)交换 a [ i ] a[i]a[i] 和 a [ m i n ] a[min]a[min],回到 1)。

六、算法分析

1、时间复杂度

  最好的情况全部元素已经有序,则 交换次数为0;最差的情况,全部元素逆序,就要交换 n-1 次;所以最优的时间复杂度和最差的时间复杂度和平均时间复杂度 都为 :O(n^2)

2、空间复杂度

  最优的情况下(已经有顺序)复杂度为:O(0) ;
  最差的情况下(全部元素都要重新排序)复杂度为:O(n );
  那么选择排序算法平均的时间复杂度为:O(1)

3、算法稳定性

  选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。所以选择排序是不稳定的。


🎯 此文章对你有用的话记得留言+点赞+收藏哦🎯

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

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

相关文章

Web3中文|生成式 AI 参与的未来,行业该做好哪些准备?

依照 AI 技术目前的发展态势&#xff0c; AI 可能会颠覆诸多行业的未来。 当前 AI 技术的突破让大众关注到了特定类型的 AI ——生成式 AI。生成式 AI 围绕分析、自动化和内容生成展开&#xff0c;生成内容兼具质和量。 了解生成式 AI 如何融入实用应用程序的是非常有必要的。根…

并查集算法

文章目录 1. 原理介绍2. 并查集的应用3. find()函数的定义与实现4. 并查集的join函数5. 路径压缩优化算法-优化find6. 路径压缩优化算法按秩合并算法 1. 原理介绍 并查集是一种用于维护集合关系的数据结构&#xff0c;它支持合并集合和查询元素所在的集合。它的基本思想是将元…

【人力资源管理】第1集 免费开源ERP: Odoo 16 Employees员工管理 构建一体化企业人力资源管理

文章目录 前言一、概览二、主要功能1.成功管理您的员工 集中您的所有 HR 信息2.跟踪时间&#xff0c;考勤3.休假管理4.经简化的费用管理5.轻松完成员工评估全面评估6.简化招聘流程7.简化招聘流程 总结 前言 人力资源 适用于当代企业 一体化&#xff1a;招聘、考评、报销、 休假…

android room数据库简单使用

Room来源 Android采用Sqlite作为数据库存储。由于Sqlite代码写起来繁琐且容易出错&#xff0c;因此&#xff0c;开源社区逐渐出现了各种ORM&#xff08;Object Relational Mapping&#xff09;库。常见的有ORMLite, GreenDAO等。Google也意识到推出自家ORM库的必要性&#xff0…

FE_Vue学习笔记 - 计算属性 监视属性

1 计算属性 1.1 计算属性的引入 组件模板应该只包含简单的表达式&#xff0c;复杂的表达式则应该重构为计算属性或方法。复杂表达式会让你的模板变得不那么声明式。我们应该尽量描述应该出现的是什么&#xff0c;而非如何计算那个值。而且计算属性和方法使得代码可以重用。 …

论文解读|MetaAI图像分割基础模型SAM——解锁数字大脑“视觉区”

原创 | 文 BFT机器人 内容提要 事件背景: 2023年4月5日&#xff0c;MetaAI研究团队发布论文“分割一切”一《Segment Anything》并在官网发布了图像分割基础模型一Segment Anything Model(SAM)以及图像注释数据集Segment-Anything 1-Billion(SA-1B)。 论文核心观点 : 目…

数据库安全+触发器与存储过程

数据库安全触发器与存储过程 目录 数据库安全触发器与存储过程选择题填空题简答题1、建立city值为上海、北京的顾客视图题目代码题解 2、建立城市为上海的客户2016年的订单信息视图题目代码题解 3、创建触发器&#xff0c;当更改商品价格(price列)时&#xff0c;记录价格题目代…

【网络安全】——区块链安全和共识机制

区块链安全和共识机制 摘要&#xff1a;区块链技术作为一种分布式去中心化的技术&#xff0c;在无需第三方的情况下&#xff0c;使得未建立信任的交易双方可以达成交易。因此&#xff0c;区块链技术近年来也在金融&#xff0c;医疗&#xff0c;能源等多个行业得到了快速发展。然…

Medical Image Analyse

NC2022: Federated learning enables big data for rare cancer boundary detection 尽管机器学习&#xff08;ML&#xff09;在各个学科领域都显示出了潜力&#xff0c;但样本外泛化仍然令人担忧。目前通过共享多个站点的数据来解决这个问题&#xff0c;但由于各种限制&#…

内网渗透之linuxwindows密码读取haschcat破解sshrdp

0x00 说明 微软为了防止明文密码泄露发布了补丁KB2871997&#xff0c;关闭了Wdigest功能。 当系统为win10或2012R2以上时&#xff0c;默认在内存缓存中禁止保存明文密码&#xff0c;此时可以通过修改注册表的方式抓取明文&#xff0c;但需要用户重新登录后才能成功抓取。 wind…

知识变现海哥:知识变现的本质就是卖

知识变现的本质就是卖&#xff0c;而有人买的本质&#xff0c;就是你解决了某方面的需求。 好的成交&#xff0c;从来都是相互的&#xff0c; 只靠一边主动推销来维系是远远不够的。 绝对不是靠忽悠&#xff0c;而是靠实力。 先讲一个故事。 19世纪时&#xff0c;一个年轻的…

IOS开发指南之UITableView控件使用

1.创建一个IOS单页应用 2.双击Main.storyboard然后拖放UITableView到视图中 3.添加TableViewCell 成功添加Table View Cell 4.修改Table View Cell属性 选中Table View Cell 在右边的Image栏输入default.png回车 到此布局设计完成,现在运行还是显示 空白,要在代码中做相关的实…

B.【机器学习实践系列二】数据挖掘-二手车价格交易预测(含EDA探索、特征工程、特征优化、模型融合等)

【机器学习入门与实践】入门必看系列&#xff0c;含数据挖掘项目实战&#xff1a;数据融合、特征优化、特征降维、探索性分析等&#xff0c;实战带你掌握机器学习数据挖掘 专栏详细介绍&#xff1a;【机器学习入门与实践】合集入门必看系列&#xff0c;含数据挖掘项目实战&…

Spellman高压电源X射线发生器维修XRB160PN480X4593

spellman高压发生器维修VMX40P5X4629&#xff1b;Spellman X射线发生器维修X4593系列 X射线源维修。 Spellman所拥有的变频器架构可以使高压电源获得高利用率的效率和功率密度。固体密封的高压模块进一步减少了尺寸和重量。 基于表面贴装控制电路的数字信号处理器提供通讯接口…

2023,谁还在花钱减肥?

【潮汐商业评论/原创】 “这是益生菌、酵素、0蔗糖酸奶&#xff0c;促进肠胃蠕动的&#xff1b;这是蒟蒻果冻、魔芋零食&#xff0c;嘴馋占嘴用的&#xff1b;这是全麦面包&#xff0c;饱腹感强&#xff0c;不易发胖&#xff1b;这是我刚办的健身卡&#xff1b;这是……”Lily…

【Qt编程之Widgets模块】-007:QTextStream类及QDataStream类

1 概述 QTextStream和QDataStream都是对流进行操作 QTextStream只能普通类型的流操作像QChar、QString、int…&#xff0c;其实就很类似我们c或者c中读写文件的感觉&#xff0c; QDataStream就厉害了&#xff0c;无论是QTextStream的普通类型的流操作还是一些特殊类型的流操作…

设计模式之【外观/门面模式】,不打开这扇门永远不知道门后有多少东西

文章目录 一、什么是外观模式&#xff08;门面模式&#xff09;1、外观模式的结构2、使用场景3、外观模式的优缺点4、外观模式注意事项 二、实例1、外观模式的通用写法2、智能家居案例3、积分换礼品案例 参考资料 一、什么是外观模式&#xff08;门面模式&#xff09; 外观模式…

yoloV5项目工程源码解读(2)(未完成)

概述 将主要从三个部分对源码进行解读。 数据层面&#xff0c;dataloader 和 数据增强网络模型&#xff0c;模型细节和逻辑模型训练&#xff0c;训练策略等 数据源解读 utils 中有&#xff0c;在train.py中能跳到该函数。 train.py中 # Trainloader 创建dataloader就是我们…

网络安全工程师辛苦吗?

“人生如寄&#xff0c;何事辛苦怨斜晖”&#xff0c;意思是人活着就像寄生在这个世界上&#xff0c;为什么一定要劳碌奔波&#xff0c;最后还抱怨人生苦短呢&#xff1f; 但说到辛苦二字&#xff0c;什么工作不辛苦呢&#xff1f;除了体制内的一些工作稍微轻松一些&#xff0c…

打家劫舍问题

题目&#xff1a; 打家劫舍https://leetcode.cn/problems/house-robber/ 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上…