排序小白必读:掌握插入排序的基本原理
一、插入排序是什么?
它是一种简单直观的排序算法。类似于整理扑克牌,想象你手上有一堆未排序的牌,你将它们逐个插入已排序的牌堆中的正确位置。拿起一张牌,与已排序的牌进行比较,将它插入到合适的位置。重复这个过程,直到所有牌都插入到正确的位置。这样,你逐步将牌从小到大有序排列起来。插入排序适用于小规模数据或部分有序的情况。
二、原理
算法步骤:
- 从第一个元素开始,认为该元素已经是一个有序序列。
- 取出下一个元素,在已排序的序列中从后向前遍历。
- 如果已排序的元素大于新元素,将已排序元素向右移动一个位置,直到找到小于或等于新元素的位置。
- 将新元素插入到找到的位置。
- 重复步骤2-4,直到所有元素都被插入到正确的位置。
下面是一个示例,说明了插入排序如何对数组 [7, 2, 4, 1, 5] 进行排序:
初始序列: [7, 2, 4, 1, 5]
- 第一轮迭代:已排序序列为 [7],将下一个元素 2 插入到正确的位置,得到 [2, 7, 4, 1, 5]。
- 第二轮迭代:已排序序列为 [2, 7],将下一个元素 4 插入到正确的位置,得到 [2, 4, 7, 1, 5]。
- 第三轮迭代:已排序序列为 [2, 4, 7],将下一个元素 1 插入到正确的位置,得到 [1, 2, 4, 7, 5]。
- 第四轮迭代:已排序序列为 [1, 2, 4, 7],将下一个元素 5 插入到正确的位置,得到 [1, 2, 4, 5, 7]。
最终排序结果为 [1, 2, 4, 5, 7]。
时间复杂度:
插入排序的平均时间复杂度为 O(n^2),其中 n 是要排序的元素个数。最好情况下,如果输入序列已经有序,时间复杂度可以达到 O(n)。但是,最坏情况下,如果输入序列是逆序的,时间复杂度将达到 O(n^2)。插入排序对于小规模的数据集或基本有序的数据集是一种简单且高效的排序算法。
空间复杂度:
插入排序的空间复杂度为 O(1),它在原地进行排序,只需要少量的额外空间用于存储临时变量。
三、生活中的应用
- 整理书架:当你整理书架上的图书时,你可能希望按照作者的姓氏或书名的字母顺序对它们进行排序。你可以将每本新书插入到已经按顺序排列的书堆中的正确位置,从而完成整理工作。
- 安排日程:当你有很多待办事项或约会时,你可以使用插入排序的思想来安排它们的顺序。你可以根据优先级或时间的顺序,逐个将待办事项插入到已经安排好的日程中的正确位置。
- 积木排序:有一堆不同大小的积木,你想要将它们按照从小到大的顺序排列。你先拿起一块放在最前面,再拿起第二块,并跟第一块做比较,如果比第一块小,那就放左边,如果比第一块放右边,你再拿起第三块积木,重复前面的过程,根据比较大小的方式,将其放在合适的位置,以此类推,就可以将一堆积木从小到达进行排序。
用一句话总结插入排序
插入排序是一种通过逐个比较和插入元素的方法,将数据按照一定顺序逐步排列的排序算法。
四、考考你
- 你正在整理一堆杂乱的照片,希望按照拍摄日期将它们有序地放入相册中,你会如何运用插入排序的思想?
- 假设你有一箱各式各样的食材,你想要按照保质期的先后顺序进行整理,你会如何使用插入排序的思想将它们有序地放置?
- 你正在准备一个晚会的座位安排,来宾们的姓名按照字母顺序已经排好,现在有一个新的来宾需要加入,请问你将如何使用插入排序的思想来安排他的座位?
- 你正在整理书籍,希望按照作者的姓氏将它们放入书架上的正确位置,你会如何应用插入排序的思想?
- 假设你有一堆不同尺寸的衣服需要整理,你打算使用插入排序的思想将它们按照尺寸从小到大排列,该如何操作?
你在生活中有什么地方用到插入排序吗?欢迎你把你的故事分享出来。
相关文章:
排序小白必读:掌握插入排序的基本原理
一、插入排序是什么? 它是一种简单直观的排序算法。类似于整理扑克牌,想象你手上有一堆未排序的牌,你将它们逐个插入已排序的牌堆中的正确位置。拿起一张牌,与已排序的牌进行比较,将它插入到合适的位置。重复这个过程…...
html常见兼容性问题
1. png24位的图片在iE6浏览器上出现背景 解决方案:做成PNG8,也可以引用一段脚本处理. 2. 浏览器默认的margin和padding不同 解决方案:加一个全局的 *{margin:0;padding:0;} 来统一。 3. IE6双边距bug:在IE6下,如果对…...
Docker实战:docker compose 搭建Redis
1、配置文件准备 redis 配置文件:https://pan.baidu.com/s/1YreI9_1BMh8XRyyV9BH08g2、创建目录并赋权 mkdir -p /home/docker/redis/data /home/redis/logs /home/redis/conf chmod -R 777 /home/docker/redis/data* chmod -R 777 /home/docker/redis/logs*3、re…...
Debian11 Crontab
Crontab用户命令 可执行文件 crontab命令的可执行文件在哪儿? $ which -a crontab /usr/bin/crontab /bin/crontabcrontab命令的可执行文件有2个:/usr/bin/crontab 和 /bin/crontab $ diff /usr/bin/crontab /bin/crontab $diff 发现这两个文件并无区…...
css 文字排版-平铺
序: 1、表格的宽度要有!!!!! 2、容器不能是display:inline 3、扩展---》node全栈框架 代码 text-align-last: justify; width: 70px; display: inline-block; 主要是用于表单左侧文字排序!...
把握潮流:服装定制小程序的发展与趋势
随着互联网的快速发展,小程序成为了人们生活中不可或缺的一部分。尤其在服装行业,定制化已经成为了一种趋势。为了满足消费者个性化的需求,服装定制小程序应运而生。 为了方便开发者的设计和制作,我们可以使用第三方的制作平台来创…...
Go 安装配置
介绍Ubuntu20.04 安装和配置Go 可以参考官网的这个为 Go 开发配置Visual Studio Code - Go on Azure | Microsoft Learn 1.安装Go 去这个地方下载Go https://go.dev/doc/install 如果之前安装过,可以参考这个(没有可以忽略) 下载完成后执…...
镜像底层原理详解和基于Docker file创建镜像
目录 一、镜像底层原理 1.联合文件系统(UnionFS) 2.镜像加载原理 3.为什么Docker里的centos的大小才200M? 二、Dockerfile 1.简介 2.Dockerfile操作常用命令 (1)FORM 镜像 (2)MAINTAINER 维护人信息 (3&…...
k8s扩缩容与滚动更新
使用kubectl run创建应用 kubectl run kubernetes-bootcamp \> --imagedocker.io/jocatalin/kubernetes-bootcamp:v1 \> --port8080 端口暴露出去 kubectl expose pod kubernetes-bootcamp --type"NodePort" --port 8080 使用kubectl create创建应用 kubect…...
4.小程序的运行机制
启动过程 把小程序的代码包下载到本地解析app.json全局配置文件执行app.js小程序入口文件,调用App()创建小程序的实例渲染小程序首页小程序启动完成 页面渲染过程 加载解析页面的.json配置文件加载页面.wxml模板和.scss样式执行页面的.ts文件,调用Pag…...
基于 Vercel TiDB Serverless 的 chatbot
作者: shiyuhang0 原文来源: https://tidb.net/blog/7b5fcdc9 # 前言 TiDB Serverless 去年就有和 Vercel 的集成了,同时还有一个 bookstore template 方便大家体验。但个人感觉 bookstore 不够炫酷,借 2023 TiDB hackthon 的…...
Android 多渠道打包及VasDolly使用
目录 1.添加productFlavors的配置buildConfigFieldmanifestPlaceholdersresValue 2.设置apk文件的名称,便于识别3.添加vasdolly、添加gradle脚本(windows) 作用:一次性可以打多个apk包,名字、包名、logo等可以不相同。…...
LeetCode 42题:接雨水
题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,…...
spring boot 提示:程序包不存在,解决方法总结
背景: 之前出现过这样的问题,打包安装父项目就好了,今天改了一下代码,重新编译的时候,又出现了这样的情况,决定深度挖掘一下这里面的问题 spring boot 提示:程序包不存在,解决方法总…...
docker项目实战
1、使用mysql:5.6和 owncloud 镜像,构建一个个人网盘 1)拉取mysql:5.6和owncloud镜像 [rootmaster ~]# docker pull mysql:5.6 5.6: Pulling from library/mysql 35b2232c987e: Pull complete fc55c00e48f2: Pull complete 0030405130e3: Pull compl…...
银行客户关系管理系统springboot财务金融进销存java jsp源代码
本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 银行客户关系管理系统springboot 系统有1权限&#x…...
Maven 插件 maven-antrun-plugin 执行 ant 脚本
Ant 相信大家都不陌生,你可以把它理解为使用 xml 格式描述的一系列命令处理工具。它是一种基于Java的build工具。理论上来说,它有些类似于(Unix)C中的make、有些类似于基于shell命令编写的sh脚本文件。Ant 用 Java 的类来扩展。&a…...
【仿写框架之仿写Tomact】四、封装HttpRequest对象(属性映射http请求报文)、HttpResponse对象(属性映射http响应报文)
文章目录 1、创建HttpRequest对象2、创建HttpResponse对象 1、创建HttpRequest对象 HttpRequest对象中的属性与HTTP协议中的内容对应,用于后序servlet从request中获取请求中的参数。 参照http请求报文: import java.io.BufferedReader; import java…...
LeetCode 41题:缺失的第一个正数
目录 题目 思路 代码 题目 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1: 输入:nums [1,2,0] 输出:3示例 2ÿ…...
学单片机有什么用?
单片机简而言之就是一个小计算机系统,它已经应用到了我们生活中的方方面面。单片机比专用处理器适合应用于嵌入式系统,因此它得到了多的应用,事实上单片机是世界上数量多的计算机。 现代人类生活中所用的几乎每件电子和机械产品中都会集成有单…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...
WEB3全栈开发——面试专业技能点P4数据库
一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库,基于 mysql 库改进而来,具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点: 支持 Promise / async-await…...
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章 摘要: 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言,受限于 C 语言本身的内存安全和并发安全问题,开发复杂模块极易引入难以…...
DAY 45 超大力王爱学Python
来自超大力王的友情提示:在用tensordoard的时候一定一定要用绝对位置,例如:tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾: tensorboard的发展历史和原理tens…...
Netty自定义协议解析
目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...
PostgreSQL 与 SQL 基础:为 Fast API 打下数据基础
在构建任何动态、数据驱动的Web API时,一个稳定高效的数据存储方案是不可或缺的。对于使用Python FastAPI的开发者来说,深入理解关系型数据库的工作原理、掌握SQL这门与数据库“对话”的语言,以及学会如何在Python中操作数据库,是…...
