当前位置: 首页 > news >正文

【算法】插入排序

插入排序实现思路:将一个新的数,和前面的比较,只要当前数小于前一个则和前一个交换位置,否则终止;
「时间复杂度:O(N^2);」
「空间复杂度:O(1)」

 一、标准方式

function insertSort(arr) {// 检查输入是否为数组且不为空if (!Array.isArray(arr) || arr.length <= 0) {return [];}// 定义交换函数const swap = (arr, i, j) => {const temp = arr[i];arr[i] = arr[j];arr[j] = temp;};// 插入排序for (let i = 1; i < arr.length; i++) {for (let j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) {swap(arr, j, j + 1);}}return arr;
}

插入排序的实现原理是将一个数组分为已排序区间和未排序区间,每次从未排序区间中取出一个元素,将其插入到已排序区间中的合适位置,直到未排序区间为空。具体实现过程如下:

  1. 从第一个元素开始,该元素可以认为已经被排序
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  5. 将新元素插入到该位置后
  6. 重复步骤2~5

插入排序的优点是实现简单,代码量小,适用于小规模数据的排序。缺点是时间复杂度为O(n^2),不适用于大规模数据的排序。

二、另一种实现方式

function insertSort(arr) {for (let i = 1; i < arr.length; i++) { // 从第二个元素开始遍历let j = i - 1; // 定义一个指针,指向当前元素的前一个元素const temp = arr[i]; // 将当前元素存储到temp中while (j >= 0 && arr[j] > temp) { // 如果指针没有越界并且前一个元素大于当前元素arr[j + 1] = arr[j]; // 将前一个元素向右移动一位j--; // 指针向左移动一位}arr[j + 1] = temp; // 将当前元素插入到正确的位置}return arr; // 返回排序后的数组
}

第一段代码是标准的插入排序实现,它使用一个指针j来指向当前元素的前一个元素,然后将当前元素插入到正确的位置。具体来说,它从第二个元素开始遍历,将当前元素存储到temp中,然后将指针j向左移动,直到指针越界或者前一个元素小于等于当前元素,然后将当前元素插入到j+1的位置。

第二段代码也是插入排序的实现,但是它使用了交换函数来交换元素的位置。具体来说,它从第二个元素开始遍历,然后将当前元素与前一个元素比较,如果前一个元素大于当前元素,就交换它们的位置,直到当前元素插入到正确的位置。

总的来说,这两段代码的实现思路是一样的,都是将当前元素插入到已经排好序的部分中。但是第一段代码使用了一个指针来指向当前元素的前一个元素,然后将当前元素插入到正确的位置,而第二段代码使用了交换函数来交换元素的位置。

三、测试用例

const arr1 = [3, 0, 2, 5, -1, 4, 1];
console.log(insertSort(arr1)); // [-1, 0, 1, 2, 3, 4, 5]const arr2 = [1, 2, 3, 4, 5];
console.log(insertSort(arr2)); // [1, 2, 3, 4, 5]const arr3 = [5, 4, 3, 2, 1];
console.log(insertSort(arr3)); // [1, 2, 3, 4, 5]

相关文章:

【算法】插入排序

插入排序实现思路&#xff1a;将一个新的数&#xff0c;和前面的比较&#xff0c;只要当前数小于前一个则和前一个交换位置&#xff0c;否则终止&#xff1b;「时间复杂度&#xff1a;O(N^2)&#xff1b;」「空间复杂度&#xff1a;O(1)」 一、标准方式 function insertSort(a…...

java servlet 期刊在线投稿系统jsp编程sqlserver数据库mvc模式开发计算机网页设计

一、源码特点 java servlet 期刊在线投稿系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统采用serlvetdaobean&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统 主要采用B/S模式开发。 java servlet 期刊在线…...

命名空间和程序集

目录 一、什么是命名空间 1. 命名空间的作用 2. 命名空间跨文件伸展 3.嵌套命名空间 二、using指令 1. using命名空间指令 2. using别名指令 三、程序集的结构 1. 程序集标识符 2.强命名程序集 一、什么是命名空间 1. 命名空间的作用 命名空间是共享命名空间名的一组…...

108、指针进阶

数组名是数组首元素的地址 但是有两个例外&#xff1a; 1、sizeof&#xff08;数组名&#xff09; --数组名表示整个数组&#xff0c;计算的是整个数组的大小&#xff0c;单位是 字节 byte。 2、&数组名 --数组名表示整个数组&#xff0c;取出的是整个数组的地址。 二…...

arm平台交叉编译rt-tests

如果要为ARM平台添加libnuma-dev库&#xff0c;需要在x86平台上进行交叉编译&#xff0c;生成ARM平台可用的库文件。具体步骤如下&#xff1a; 1. ARM平台的交叉编译工具链&#xff0c;例如arm-linux-gnueabihf&#xff0c;可以使用以下命令安装&#xff1a; sudo apt-get in…...

Melis4.0[D1s]:5.测试笔记 - 修改显示测试源码

文章目录1.将显示命令参数固化2.disp_mem源码阅读3.Melis子目录Makefile编写本文是下一篇文章Melis4.0[D1s]:6.mango-MQ-R基于Melis移植lvgl 的基础知识。 1.将显示命令参数固化 从上一篇文章《Melis4.0[D1s]:4.测试笔记 - 内嵌的显示命令》知道&#xff0c;只要2个命令就可以…...

yolov7目标检测:基于自定义数据集完成检测、训练、测试

文章目录 前言一、环境与文件准备1.1、环境配置1.2、源码下载1.3、权重文件下载1.4、详解源码中的文件夹与文件1.5、详解配置参数二、检测模型(detect.py)2.1、自定义检测数据准备2.2、配置参数2.2.1、方式一:打开Pycharm,进入Terminal,输入指令开始检测2.2.2、方式二:点…...

托福高频真词List13 // 附托福TPO阅读真题

目录​​​​​​​ 4.4单词 生词 熟词 4.5真题 4.4单词 生词 &#x1fad0;damagemutilatev.损害&#x1fad0;outlyingfarfar from the centeradj.偏远的&#x1fad0;posterity[pɑːˈsterəti]further generationn.后代&#x1fad0;&#x1fad0;premiseassumpti…...

动力节点王鹤SpringBoot3笔记——第八章 文章管理模块

目录 第八章 文章管理模块 8.1 配置文件 8.2 视图文件 8.3 Java代码 第八章 文章管理模块 创建新的Spring Boot项目&#xff0c;综合运用视频中的知识点&#xff0c;做一个文章管理的后台应用。 新的Spring Boot项目Lession20-BlogAdmin。Maven构建工具&#xff0c;包…...

ROS功能包|mav_control_rw(基于MPC的无人机轨迹跟踪控制)---gazebo仿真测试

ROS功能包|mav_control_rw&#xff08;基于MPC的无人机轨迹跟踪控制&#xff09;---gazebo仿真测试gazebo仿真测试gazebo仿真测试 启动gazebo并加载无人机模型 $ roslaunch rotors_gazebo mav.launch mav_name:firefly启动 linear mpc 控制器 $ roslaunch mav_linear_mpc ma…...

iOS 内存管理机制与原理

内存分区 内存一般分为五大区&#xff1a;栈区、堆区、常量区、全局区、代码区。如图 1.栈区 是由编译器自动分配并释放的&#xff0c;主要用来存储局部变量、函数的参数等&#xff0c;是一块连续的内存区域&#xff0c;遵循先进后出&#xff08;FILO&#xff09;原则。一般在…...

Linux之父:连你自己都懒得解释,那这就是一堆垃圾!

不出意外&#xff0c;Linus又开喷了&#xff0c;这次的激情开麦&#xff0c;源自一部分没有做注释的合并请求&#xff1a;Linux6.3内核收到了一部分合并请求&#xff0c;但这部分合并完全没有注释。 如果你懒得解释为什么存在一个合并&#xff0c;那这个合并从本质上来说就是错…...

二战华为成功上岸,准备了小半年,要个27k应该也算不上很高吧~

先说下我基本情况&#xff0c;本科不是计算机专业&#xff0c;现在是学通信&#xff0c;然后做图像处理&#xff0c;可能面试官看我不是科班出身没有问太多计算机相关的问题&#xff0c;因为第一次找工作&#xff0c;华为的游戏专场又是最早开始的&#xff0c;就投递了&#xf…...

全国青少年电子信息智能创新大赛(复赛)python·模拟三卷,含答案解析

目录 一、编程题 答案解析: 文档下载打印: 老子搞不懂了,答案解析,还版权问题,有毛病是不。谁在瞎投诉啊。 全国青少年电子信息智能创新大赛(复赛)python模拟三卷 一、编程题 第一题:描述 输入某学生成绩,若成绩在 85分及以上,输出“A”,若成绩在 60分到 85分之间…...

服务网关选型指南

1、为服务网关选型需要考虑哪些因素&#xff1f; 功能需求&#xff1a;您需要考虑您的服务网关需要提供哪些功能&#xff0c;例如 API 管理、请求转发、负载均衡、安全认证等。您应该选择能够满足您的需求的服务网关。 可扩展性&#xff1a;您的服务网关需要能够扩展以支持未来…...

华为OD机试-查找充电设备组合-2022Q4 A卷-Py/Java/JS

某个充电站&#xff0c;可提供n个充电设备&#xff0c;每个充电设备均有对应的输出功率。任意个充电设备组合的输出功率总和&#xff0c;均构成功率集合P的1个元素。功率集合P的最优元素&#xff0c;表示最接近充电站最大输出功率P_max的元素 输入描述 输入为3行: 第1行为充电设…...

免费好用的oa系统有哪些?盘点这几款!

免费好用的oa系统有哪些&#xff1f;盘点这几款&#xff01; 办公自动化&#xff08;OA&#xff09;&#xff0c;英文Office Automation的缩写。它可以通过特定流程或特定环节与日常事务联系在一起&#xff0c;使公文在流转、审批、发布等方面提高效率&#xff0c;实现办公管理…...

光伏发电系统模拟及其发电预测开源python工具pvlib

1. 太阳辐照量模拟 pysolar是一个用于计算太阳位置和辐照量的Python库。它是基于python语言编写的&#xff0c;可以方便地在各种python项目中使用。pysolar主要用于计算太阳的位置、太阳高度角、太阳方位角、日出和日落时间等信息。这些信息可以用于太阳能电池板和太阳能集热器…...

精彩回顾 | 2023工赋Meetup—上海站

2023工赋Meetup—上海站 2023年4月2日下午&#xff0c;在上海数字长宁体验馆举办的“价值驱动的数字化转型技术专场”Meetup圆满落幕&#xff0c;本次活动由工赋开发者社区主办&#xff0c;上海市工业互联网协会指导&#xff0c;长宁区东虹桥发展办公室和积梦智能联合主办。 …...

[oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式

utf-8 回忆上次内容 上次再次输出了大红心♥ 找到了红心对应的编码黑红梅方都对应有编码 原来的编码叫做 ascii️ \u这种新的编码方式叫unicode包括了 中日韩字符集等 各书写系统的字符集 但是有个问题 拜这个字在字节中应该是b"\x62\xdc"两个字节 该如何理解b&qu…...

Unity VR开发选无线还是有线?Oculus Quest 2串流实战对比与效率工具推荐

Unity VR开发无线与有线串流深度对比&#xff1a;Oculus Quest 2高效开发全指南 当你沉浸在Unity VR开发的世界中&#xff0c;Oculus Quest 2无疑是目前最受欢迎的测试平台之一。但每次修改代码后漫长的打包安装过程&#xff0c;是否让你在无线自由与有线稳定之间反复纠结&…...

明日方舟玩家必备:MAA助手如何帮你自动完成每日任务?

明日方舟玩家必备&#xff1a;MAA助手如何帮你自动完成每日任务&#xff1f; 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手&#xff0c;全日常一键长草&#xff01;| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: h…...

CANopen设备配置不求人:手把手教你用Python-canopen库读写EDS/DCF文件

CANopen设备配置实战指南&#xff1a;用Python-canopen库深度操作EDS/DCF文件 在工业自动化领域&#xff0c;CANopen协议因其开放性和灵活性成为设备互联的重要标准。而对象字典(Object Dictionary)作为CANopen设备的核心配置数据库&#xff0c;直接决定了设备的通信行为和功能…...

Watchify常见问题解决方案:解决监视失败的7个实用技巧

Watchify常见问题解决方案&#xff1a;解决监视失败的7个实用技巧 【免费下载链接】watchify watch mode for browserify builds 项目地址: https://gitcode.com/gh_mirrors/wa/watchify Watchify作为Browserify的监视模式工具&#xff0c;能在文件变化时自动重新构建&a…...

【信息科学与工程学】【物理/化学科学和工程技术】知识体系 第四十一篇 数据中心基础设施领域中的力学知识 01

编号:001 类别 结构力学 (静力学与动力学) 领域 计算基础设施 / 机房设施 力学模型配方 将服务器机架简化为一个底部固定、顶部自由的悬臂梁模型。在地震激励下,该模型转化为一个单自由度阻尼受迫振动系统。主要考虑水平方向的地震力作用。 数学分析 通过建立运动微分…...

DNS 泄露是什么?为什么网络环境检测时要看 DNS

很多人在检查网络环境时&#xff0c;第一反应通常是看 IP。比如 IP 显示在哪个地区、运营商是谁、是不是数据中心网络。 但实际上&#xff0c;除了 IP 之外&#xff0c;DNS 也是一个很容易被忽略的关键指标。如果 DNS 查询结果和当前网络出口不一致&#xff0c;就可能出现所谓的…...

Arm SVE2向量存储指令ST3Q/ST4Q详解与应用优化

1. SVE2向量存储指令概述在Armv9架构中&#xff0c;SVE2&#xff08;Scalable Vector Extension 2&#xff09;作为第二代可扩展向量指令集&#xff0c;引入了多项增强的向量处理能力。其中ST3Q和ST4Q指令是专门为高效存储三路和四路128位宽向量数据而设计的谓词化存储操作。这…...

Linux 进程间通信(IPC)详解:终于搞懂管道、消息队列、共享内存到底在干什么

很多人第一次学 Linux 进程间通信&#xff08;IPC&#xff09;时&#xff0c;都会有一种感觉&#xff1a;概念很多 API 很杂 学完还是不知道到底什么时候该用什么最容易出现的问题是&#xff1a;管道和消息队列有什么区别&#xff1f;为什么共享内存最快&#xff1f;信号量到底…...

别再手动发邮件了!用Power Automate为SharePoint列表搭建自动化审批流(保姆级教程)

别再手动发邮件了&#xff01;用Power Automate为SharePoint列表搭建自动化审批流&#xff08;保姆级教程&#xff09; 在快节奏的现代办公环境中&#xff0c;手动处理审批流程已成为效率的隐形杀手。想象一下&#xff1a;员工提交的请假申请需要HR手动转发邮件&#xff0c;采购…...

【免费下载】 青藏高原矢量边界数据下载

青藏高原矢量边界数据下载 【下载地址】青藏高原矢量边界数据下载 青藏高原矢量边界数据下载 项目地址: https://gitcode.com/open-source-toolkit/7d915 数据简介 本仓库提供青藏高原的矢量边界数据下载。该数据可在ARCGIS中直接导入并打开&#xff0c;附带坐标系统信…...