排序算法:插入排序

        插入排序的思想非常简单,生活中有一个很常见的场景:在打扑克牌时,我们一边抓牌一边给扑克牌排序,每次摸一张牌,就将它插入手上已有的牌中合适的位置,逐渐完成整个排序。

        插入排序有两种写法:

  • 交换法:在新数字插入过程中,不断与前面的数字交换,直到找到自己合适的位置。
  • 移动法:在新数字插入过程中,与前面的数字不断比较,前面的数字不断向后挪出位置,当新数字找到自己的位置后,插入一次即可。

交换法插入排序

public static void insertSort(int[] arr) {// 从第二个数开始,往前插入数字for (int i = 1; i < arr.length; i++) {// j 记录当前数字下标int j = i;// 当前数字比前一个数字小,则将当前数字与前一个数字交换while (j >= 1 && arr[j] < arr[j - 1]) {swap(arr, j, j - 1);// 更新当前数字下标j--;}}
}
private static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;
}

        当数字少于两个时,不存在排序问题,当然也不需要插入,所以我们直接从第二个数字开始往前插入。

        整个过程就像是已经有一些数字坐成了一排,这时一个新的数字要加入,这个新加入的数字原本坐在这一排数字的最后一位,然后它不断地与前面的数字比较,如果前面的数字比它大,它就和前面的数字交换位置。

移动法插入排序

        我们发现,在交换法插入排序中,每次交换数字时,swap 函数都会进行三次赋值操作。但实际上,新插入的这个数字并不一定适合与它交换的数字所在的位置。也就是说,它刚换到新的位置上不久,下一次比较后,如果又需要交换,它马上又会被换到前一个数字的位置。

        由此,我们可以想到一种优化方案:让新插入的数字先进行比较,前面比它大的数字不断向后移动,直到找到适合这个新数字的位置后,新数字只做一次插入操作即可。

        这种方案我们需要把新插入的数字暂存起来,代码如下:

public static void insertSort(int[] arr) {// 从第二个数开始,往前插入数字for (int i = 1; i < arr.length; i++) {int currentNumber = arr[i];int j = i - 1;// 寻找插入位置的过程中,不断地将比 currentNumber 大的数字向后挪while (j >= 0 && currentNumber < arr[j]) {arr[j + 1] = arr[j];j--;}// 两种情况会跳出循环:1. 遇到一个小于或等于 currentNumber 的数字,跳出循环,currentNumber 就坐到它后面。// 2. 已经走到数列头部,仍然没有遇到小于或等于 currentNumber 的数字,也会跳出循环,此时 j 等于 -1,currentNumber 就坐到数列头部。arr[j + 1] = currentNumber;}
}

        整个过程就像是已经有一些数字坐成了一排,这时一个新的数字要加入,所以这一排数字不断地向后腾出位置,当新的数字找到自己合适的位置后,就可以直接坐下了。重复此过程,直到排序结束。

时间复杂度 & 空间复杂度

插入排序过程需要两层循环,时间复杂度为O(n²);只需要常量级的临时变量,空间复杂度为 O(1)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/47130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL——基础——内连接

一、内连接查询语法 隐式内连接 SELECT 字段列表 FROM 表1&#xff0c;表2 WHERE 条件...; 显示内连接 SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件...; 内连接查询的是两张表交集的部分 二、内连接演示 1.查询每一个员工的姓名&#xff0c;及关联的部门的名称…

mysql 数据库定义语言(DDL)

目录 库的操作 数据库创建 数据库编码集 数据库删除 数据库修改 数据库查询 数据库备份 表的操作 表的创建 查询表 删除表 修改表 库的操作 这里先声明一下&#xff0c;这篇文章主要是讲数据库表的定义操作&#xff0c;也就是 DDL&#xff0c;只要是对数据库以及表…

【Leetcode】116.填充每个节点的下一个右侧节点指针

一、题目 1、题目描述 给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下: struct Node {int val;Node *left;Node *right;Node *next; }填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则…

Linux学习之ftp安装、vsftpd安装和使用

ftp需要两个端口&#xff1a; 数据端口 命令端口 ftp有两种模式&#xff1a; 被动模式&#xff1a;建立命令连接之后&#xff0c;服务器等待客户端发起请求。 主动模式&#xff1a;建立命令连接之后&#xff0c;服务器主动向客户端发起数据连接&#xff0c;因为客户端可能有防火…

Java中的装箱和拆箱以及经典的面试题:1.三元运行符是一个整体,精度自动转换,if_else是单独的。2.自动装箱和拆箱的底层源码

1.在JDK1.5之前是手动装箱和手动拆箱的 手动装箱的2种实现方式&#xff1a; &#xff08;1&#xff09;Integer.valueOf(n) &#xff08;2&#xff09;new Integer(n) 手动拆箱的实现方法&#xff1a;integer.intValue() 2.在JDK1.5以后(包含1.5)是自动装箱和自动拆箱的 自动装…

12312321312

目录 层次分析法(AHP) 基本步骤 建立层次模型 构造判断矩阵 一致性检验 求得权重 填表得结果 一点补充 详细做法补充 特征向量含义思考 一些问题 优劣解距离法(TOPSIS) 基本思想 模型步骤 数据处理 指标正向化 标准化处理 计算得分 *结果处理 熵权法 模型思…

Flask入门一 ——虚拟环境及Flask安装

Flask入门一 ——虚拟环境及Flask安装 在大多数标准中&#xff0c;Flask都算是小型框架&#xff0c;小到可以称为“微框架”&#xff0c;但是并不意味着他比其他框架功能少。Flask自开发伊始就被设计为可扩展的框架。Flask具有一个包含基本服务的强健核心&#xff0c;其他功能…

STM32::关于项目启动的一些问题

一、概述&#xff1a; 启动文件就做了如下的几个主要功能 This module performs: - Set the initial SP //设置初始化堆栈空间 - Set the initial PC Reset_Handler //设置PC指针 - Set the vector table entries with the exceptions ISR address …

【Django】Task4 序列化及其高级使用、ModelViewSet

【Django】Task4 序列化及其高级使用、ModelViewSet Task4主要了解序列化及掌握其高级使用&#xff0c;了解ModelViewSet的作用&#xff0c;ModelViewSet 是 Django REST framework&#xff08;DRF&#xff09;中的一个视图集类&#xff0c;用于快速创建处理模型数据的 API 视…

你更喜欢哪一个:VueJS 还是 ReactJS?

观点列表&#xff1a; 1、如果你想在 HTML 中使用 JS&#xff0c;请使用 Vue&#xff1b; 如果你想在 JS 中使用 HTML&#xff0c;请使用 React。 当然&#xff0c;如果您希望在 JS 中使用 HTML&#xff0c;请将 Vue 与 JSX 结合使用。 2、Svelte&#xff1a;我喜欢它&#…

设计模式——合成复用原则

文章目录 合成复用原则设计原则核心思想合成案例聚合案例继承案例优缺点 合成复用原则 原则是尽量使用合成/聚合的方式&#xff0c;而不是使用继承 设计原则核心思想 找出应用中可能需要变化之处&#xff0c;把它们独立出来&#xff0c;不要和那些不需要变化的代码混在一起。…

数据仓库一分钟

数据分层 一、数据运营层&#xff1a;ODS&#xff08;Operational Data Store&#xff09; “面向主题的”数据运营层&#xff0c;也叫ODS层&#xff0c;是最接近数据源中数据的一层&#xff0c;数据源中的数据&#xff0c;经过抽取、洗净、传输&#xff0c;也就说传说中的 ETL…

华为OD-移掉K位数字

题目描述 给定一个以字符串表示的数字 num 和一个数字 k &#xff0c;从 num 中移除 k 位数字&#xff0c;使得剩下的数字最小。如果可以删除全部数字&#xff0c;则结果为 0。 1.num仅有数字组成 2.num是合法的数字&#xff0c;不含前导0 3.删除之后的num&#xff0c;请去…

数据库实体ER图

Entity Relationship Diagram Symbols | ERD Symbols and Meanings | Data structure diagram with ConceptDraw DIAGRAM | Erd Database Arrow Types

43.227.198.x怎么检查服务器里是否中毒情况?

要检查43.227.198.1服务器是否中毒&#xff0c;可以执行以下步骤&#xff1a; 运行杀毒软件&#xff1a;运行已安装的杀毒软件进行全盘扫描&#xff0c;查看是否有病毒或恶意软件。如果发现病毒或恶意软件&#xff0c;立即将其删除或隔离。 检查系统文件&#xff1a;检查服务器…

电信不提供公网IP怎么解决?快解析内网穿透解决方案

由于现在电信运营商的政策调整&#xff0c;加上受到网络服务架构的影响&#xff0c;一些用户在使用宽带连接时&#xff0c;往往会遇到电信不提供公网IP的情况。这种情况下&#xff0c;我们可能会受到一些限制&#xff0c;特别是对于需要对外提供服务或进行远程访问的场景而言&a…

使用ChatGPT-4优化编程效率:高效查询代码示例和解决方案

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Linux下的thundersvm的安装经验

之前写过一篇文章是关于windows下安装thundersvm的。当初在linux下安装thundersvm很容易&#xff0c;因为我的CUDA正好是9.0版本。所以一句命令 pip install thundersvm 即可安装。 但如果CUDA版本不是9.0&#xff0c;安装就比较麻烦。本文记录的是一种可行的方法&#xff0c;但…

封装axios及简单应用举例

第一步&#xff1a;具体封装工具&#xff1a; 在项目根目录下创建utils目录&#xff0c;然后在其中创建文件http.js&#xff1a; // 二次封装axios import axios from axios// 全局配置 // 根据环境变量区分接口默认地址&#xff08;前缀&#xff09; switch (process.env.NO…

LVS+Keepalived 实验

Keepalived 是什么 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案&#xff0c;可以解决静态路由出现的单点故障问题的一款检查工具 在一个LVS服务集群中通常有主服务器&#xff08;MASTER&#xff09;和备份服务器&#xff08;BACKUP&#xff09;两种角色的服务器…