排序算法---插入排序

news/2025/2/15 20:54:04/

1. 基本思想

从待排序列的第二个元素开始,与前面已排序的每个元素进行比较,若大(或小)则交换两元素,直到待排元素到达正确位置为止

下面以摸扑克牌为例,我们希望摸到的牌最终在手中是有序的,假设我们将小牌排在左边,大的牌排在右边

(1)第一次我摸到的数字是5, 此时手里只有一张牌,不存在先后顺序问题

(2)之后又摸到了一张3,此时与前面的5比较一下,发现3比5小,于是将3和5交换一下位置,手里的牌变成了 [3, 5]

(3)之后又摸了一张4,手里的牌是 [3, 5, 4], 先让4与前面的5比较,发现比5小,于是交换,变成[3, 4, 5], 再让4与3比较,发现不比3大,不需要交换

(4)继续摸牌,摸到的是4, 手中的牌变成了[3, 4, 5, 4], 先让4与前面的5进行比较,5大于4需要交换,变成了[3, 4, 4, 5], 4再与前面的4进行比较,发现不比前面的4大,于是不需要交换

(5)最后摸到一张6,手中的牌变成了[3, 4, 4, 5, 6], 6先于前面的5进行比较,发现比5大,不需要交换。

最终手里的牌是 [3, 4, 4, 5, 6]

 

2. 代码实现

    <script>let arr = [5, 3, 4, 4, 6];let len = arr.length;function InsertSort() {for (let i=0; i<len; i++) {  for (let j=i; j>0; j--) {  // 向前遍历 比较if (arr[j] < arr[j-1]) {let temp = arr[j];arr[j] = arr[j-1];arr[j-1] = temp;}else {break;  // 当前元素不比前一个元素小,直接跳出内层循环}}}console.log(arr)}InsertSort();</script>

 

 

3. 复杂度分析

1. 时间复杂度:找出执行次数最多的语句即可

if (arr[j] < arr[j-1]) {let temp = arr[j];arr[j] = arr[j-1];arr[j-1] = temp;
}

=> 对于第一个元素:需要比较0次

     对于第二个元素:需要比较1次

    ......

    对于第n个元素:需要比较n-1次

=>所以 0+1+2+...+(n-1) = (n^2)/2 - n/2

=> 去掉系数、低阶和常量  

=> 则时间复杂度为  O(n^2)

 2. 空间复杂度: 插入排序中并没有用到额外的空间,所以空间复杂度为 O(1)

3. 插入排序是稳定的排序算法:从上述的摸扑克牌案例中可以看出,有两个4,然而后摸的4仍就排在先摸的4的后面

 


http://www.ppmy.cn/news/1266914.html

相关文章

JVM学习笔记-如何在IDEA打印JVM的GC日志信息

若要在Idea上打印JVM相应GC日志&#xff0c;其实只需在Run/Debug Configurations上进行设置即可。 拿《深入Java虚拟机》书中的3-7代码例子来演示&#xff0c;如 1 public class JvmTest {2 private static final int _1MB1024*1024;3 public static void main(String…

云服务器Centos中安装Docker

云服务器Centos中安装Docker 1 简介DockerCentosCentos和Ubuntu区别 2 安装3 测试hello-world的镜像测试 1 简介 Docker Docker是一个开源的应用容器引擎&#xff0c;利用操作系统本身已有的机制和特性&#xff0c;可以实现远超传统虚拟机的轻量级虚拟化。它支持将软件编译成…

Spark-Streaming+Kafka+mysql实战示例

文章目录 前言一、简介1. Spark-Streaming简介2. Kafka简介二、实战演练1. MySQL数据库部分2. 导入依赖3. 编写实体类代码4. 编写kafka主题管理代码5. 编写kafka生产者代码6. 编写Spark-Streaming代码总结前言 本文将介绍一个使用Spark Streaming和Kafka进行实时数据处理的示例…

040.Python面向对象_设计原则

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

Javascript的基本语法(规范)

JS的基本语法规范 1.JS中严格区分大小写 2.JS中每一个指令被称为一个语句&#xff0c;每一个语句都应该以分号结尾 - 在JS中有自动的添加分号的机制&#xff0c;如果不写分号浏览器会自动为你添加 - 有些情况下&#xff0c;浏览器可能会给你加错了&#xff08;几率低&#…

android项目实战之使用框架 集成多图片、视频的上传

效果图 实现方式&#xff0c;本功能使用PictureSelector 第三方库 。作者项目地址&#xff1a;https://github.com/LuckSiege/PictureSelector 1. builder.gradle 增加 implementation io.github.lucksiege:pictureselector:v3.11.1implementation com.tbruyelle.rxpermissio…

【BI】FineBI功能学习路径-20231211

FineBI功能学习路径 https://help.fanruan.com/finebi/doc-view-1757.html 编辑数据概述 1.1 调整数据结构 1.2 简化数据 2.1上下合并 2.2其他表添加列 2.3左右合并 新增分析指标 函数参考 https://help.fanruan.com/finereport/doc-view-1897.html 数值函数 日期函数 文…

11K+ Star!图解计算机网络、操作系统、计算机组成、数据库!

大家好&#xff0c;我是 Java陈序员。 俗话说得好&#xff0c;面试造火箭&#xff0c;入职拧螺丝。我们在工作中&#xff0c;其实很少用到一些计算机底层知识&#xff0c;往往只要编码完事。但是&#xff0c;知其然还要知其所以然&#xff0c;我们不仅要做一个合格的“CV 工程…