【算法系列 | 3】深入解析排序算法之——选择排序

news2024/11/20 1:20:46

序言

你只管努力,其他交给时间,时间会证明一切。

文章标记颜色说明:

  • 黄色:重要标题
  • 红色:用来标记结论
  • 绿色:用来标记一级论点
  • 蓝色:用来标记二级论点

决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。

我们一起努力,成为更好的自己!

今天第3讲,讲一下排序算法的选择排序(Selection Sort)

1 基础介绍

排序算法是很常见的一类问题,主要是将一组数据按照某种规则进行排序。

以下是一些常见的排序算法:

  1. 冒泡排序(Bubble Sort)

  2. 插入排序(Insertion Sort)

  3. 选择排序(Selection Sort)

  4. 归并排序(Merge Sort)

  5. 快速排序(Quick Sort)

  6. 堆排序(Heap Sort)

一、选择排序介绍

原理介绍

选择排序(Selection Sort)是一种简单的排序算法,其基本原理是在未排序的元素中找到最小(或最大)的元素,然后将其放在已排序的序列的末尾。重复这个过程,直到所有元素都被排序完毕。

具体来说,选择排序的实现过程如下:

  1. 遍历整个待排序的数组,从第一个元素开始。
  2. 在未排序的部分中,找到最小(或最大)的元素,并将其与第一个元素交换位置。
  3. 接着从第二个元素开始,重复步骤2,直到所有元素都被排序

下面是一个示例,展示了选择排序如何对一个数组进行排序:

原始数组:[5, 1, 9, 3, 7]

第一轮排序:
未排序部分:[5, 1, 9, 3, 7]
当前最小值:1
交换位置后:[1, 5, 9, 3, 7]

第二轮排序:
未排序部分:[5, 9, 3, 7]
当前最小值:3
交换位置后:[1, 3, 9, 5, 7]

第三轮排序:
未排序部分:[9, 5, 7]
当前最小值:5
交换位置后:[1, 3, 5, 9, 7]

第四轮排序:
未排序部分:[9, 7]
当前最小值:7
交换位置后:[1, 3, 5, 7, 9]

第五轮排序:
未排序部分:[9]
当前最小值:9
交换位置后:[1, 3, 5, 7, 9]

经过五轮排序后,数组已经被排序完毕。

复杂度 

虽然选择排序的思路简单,但是它的时间复杂度为O(n^2),其中n是数组中元素的数量。

因此,对于大规模的数据集,选择排序的性能会受到很大的影响,不如其他高效的排序算法。

空间复杂度为O(1),即不需要额外的空间来存储排序结果。

在排序过程中,只需要进行元素之间的比较和交换操作,不需要使用辅助的数据结构。

因此,选择排序是一种原地排序算法,它可以在原始数组上进行排序,不需要使用额外的空间。

这也是选择排序在一些特定场景下仍然有用的原因之一。

使用场景

选择排序,由于它简单性和实现的易用性,常常被用于教学和学习排序算法的入门课程中。但是在实际应用中,由于其时间复杂度较高,选择排序并不是最优秀的排序算法

尽管如此,它仍然有一些适用场景,例如:

  1. 对于非常小的数据集,选择排序的性能可能并不比其他高效排序算法差多少。在这种情况下,选择排序的简单性和易用性可能更加重要。

  2. 在一些特定场景下,需要对数据进行部分排序或者仅需要找到最小(或最大)的k个元素。在这种情况下,可以使用选择排序的变体——选择部分排序(Select Partial Sort)算法,通过一些优化策略可以提高其性能。

  3. 由于选择排序的实现过程中只涉及到元素之间的比较和交换操作,不需要使用额外的空间,因此可以在内存受限的环境下使用。

总之,选择排序虽然并不是最优秀的排序算法,但是在一些特定场景下仍然有其适用性和价值。

二、代码实现

2.1 Python 实现

下面是使用Python实现选择排序的代码:

def selection_sort(arr):
    n = len(arr)
    for i in range(n):
        min_idx = i
        for j in range(i+1, n):
            if arr[j] < arr[min_idx]:
                min_idx = j
        arr[i], arr[min_idx] = arr[min_idx], arr[i]
    return arr

使用了Python内置的交换语法a, b = b, a来进行元素的交换,可以使代码更加简洁易读。

下面是使用Python实现选择部分排序的代码,其中k表示要找到的最小元素的个数:

def select_partial_sort(arr, k):
    n = len(arr)
    for i in range(k):
        min_idx = i
        for j in range(i+1, n):
            if arr[j] < arr[min_idx]:
                min_idx = j
        arr[i], arr[min_idx] = arr[min_idx], arr[i]
    return arr[:k]

这里的实现和普通的选择排序略有不同,每轮排序只找到一个最小元素,然后将其放在已排序部分的末尾。最终返回前k个元素即为最小的k个元素。

2.2Java实现

下面是使用Java实现选择排序的代码:

public class SelectionSortExample {
    public static void main(String[] args) {
        int[] arr = { 5, 1, 9, 3, 7 };
        selectionSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    public static void selectionSort(int[] arr) {
        int n = arr.length;
        for (int i = 0; i < n; i++) {
            int minIdx = i;
            for (int j = i + 1; j < n; j++) {
                if (arr[j] < arr[minIdx]) {
                    minIdx = j;
                }
            }
            int temp = arr[i];
            arr[i] = arr[minIdx];
            arr[minIdx] = temp;
        }
    }
}

这个代码和前面Python的实现类似,都是使用两重循环,外层循环遍历整个数组,内层循环找到未排序部分中的最小元素,并将其放在已排序部分的末尾。

这个示例中,

  1. 首先定义了一个整型数组arr
  2. 然后调用selectionSort方法对其进行排序
  3. 最后,使用Arrays.toString方法将排序结果打印出来

selectionSort方法中,实现了选择排序的核心逻辑,使用两重循环遍历数组,找到未排序部分中的最小元素,并将其交换到已排序部分的末尾。

最终,排序结果存储在原始数组中,不需要使用额外的空间。

执行该示例的输出结果为:[1, 3, 5, 7, 9],即排序后的整型数组。

图书推荐

图书列表:

  • python分布式机器学习
  • Python Web 深度学习
  • Pandas1.X 实例讲解
  • Python 从入门到精通
  • mysql 数据库基础与实战应用

 python分布式机器学习

Python Web 深度学习

 

Pandas1.X 实例讲解

Python 从入门到精通

mysql 数据库基础与实战应用

 618,清华社 IT BOOK 多得图书活动开始啦!活动时间为 2023 年 6 月 7 日至 6 月 18 日,清华社为您精选多款高分好书,涵盖了 C++、Java、Python、前端、后端、数据库、算法与机器学习等多个 IT 开发领域,适合不同层次的读者。全场 5 折,扫码领券更有优惠哦!快来京东点击链接 IT BOOK 多得,查看详情吧!

活动链接:IT BOOK

参与方式 

图书数量:本次送出 3 本   !!!⭐️⭐️⭐️
活动时间:截止到 2023-06-13 12:00:00

抽奖方式:

  • 评论区随机挑选小伙伴!

留言内容,以下方式都可以:

  • 文章高质量评论+【你想要的书名】
  • 投资自己是人一生中最重要的投资+【你想要的书名】

参与方式:关注博主、点赞、收藏,评论区留言 

中奖名单 

🍓🍓 获奖名单🍓🍓

 中奖名单:请关注博主动态

名单公布时间:2023-06-13 下午
 

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

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

相关文章

基于Hexo和Butterfly创建个人技术博客,(3) 创建博客文章及文章模板配置

Hexo官司网查看 这里 笔者个人站查看 这里 特别说明&#xff1a; hexo博客站点发布的文件全是静态文件&#xff0c;没有任何后台服务。博文的发布过程是&#xff1a;1、在本地用hexo new命令创建.md文件----2、经hexo g命令生成.html文件-----3、再通过hexo d命令发布到远程主机…

知网CN期刊《才智》简介及投稿邮箱

《才智》杂志成立于2001年&#xff0c;隶属吉林省人事厅&#xff0c;是经国家新闻出版总署批准的&#xff0c;吉林省人事系统唯一一本面向全国公开发行的杂志。是一本专业发表各类论文评定职称的省级理论性杂志。以挖掘各行各业拔尖人才、促进科教兴国、振兴人才市场为己任&…

python套接字(二):实现一个服务器和多客户端连接

文章目录 前言一、问题二、实现一个服务器连接多个客户端1、问题分析2、代码实现a、服务器端b、客户端 3、运行 前言 在上一篇博客python套接字(一)&#xff1a;socket的使用简单说明了一下套接字的使用&#xff0c;也实现了使用套接字来传输消息&#xff0c;但是也有一个问题…

深度学习应用篇-推荐系统[12]:经典模型-DeepFM模型、DSSM模型召回排序策略以及和其他模型对比

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…

JavaWeb笔记(五)

JavaWeb后端 经过前面的学习&#xff0c;现在终于可以正式进入到后端的学习当中&#xff0c;不过&#xff0c;我们还是需要再系统地讲解一下HTTP通信基础知识&#xff0c;它是我们学习JavaWeb的基础知识&#xff0c;我们之前已经学习过TCP通信&#xff0c;而HTTP实际上是基于T…

使用SonarLint在开发阶段提高代码质量

使用SonarLint在开发阶段提高代码质量 SonarLint是什么 SonarLint是一个免费的IDE插件&#xff0c;是一个代码质量工具。 它可以在我们编写代码的时候&#xff0c;就帮我我们发现问题并提醒我们。可以帮助我们养成良好的代码习惯。 它支持5000条规则&#xff0c;可以帮助我…

如何在Microsoft Excel中使用MATCH查找值的位置

当你需要在电子表格中查找值的确切位置时,可以使用 Excel 中的 MATCH 函数。这样可以避免你手动搜索可能需要参考的位置或其他公式。 MATCH 函数通常与 INDEX 函数一起用作高级查找。但在这里,我们将介绍如何单独使用 MATCH 来找到价值所在。 一、Excel中的MATCH函数是什么 …

11. Synchronized与锁升级

11.1 面试题 ● 谈谈你对Synchronized的理解 ● Sychronized的锁升级你聊聊 ● Synchronized实现原理&#xff0c;monitor对象什么时候生成的&#xff1f;知道monitor的monitorenter和monitorexit这两个是怎么保证同步的嘛&#xff1f;或者说这两个操作计算机底层是如何执行的 …

【企业业务架构】LEANIX : 业务能力

业务能力是组织执行核心功能所需的能力、材料和专业知识的表达或发声。企业架构师使用业务能力来说明业务的总体需求&#xff0c;以便更好地制定满足这些业务需求的 IT 解决方案。 目录 介绍业务能力建模您可以通过业务能力映射实现什么&#xff1f;并购管理IT风险管理创新管理…

手把手教你入门 Docker

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; &#x1f495;&#x1f495; 感兴趣的同学可以收…

DAY 76 分布式监控平台:zabbix

市场上常用的监控软件&#xff1a; 传统运维&#xff1a;zabbix、 Nagios云原生环境&#xff1a; Prometheus &#xff08;go语言开发的&#xff09; zabbix概述 作为一个运维&#xff0c;需要会使用监控系统查看服务器状态以及网站流量指标&#xff0c;利用监控系统的数据去…

国内云服务器全面对比

想要领取优惠券购买云服务可以前往我的云服务器领券购买。 经过疫情三年&#xff0c;大多行业开始复苏&#xff0c;企业开始布局以后得发展&#xff0c;云服务器作为企业发展几乎是必须的&#xff0c;一个企业从无到有&#xff0c;要经历很多&#xff0c;比如企业官网搭建&…

GaussDB云数据库SQL应用系列—索引管理

目录 一、前言 二、注意事项 三、索引创建 1、创建普通索引 2、创建唯一索引 3、创建多字段索引 4、创建部分索引 5、创建表达式索引 四、索引管理 1、查看索引信息 2、删除索引 总结 一、前言 随着互联网的快速发展&#xff0c;数据量呈现爆炸式增长。如何高效地…

PLC现场安装时需要注意的几个关键点

PLC适用于大多数工业现场&#xff0c;但它对使用场合、环境温度等还是有一定要求。控制PLC的工作环境&#xff0c;可以有效地提高它的工作效率和寿命。 在安装PLC时&#xff0c;要避开下列场所&#xff1a; 1.环境温度超过0 ~ 50℃的范围&#xff1b; 2.相对湿度超过85%或者…

Coggle 30 Days of ML 打卡任务二:苹果病害数据加载与数据增强

Coggle 30 Days of ML 打卡任务二&#xff1a;苹果病害数据加载与数据增强 任务二&#xff1a;苹果病害数据加载与数据增强 难度/分值&#xff1a;中/2 打卡内容&#xff1a; 参赛选手名称&#xff1a;AppleDoctor完成日期&#xff1a;2023.6.9任务完成情况&#xff1a; 使…

第四章 完型填空

第四章 完型填空 第一节 真题 2020-完型填空- Section I Use of English Directions&#xff1a; Read the following text. Choose the best word (s) for each numbered blank and mark A, B, C or D on the ANSWER SHEET. (10 points) Being a good parent is, of cour…

Vue中使用editor.md(1):简单使用

0. 背景 在Vue项目中添加一个markdown编辑器&#xff0c;选择使用editor.md&#xff0c;记录在Vue项目中的简单使用。 1. 环境配置 1.1 下载editor.md 官网地址&#xff1a;http://pandao.github.io/editor.md/ 项目文件解压后放入&#xff1a;public/static/内 1.2 下…

【Linux】进程间的通信之共享内存

进程间的通信之共享内存 一、system V 内存共享原理二、共享内存的使用1、ftok函数2、shmget函数3、shmat函数4、shmdt函数5、shmctl函数6、代码使用 三、一些细节的补充 一、system V 内存共享原理 利用内存共享进行进程间的通信的原理其实分为以下几个步骤&#xff1a; 在物…

chatgpt赋能python:Python如何将英文转化为中文的最佳方法

Python如何将英文转化为中文的最佳方法 介绍 在现代全球化社会中&#xff0c;国与国之间的交流越来越频繁&#xff0c;相应的语言翻译工具的需求也愈发迫切。Python是一种易于学习、快速上手的编程语言&#xff0c;适合初学者和经验丰富的程序员使用&#xff0c;在语言翻译方…

技术很牛逼,不会讲PPT,可惜了!

怎样才能做好一场技术分享呢&#xff1f;结合我的经历&#xff0c;做了一些总结。 2015年&#xff0c;我出版《技术管理之巅》以后&#xff0c;先后收到QCon、CSDN、IT168等业界知名技术大会的邀请担任分享嘉宾&#xff0c;几年下来发表了近百场技术及管理相关话题的分享&#…