【算法系列 | 3】深入解析排序算法之插入排序

news2024/11/27 9:52:34

 

序言

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

文章标记颜色说明:

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

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

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

今天第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/629096.html

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

相关文章

冒泡排序、插入排序、希尔排序、选择排序

一、排序协议的定义 在博客的开头的&#xff0c;我们先给出排序协议的定义。因为我们本篇博客含有多种排序方式&#xff0c;为了使每种排序方法对外调用方式一致&#xff0c;我们需要定义一个排序的相关协议。所有排序的相关类都必须遵循该协议&#xff0c;让此协议来定义具体…

Aiohttp异步爬取小说排行榜

Aiohttp异步爬取小说排行榜 *** Aiohttp简介及使用 *** ​ Aiohttp是Python的一个第三方网络编程模块&#xff0c; 它可以开发服务端和客户端&#xff0c;服务端也就是我们常说的网站服务器&#xff1b;客户端是访问网站的API接口&#xff0c;常用于接口测试&#xff0c;也可用…

Vue基础第七篇

一、vuex的使用 1.概念 在Vue中实现集中式状态&#xff08;数据&#xff09;管理的一个Vue插件&#xff0c;对vue应用中多个组件的共享状态进行集中式的管理&#xff08;读/写&#xff09;&#xff0c;也是一种组件间通信的方式&#xff0c;且适用于任意组件间通信。 2.何时…

MyBatis操作数据库实现

说明&#xff1a;MyBatis是作用于三层架构开发&#xff0c;数据访问层&#xff08;Data Access Object&#xff09;的框架&#xff0c;用于访问数据库&#xff0c;对数据进行操作。 一、环境搭建 首先&#xff0c;创建一个SpringBoot模块&#xff0c;然后把MyBatis的环境搭建…

华为OD机试真题 JavaScript 实现【获取字符串中连续出现次数第k多的字母的次数】【2023Q1 100分】,附详细解题思路

一、题目描述 给定一个字符串&#xff0c;只包含大写字母&#xff0c;求在包含同一字母的子串中&#xff0c;长度第 k 长的子串的长度&#xff0c;相同字母只取最长的那个子串。 二、输入描述 第一行有一个子串(1<长度<100)&#xff0c;只包含大写字母&#xff1b;第二…

GEngine一个基于WebGPU的渲染引擎

一、废话篇&#xff1a; 2019年时候就有写一个渲染引擎想法&#xff0c;一直到现在才真正意义上算给实现了当初的想法&#xff0c;写了好几个月了和小伙伴这才有个初版&#xff08;虽然里面还有一堆bug哈&#xff0c;没时间改啊&#xff09;。说在前面GEngine借鉴了其他渲染引擎…

计算机网络方面的面试题目(合集)

python面试题 1、python下多线程的限制以及多进程中传递参数的方式 python多线程有个全局解释器锁(global interpreter lock)&#xff0c;这个锁的意思是任一时间只能有一个线程使用解释器&#xff0c;跟单cpu跑多个程序一个意思&#xff0c;大家都是轮着用的&#xff0c;这叫“…

在外web浏览器远程访问jupyter notebook服务器详细教程

文章目录 前言视频教程1. Python环境安装2. Jupyter 安装3. 启动Jupyter Notebook4. 远程访问4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5. 固定公网地址 前言 Jupyter Notebook&#xff0c;它是一个交互式的数据科学和计算环境&#xff0c;支持多种编程语言&#…

利用 canvas 实现背景图片和其他图片以及文字的组合生成新图片

预览世界效果图如下&#xff1a; 注&#xff1a;以下图片中&#xff0c;二维码部分是我动态生成的&#xff0c;以及姓名和工号位置的参数需要动态替换。 实现思路&#xff1a; 利用 canvas 实现在面板上画图以及绘制文字等等。 官方文档 API 地址如下&#xff1a;canvas AP…

知道效果广告,让你的广告投入更有价值!

效果广告作为一种能直接触达用户的广告&#xff0c;在互联网上遍地开花&#xff0c;今天我们就一起来了解下效果广告吧&#xff5e; 1.背景 在传统的门户广告、搜索广告中&#xff0c;一则广告的呈现是针对其所有可覆盖的受众&#xff0c;而真正对广告信息感兴趣的人群只是广大…

代码审计 底层逻辑

红队利用中&#xff0c;主要有以下几个板块。 找到漏洞-->利用漏洞-->权限维持-->痕迹清除。找到漏洞对应的技能是代码审计。 利用漏洞对应的技能是各和实战中利用技巧绕 waf。 权限维持&#xff0c;抽象来看&#xff0c;就是系统自己启动我的恶意代码&#xff0c;实现…

ROS学习——通信机制(话题通信③—注意事项)

2.1.2 话题通信基本操作A(C) Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 043话题通信(C)4_注意事项_Chapter2-ROS通信机制_哔哩哔哩_bilibili 1. int main(int argc, char const *argv[]){} vscode 中的 main 函数 声明 int main(int argc, char const *argv…

更新Navicat Premium 16.2 之 如何使用Navicat连接Redis的新手教程

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

向clickhouse插入一段由经纬度构成的路径

目录 背景粗暴简单字符串示例 数组套数组示例 LineStringWKT来帮忙参考资料 背景 现有一条路&#xff0c;这条路由好几段路段构成&#xff0c;每个路段又由一些轨迹点先后连接而成&#xff0c;且这些轨迹点数量不固定&#xff0c;有些路段由10个轨迹点连接而成&#xff0c;有些…

13 MCMC——马尔可夫链蒙特卡洛

文章目录 13 MCMC——马尔可夫链蒙特卡洛13.1 MCMC的意义13.2 简单采样方法介绍13.2.1 概率分布采样13.2.2 Rejection Sampling——拒绝采样13.2.3 Importance Sampling——重要性采样 13.3 Markov Chain知识补充13.3.1 Markov Chain定义13.3.2 Markov Chain性质——平稳分布13…

javaScript蓝桥杯----猜硬币

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 为了打发无聊的时间&#xff0c;小蓝开发了一款人机对战的猜硬币游戏&#xff0c;页面中一共有 9 个杯子&#xff0c;系统会随机挑选 3 个杯子在里面放入硬币&#xff0c;玩家通过输入含有杯子序号的字符串进行猜选&a…

基于Python班级管理系统毕业设计-附源码171809

目 录 摘要 1 绪论 1.1研究背景 1.2研究的目的与意义 1.3系统开发技术的特色 1.4论文结构与章节安排 2 基于Python班级管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.3.2数据修改流程 2.3.3数据删除流程 2.3 系统功能分析 2.3.1 功能性…

【考点】CKA 08_Kubernetes工作负载与调度 关系调度 nodeSelector 亲和性和反亲和性 污点 节点驱离与下线

文章目录 考试题目&#xff1a;deployment 扩容&#xff08;扩容命令&#xff09;1. Kubernetes 调度器1.1 调度概览1.2 kube-scheduler1.3 kube-scheduler 调度流程 2. Kubernetes 关系调度2.1 节点标签2.2 节点隔离/限制2.3 nodeName 字段2.3.1 准备工作2.3.2 创建使用 nodeN…

深度学习-第T10周——数据增强

深度学习-第T10周——数据增强 深度学习-第T10周——数据增强一、前言二、我的环境三、前期工作1、导入数据集2、查看图片数目 四、数据预处理1、 加载数据1.1、设置图片格式1.2、划分训练集1.3、划分验证集1.4、查看标签1.5、再次检查数据1.6、配置数据集 2、数据可视化 五、数…

硬件设计电源系列文章-DCDC转换器基础知识

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 本文主要接着上篇&#xff0c;上篇文章主要讲述了LDO的相关基础知识&#xff0c;本节开始分享DCDC基础知识 整体架构流程 提示&#xff1a;这里可以添加技术整体架构 以下是…