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

在这里插入图片描述

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

文章目录

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

一、选择排序的思想

选择排序(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

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

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

相关文章

详解大厂实时数仓建设V4.0

一、实时数仓建设背景 1. 实时需求日趋迫切 目前各大公司的产品需求和内部决策对于数据实时性的要求越来越迫切&#xff0c;需要实时数仓的能力来赋能。传统离线数仓的数据时效性是 T1&#xff0c;调度频率以天为单位&#xff0c;无法支撑实时场景的数据需求。即使能将调度频…

参数传递和剪枝,从修剪二叉树谈起

669. 修剪二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 一、参数传递 Java中的参数传递方式只有一种&#xff0c;那就是值传递。如果我们传的是基本数据类型&#xff0c;那么函数接收到的就是该数据的副本&#xff0c;如果我们传的是对象&#xff0c;那么函数接收到的就…

【Qt知识】部分QWidget属性表格

QWidget是Qt库中所有图形用户界面组件的基类&#xff0c;它提供了大量属性以供自定义和配置控件的行为和外观。下面列出了一些主要的QWidget属性及其作用。 属性 作用 accessibleName 控件的辅助技术名称&#xff0c;用于无障碍访问。 accessibleDescription 控件的辅助技…

CSS真题合集(一)

CSS真题合集&#xff08;一&#xff09; 1. 盒子模型1.1 盒子模型的基本组成1.2 盒子模型的实际大小1.3 盒子模型的两种类型1.4 设置盒子模型1.5 弹性盒子模型 2. BFC2.1 主要用途2.2 触发BFC的方法2.2 解决外边距的塌陷问题&#xff08;垂直塌陷&#xff09; 3. 响应式布局3.1…

接口自动化框架封装思想建立(全)

httprunner框架&#xff08;上&#xff09; 一、什么是Httprunner&#xff1f; 1.httprunner是一个面向http协议的通用测试框架&#xff0c;以前比较流行的是2.X版本。 2.他的思想是只需要维护yaml/json文件就可以实现接口自动化测试&#xff0c;性能测试&#xff0c;线上监…

spring aop小记

一、aop概念 面向切面编程 参考&#xff1a;https://blog.csdn.net/lhj520cb/article/details/125820513 常用术语解释&#xff08;根据代码理解的&#xff09;&#xff1a; Aspect(切面)&#xff1a;Advice 通知(即增强)和 Pointcut 切点的结合。&#xff08;数学上可以理…

【Android面试八股文】Java异常机制中,异常Exception与错误Error区别是什么?

Java异常机制中,异常Exception与错误Error区别是什么? 这道题想考察什么? 在开发时需要时候需要自定义异常时,应该选择定义Excption还是Error? 编写的代码触发Excption或者Error分别代表什么? 考察的知识点 Java异常机制 考生应该如何回答 在Java中存在一个 Throwa…

Git - 详解 创建一个新仓库 / 推送现有文件夹 / 推送现有的 Git 仓库 到私有Gitlab

文章目录 【推送现有文件夹】详细步骤指令说明Git 全局设置设置Git全局用户名设置Git全局电子邮件地址 推送现有文件夹1. 进入现有文件夹2. 初始化Git仓库并设置初始分支为main3. 添加远程仓库4. 添加所有文件到暂存区5. 提交更改6. 推送代码到远程仓库并设置上游分支 创建一个…

ESXi内安装OpenWrt

目录 0、前言 1、环境 2、转换格式 3、创建虚拟机 4、OpenWrt设置 5、单臂流量测试 6、总结 0、前言 前几天在ESXi中先安装了PVE,然后在PVE中安装OpenWrt,没有来得及深入测试,仅仅作为安装和熟悉PVE的过程。后来转念一想为什么不在ES…

CS1061 “HtmlHelper”未包含“Partial”的定义,并且找不到可接受第一个“HtmlHelper”类型参数的可访问扩展方法“Partial”

严重性 代码 说明 项目 文件 行 禁止显示状态 错误 CS1061 “HtmlHelper”未包含“Partial”的定义&#xff0c;并且找不到可接受第一个“HtmlHelper”类型参数的可访问扩展方法“Partial”(是否缺少 using 指令或程序集引用?) 14_Views_Message_E…

找嵌入式软件工作,freertos要掌握到什么程度?

对于嵌入式软件工程师来说&#xff0c;掌握RTOS&#xff08;实时操作系统&#xff09;的程度并不是决定性因素&#xff0c;而更重要的是工程思维和解决问题的能力。我这里有一套嵌入式入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习嵌入式…

Angular封装高德地图组件实现输入框搜索,地图点击选地点

Angular封装高德地图组件实现输入框搜索,地图点击选地点(Angular17版本) 话不多说直接上代码 创建一个独立组件 html代码: <div style"position: relative;"><input #searchInput nz-input placeholder"请输入地址"/><div #mapContaine…

力扣 48.旋转图像

题目描述&#xff1a; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],…

CLion配置

下载环境&#xff1a;MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net 解压后找一个位置存放&#xff0c;一般放在和ide同一目录&#xff0c;方便查找 个人习惯配置调整&#xff1a; 项目创建 修改ide解码形式 项目右下角一般默认是utf8 文件编码改…

VS2019 QT无法打开 源 文件 “QTcpSocket“

VS2019 QT无法打开 源 文件 "QTcpSocket" QT5.15.2_msvc2019_64 严重性 代码 说明 项目 文件 行 禁止显示状态 错误(活动) E1696 无法打开 源 文件 "QTcpSocket" auto_pack_line_demo D:\vs_qt_project\auto_pack_line_de…

【区块链】truffle测试

配置区块链网络 启动Ganache软件 使用VScode打开项目的wordspace 配置对外访问的RPC接口为7545&#xff0c;配置项目的truffle-config.js实现与新建Workspace的连接。 创建项目 创建一个新的目录 mkdir MetaCoin cd MetaCoin下载metacoin盒子 truffle unbox metacoincontra…

如何减少Apache Spark日志的数量

修改log4j配置文件&#xff0c;没有就创建&#xff1a; 内容&#xff1a; # 设置日志记录器 log4j.rootCategoryWARN, console log4j.appender.consoleorg.apache.log4j.ConsoleAppender log4j.appender.console.targetSystem.err log4j.appender.console.layoutorg.apache.lo…

【栈】1096. 花括号展开 II

本文涉及知识点 栈 LeetCode 1096. 花括号展开 II 如果你熟悉 Shell 编程&#xff0c;那么一定了解过花括号展开&#xff0c;它可以用来生成任意字符串。 花括号展开的表达式可以看作一个由 花括号、逗号 和 小写英文字母 组成的字符串&#xff0c;定义下面几条语法规则&…

Python | Leetcode Python题解之第135题分发糖果

题目&#xff1a; 题解&#xff1a; class Solution:def candy(self, ratings: List[int]) -> int:n len(ratings)ret 1inc, dec, pre 1, 0, 1for i in range(1, n):if ratings[i] > ratings[i - 1]:dec 0pre (1 if ratings[i] ratings[i - 1] else pre 1)ret p…

通过 AI Edge Torch 生成式 API 在设备上使用自定义大语言模型

作者 / 首席工程师 Cormac Brick&#xff0c;软件工程师 Haoliang Zhang 我们很高兴地发布 AI Edge Torch 生成式 API&#xff0c;它能将开发者用 PyTorch 编写的高性能大语言模型 (LLM) 部署至 TensorFlow Lite (TFLite) 运行时&#xff0c;从而无缝地将新的设备端生成式 AI 模…