当前位置: 首页 > 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…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

论文阅读:Matting by Generation

今天介绍一篇关于 matting 抠图的文章&#xff0c;抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法&#xff0c;已经有很多的工作和这个任务相关。这两年 diffusion 模型很火&#xff0c;大家又开始用 diffusion 模型做各种 CV 任务了&am…...

JS红宝书笔记 - 3.3 变量

要定义变量&#xff0c;可以使用var操作符&#xff0c;后跟变量名 ES实现变量初始化&#xff0c;因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符&#xff0c;可以创建一个全局变量 如果需要定义…...