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

news2024/12/23 9:31:44

在这里插入图片描述

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

文章目录

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

一、选择排序的思想

选择排序(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.coloradmin.cn/o/1796632.html

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

相关文章

快速排序(Quick Sort)(C语言) 超详细解析!!!

生活的本质是什么呢? 无非就是你要什么就不给你什么. 而生活的智慧是什么呢? 是给你什么就用好什么. ---马斯克 索引 一. 前言二. 快速排序的概念三. 快速排序的实现1. hoare2. 挖坑法3. 前后指针法 总结 正文开始 一. 前言 接上文, 前面我们了解了插入排序, 与优化版本希尔…

ssh远程管理yum源进阶

文章目录 sshNFS 共享存储服务实验yum的进阶使用Apanche做一个网页形式的源用vsftpd做一个源混合源 ssh ssh是一种安全通道协议&#xff0c;用来实现字符界面的远程登录&#xff0c;远程复制&#xff0c;远程文本传输 ssh对通信双方的数据进行了加密 用户名和密码登录 秘钥…

Mysql学习(四)——SQL通用语法之DQL

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 DQLDQL-语法基本查询条件查询聚合函数分组查询排序查询分页查询 DQL DQL数据查询语言&#xff0c;用来查询数据库中表的记录。 DQL-语法 select 字段列表 from 表…

C++ | Leetcode C++题解之第136题只出现一次的数字

题目&#xff1a; 题解&#xff1a; class Solution { public:int singleNumber(vector<int>& nums) {int ret 0;for (auto e: nums) ret ^ e;return ret;} };

图相似度j计算——SimGNN

图相似性——SimGNN 论文链接&#xff1a;个人理解&#xff1a;数据处理: feature_1 [[1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], # "A"[0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0], # "B"[0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0] # "C" 第二个循环&#xff…

Keil MDK Armcc6 总是全编译项目的问题

我碰到的问题是因为使用lib库待代替原本的源码引起的&#xff0c;把lib库去除&#xff0c;使用源码编译就不会出现全编译的问题了。但是至于一定要使用LIB库但是又不想全编译暂时不知道怎么弄&#xff0c;具体为什么会这样暂不清楚。但是可以确定的是编译器参数可能选的不对&am…

代理结算不再繁琐,Xinstall让App推广更轻松

在移动互联网时代&#xff0c;App的推广与获客已成为企业发展的重要一环。然而&#xff0c;随着推广模式的多样化&#xff0c;如何高效地管理App推广的代理结算&#xff0c;成为了许多企业面临的难题。Xinstall凭借其强大的超级渠道功能&#xff0c;为企业提供了一个完美的解决…

php实现抖音小程序支付

开发者发起下单_小程序_抖音开放平台 第一步、抖音小程序发起支付 tt.pay_小程序_抖音开放平台 前端提交订单数据到后端接口&#xff0c;然后使用 tt.pay发起支付 请求参数 属性 类型 必填 说明 order_id string 是 担保交易服务端订单号 order_token string 是 …

C语言 | Leetcode C语言题解之第136题只出现一次的数字

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> singleNumbers(vector<int>& nums) {int eor 0;for (int num:nums)eor ^ num;int rightOne eor & (~eor 1); // 提取出最右的1int onlyOne 0;for (int cur : nums) {if ((cur…

图像算法---自动对焦AF

一&#xff0c;CDAF反差对焦原理 CDAF&#xff0c;全称Contrast Detection Auto Focus&#xff0c;即反差式对焦或对比度检测自动对焦&#xff0c;是一种广泛应用于入门级数码相机和相机模块化智能手机上的自动对焦技术。以下是关于CDAF反差对焦的详细介绍&#xff1a; 工作原…

nginx动静分离和反向代理

一、动静分离 动静分离指的是将动态内容和静态内容分开处理。动态内容通常由后端应用程序生成&#xff0c;例如PHP、Python或Node.js&#xff0c;静态内容则包括图片、CSS、JavaScript等文件。 例子&#xff1a; #代理服务器一 server{listen 80;server_name www.dj.com;r…

C语言 | Leetcode C语言题解之第135题分发糖果

题目&#xff1a; 题解&#xff1a; int candy(int* ratings, int ratingsSize) {int ret 1;int inc 1, dec 0, pre 1;for (int i 1; i < ratingsSize; i) {if (ratings[i] > ratings[i - 1]) {dec 0;pre ratings[i] ratings[i - 1] ? 1 : pre 1;ret pre;inc…

ceph对象储存的使用

radosgw-admin user create --uid“user1” --display-name“user1” #创建用户 sudo apt install s3cmd cephadminceph-mgr01:~/ceph-cluster/s3$ s3cmd --configure Enter new values or accept defaults in brackets with Enter. Refer to user manual for detailed desc…

YUM安装httpd实验配置apache

实验目的及实验要求&#xff1a; 实验目的&#xff1a; 2.实验要求&#xff1a; &#xff08;1&#xff09;完成命令的编写&#xff0c;并能正确运行&#xff1b; &#xff08;2&#xff09;从中熟练掌握命令的功能及作用。 实验设备及软件&#xff1a; pc机 配置好Lin…

我们设计制造MW级水冷负载电阻器-数据中心船舶岸电发电机组测试大功率负载RLC阻感容集装箱负载

UEPR系列电阻采用先进材料制造&#xff0c;采用专利设计&#xff0c;将电阻与冷却液完全隔离&#xff0c;为水冷应用提供重量轻、体积小、超大功率的解决方案。其革命性的模块化设计意味着它们可以串联在一起&#xff0c;以满足您的电力需求。应用于发电、电力传输、电气传动等…

2024年汉字小达人活动还有4个多月开赛:来做18道历年选择题备考

根据近年的安排&#xff0c;2024年第11届汉字小达人比赛还有4个多月就启动&#xff0c;那么孩子们如何利用这段时间有条不紊地备考呢&#xff1f;我的建议是两手准备&#xff1a;①把小学1-5年级的语文课本上的知识点熟悉&#xff0c;重点是字、词、成语、古诗。②把历年真题刷…

JavaSE中的if语句、switch语句:如何控制程序流程?

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

安防监控平台智能边缘分析一体机视频监控系统室内消防通道占用检测算法

随着城市化进程的加速&#xff0c;高层建筑如雨后春笋般涌现。这些建筑的消防安全问题日益凸显&#xff0c;尤其是消防通道的占用问题。为了解决这一问题&#xff0c;智能边缘分析一体机被引入到室内消防通道占用检测中&#xff0c;以提高检测效率和准确性。本文将探讨这一技术…

ctfshow-web入门-命令执行(web30-web36)

目录 1、web30 2、web31 3、web32 4、web33 5、web34 6、web35 7、web36 命令执行&#xff0c;需要严格的过滤 1、web30 代码差不多&#xff0c;就是过滤的东西变多了&#xff1a; preg_match("/flag|system|php/i", $c) 这里不让用 system &#xff0c;我们…

RainBond 制作应用并上架【以ElasticSearch为例】

文章目录 安装 ElasticSearch 集群第 1 步:添加组件第 2 步:查看组件第 3 步:访问组件制作 ElasticSearch 组件准备工作ElasticSearch 集群原理尝试 Helm 安装 ES 集群RainBond 制作 ES 思路源代码Dockerfiledocker-entrypoint.shelasticsearch.yml制作组件第 1 步:添加组件…