js的算法-插入排序(直接插入排序)

ops/2024/9/24 7:34:45/

插入排序

插入排序是一种简单直接的排序方法,其基本思想是每次将一个待排序的记录按其关键字大小插入到前面已经排好序的子序列,直到全部记录插入完成。由插入排序的思想可以引申出三个重要的排序算法: 直接插入排序、折半插入排序和希尔排序。

直接插入排序

直接插入排序是一种最直观的也是最简单的算法

基本思想

假设在排序过程中,待排序表 L【1…n】在每次排序过程中的某一时刻状态如下:
在这里插入图片描述

实现逻辑:

  1. 从第一个元素开始,暂定默认第一个元素是已经排好序的
  2. 取出下一个元素K,在已经排好序的元素序列中从后向前扫描
  3. 如果在扫描过程中,扫到一个元素大于K,那么就将该元素 移动到下一个位置
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  5. 将新元素插入到该元素后
  6. 重复步骤2~5

演示

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码展示

let ary = [3, 8, 1, 9, 4, 5, 6, 2, 7];
function insertSort(ary, length) {// 暂定第一个元素是有序的;i 从1开始for (let i = 1; i < length; i++) {let temp = ary[i];let j = i;// 在有序列表中,从后向前扫描,找到插入的位置while (j > 0 && ary[j - 1] > temp) {ary[j] = ary[j - 1];j--;}// 在j 的位置插入新的元素ary[j] = temp;console.log(JSON.stringify(ary));}return ary;
}
insertSort(ary, ary.length);

结果:

[3,8,1,9,4,5,6,2,7]
[1,3,8,9,4,5,6,2,7]
[1,3,8,9,4,5,6,2,7]
[1,3,4,8,9,5,6,2,7]
[1,3,4,5,8,9,6,2,7]
[1,3,4,5,6,8,9,2,7]
[1,2,3,4,5,6,8,9,7]
[1,2,3,4,5,6,7,8,9]

性能分析

时间复杂度空间复杂度
最好情况下:O(n);最坏情况下:O(n^2);
平均时间复杂度:O(n^2);仅使用了常数个辅助单元,所以空间复杂度为O(1)

总结

  1. 稳定性: 由于每次插入元素时总是从后向前线比较在移动,所以不会出现相同元素相对位置发生变化的情况,所以直接插入排序是一个稳定的排序方法。
  2. 适用性:直接插入排序算法使用与顺序存储和链式存储的线性表,为链表存储时,可以从前往后查找指定元素的位置。
  3. 大部分排序算法都仅适用于顺序存储的线性表

http://www.ppmy.cn/ops/14405.html

相关文章

Axios

文章目录 AxiosAxios特性安装使用方法Axios 实例拦截器取消请求响应结构错误处理在Vue中封装Axios Axios Axios 是一个基于 promise 的 HTTP 库&#xff0c;可以用在浏览器和 node.js 中。 文档&#xff1a;https://axios.nodejs.cn/ Axios特性 从浏览器中创建 XMLHttpReques…

libtorrent - 安装小记

文章目录 官方文档&#xff1a;libtorrent python binding http://libtorrent.org/python_binding.html 1、下载代码 建议使用&#xff1a; git clone --recurse-submodules https://github.com/arvidn/libtorrent.git如果在 github web 界面下载代码&#xff0c;build 的时候…

基于STM32和阿里云的智能台灯(STM32+ESP8266+MQTT+阿里云+语音模块)

一、主要完成功能 1、冷光模式和暖光模式两种灯光 主要支持冷光和暖光模式两种&#xff0c;可以通过语音模块或手机app远程切换冷暖光 2、自动模式和手动模式 主要支持手动模式和自动两种模式&#xff08;app或语音助手切换&#xff09; (1)自动模式&#xff1a;根据环境光照…

Scipy库中FIR滤波器的应用

在上一篇文章《Scipy库中IIR滤波器的应用》中&#xff0c;我们阐述了利用Scipy库进行IIR滤波器设计的一些基本做法。在这篇文章中我们将进一步总结Scipy库在FIR滤波器设计中1的应用。 1. FIR滤波器基本概念   在上篇文章中&#xff0c;我们在给出线性滤波器的差分方程喝系统…

【SAP ME 26】SAP ME创建开发组件(DC)mobile

目录 1、说明 2、创建开发组件(DC) 3、相关性 4、公共部分 5、构建

MAC 安装miniconda

Conda Conda是一个开源跨平台语言无关的包管理与环境管理系统。由“连续统分析”基于BSD许可证发布。 Conda允许用户方便地安装不同版本的二进制软件包与该计算平台需要的所有库。还允许用户在不同版本的包之间切换、从一个软件仓库下载包并安装。 Conda是用Python语言开发&am…

[Java EE] 多线程(三):线程安全问题(上)

1. 线程安全 1.1 线程安全的概念 如果多线程环境下代码运行的结果不符合我们的预期,则我们说存在线程安全问题,即程序存在bug,反之,不存在线程安全问题. 1.2 线程不安全的原因 我们下面举出一个线程不安全的例子:我们想要在两个线程中对count进行操作 public class Demo9 …

缓存神器-JetCache

序言 今天和大家聊聊阿里的一款缓存神器 JetCache。 一、缓存在开发实践中的问题 1.1 缓存方案的可扩展性问题 谈及缓存&#xff0c;其实有许多方案可供选择。例如&#xff1a;Guava Cache、Caffine、Encache、Redis 等。 这些缓存技术都能满足我们的需求&#xff0c;但现…