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

插入排序

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

直接插入排序

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

基本思想

假设在排序过程中,待排序表 L【1...n】在每次排序过程中的某一时刻状态如下:

实现逻辑:

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

演示









代码展示

bash 复制代码
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. 大部分排序算法都仅适用于顺序存储的线性表
相关推荐
拓恒技术7 小时前
无人机巡检AI算法的工程化落地:从需求到交付的5个核心环节
人工智能·算法·无人机
晨曦中的暮雨7 小时前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
怕浪猫7 小时前
Claude Code vs Codex:Computer Use 实现原理深度拆解
算法·面试·github
文丑颜不良啊8 小时前
LeetCode876~900题目解析
java·leetcode
罗西的思考9 小时前
AI 时代的 “房谋杜断”:如何培养能力、品味与判断力
人工智能·算法·机器学习
aloha_7899 小时前
Java 基础、集合、异常与 JUnit 5 速查
java·junit·sqlserver
淡海水9 小时前
07-02-源码-.NET Core GC分配路径
算法·unity·c#·.netcore·gc·1024程序员节
知守观9 小时前
设计模式实战:从真实老项目中看标准模板方法与工厂的落地
java·spring·设计模式
独隅10 小时前
Claude API 实战教程:从入门到完整项目
android·java·数据库·claude·claude code
Wang's Blog10 小时前
Java 项目实战: 交友项目 - 圈子功能实现:总结
java·开发语言·交友