Java 实现插入排序:[通俗易懂的排序算法系列之三]

引言

大家好!欢迎继续关注我的排序算法系列。今天,我们要学习的是另一种非常基础且重要的排序算法——插入排序 (Insertion Sort)

插入排序的思路非常贴近我们日常整理扑克牌的方式,理解起来相对自然。虽然它在最坏情况下的效率不高,但在某些特定场景下,它的表现甚至优于一些更高级的排序算法。


什么是插入排序?

想象一下你在玩扑克牌,手里已经握着几张排好序的牌(比如按点数从小到大)。现在你从牌堆里摸了一张新牌,你会怎么做?

通常,你会从右手边(或左手边)已排序的牌开始,逐张比较新牌和手里的牌,找到新牌应该插入的位置,然后将该位置及其后面的牌向后挪动一点,腾出空位,把新牌插进去。

插入排序就是基于这个思想:

  1. 将整个数组分为两部分: 左边是“已排序”区间,右边是“未排序”区间。
  2. 初始状态: 已排序区间只包含数组的第一个元素 arr[0]
  3. 逐步扩展: 从未排序区间(从 arr[1] 开始)依次取出元素。
  4. 寻找位置并插入: 将取出的元素(我们称之为 currentnow)与已排序区间的元素从右向左逐一比较。
  5. 移动元素: 如果已排序区间的元素大于 current,则将该元素向右移动一位。
  6. 重复比较和移动: 继续向左比较和移动,直到找到一个小于或等于 current 的元素,或者到达已排序区间的开头。
  7. 插入:current 插入到最后移动元素的那个位置的后面(也就是空出来的位置)。
  8. 重复: 对未排序区间的所有元素重复步骤 3-7,直到所有元素都被插入到已排序区间中。

算法步骤详解 (以升序为例)

假设我们有数组 [5, 2, 4, 6, 1, 3]

  1. 初始: [5] | [2, 4, 6, 1, 3] ( | 分隔已排序和未排序)
  2. 处理 2 (now = 2):
    • 比较 25 -> 2 < 5 -> 移动 5 -> [_, 5] | [4, 6, 1, 3]
    • j 变为 -1,循环结束。
    • 插入 2j+1 (即 0) -> [2, 5] | [4, 6, 1, 3]
  3. 处理 4 (now = 4):
    • 比较 45 -> 4 < 5 -> 移动 5 -> [2, _, 5] | [6, 1, 3]
    • 比较 42 -> 4 >= 2 -> break 循环 (j 为 0)。
    • 插入 4j+1 (即 1) -> [2, 4, 5] | [6, 1, 3]
  4. 处理 6 (now = 6):
    • 比较 65 -> 6 >= 5 -> break 循环 (j 为 2)。
    • 插入 6j+1 (即 3) -> [2, 4, 5, 6] | [1, 3]
  5. 处理 1 (now = 1):
    • 比较 16 -> 1 < 6 -> 移动 6 -> [2, 4, 5, _, 6] | [3]
    • 比较 15 -> 1 < 5 -> 移动 5 -> [2, 4, _, 5, 6] | [3]
    • 比较 14 -> 1 < 4 -> 移动 4 -> [2, _, 4, 5, 6] | [3]
    • 比较 12 -> 1 < 2 -> 移动 2 -> [_, 2, 4, 5, 6] | [3]
    • j 变为 -1,循环结束。
    • 插入 1j+1 (即 0) -> [1, 2, 4, 5, 6] | [3]
  6. 处理 3 (now = 3):
    • 比较 36 -> 3 < 6 -> 移动 6 -> [1, 2, 4, 5, _, 6]
    • 比较 35 -> 3 < 5 -> 移动 5 -> [1, 2, 4, _, 5, 6]
    • 比较 34

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

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

相关文章

Java的spring boot项目编译成功启动报错

问题现象&#xff1a;spring boot项目&#xff0c;候删除一些无用代码后&#xff0c;build成功&#xff0c;启动时报错&#xff1a;找不到java.util.Map或者其他对象&#xff08;用Lombok注解Data&#xff09;中的字段属性找不到等错误。解答&#xff1a; 常见是Lombok版本问题…

PyTorch参数管理详解:从访问到初始化与共享

本文通过实例代码讲解如何在PyTorch中管理神经网络参数&#xff0c;包括参数访问、多种初始化方法、自定义初始化以及参数绑定技术。所有代码可直接运行&#xff0c;适合深度学习初学者进阶学习。 1. 定义网络与参数访问 1.1 定义单隐藏层多层感知机 import torch from torch…

基于springboot+vue的课程管理系统

一、系统架构 前端&#xff1a;vue | element-ui 后端&#xff1a;springboot | mybatis-plus 环境&#xff1a;jdk1.8 | mysql8 | maven | node v16.20.2 | idea 二、代码及数据 三、功能介绍 01. 登录 02. 管理员-首页 03. 管理员-系管理 04. 管理员-专业管理 05. 管…

ssh密钥连接远程服务器并用scp传输文件

ssh密钥连接远程服务器 私钥的权限必须是600chmod 600 id_rsa连接时在命令中加上私钥的地址ssh -i PATH_to_id_rsa usernameip -p port scp -P port -i PATH_to_id_rsa file usernameip:PATH

ElasticSearch迁移数据

一、查询索引 1、查询所有索引 curl --user elastic:123456 -XGET "http://localhost:19200/_cat/indices?v&sindex" 2、查询索引配置 以索引名称hello为例 curl --user elastic:123456 -XGET "http://localhost:19200/hello/_settings?pretty" 3…

【Unity】animator检测某state动画播放完毕方法

博主对动画系统很不熟&#xff0c;可能使用的方法比较曲折&#xff0c;但是我确实没找到更有效的方法了。 unity的这个animator在我看来简直有毛病啊&#xff0c;为什么那么难以获取某状态动画的信息呢&#xff1f;&#xff1f;&#xff1f; 想要知道动画播完没有只有用norma…

Jmeter 插件【性能测试监控搭建】

1. 安装Plugins Manager 1.1 下载路径&#xff1a; Install :: JMeter-Plugins.org 1.2 放在lib/ext目录下 1.3 重启Jmeter&#xff0c;会在菜单-选项下多一个 Plugins Manager菜单&#xff0c;打开即可对插件进行安装、升级。 2. 客户端(Jmeter端) 2.1 安装plugins manager…

ollama+open-webui本地部署自己的模型到d盘+两种open-webui部署方式(详细步骤+大量贴图)

一、ollama准备 1.官网下载ollama&#xff1a;https://ollama.com/download 2.在 d 盘创建 ollama 文件夹&#xff0c;把软件包放进去 3.管理员身份运行黑窗口 win r 弹出运行窗口 输入 cmd 后&#xff0c; ctrl shift 回车&#xff0c;以管理员身份打开 3.切换到 d 盘&a…

(学习总结33)Linux Ext2 文件系统与软硬链接

Linux Ext2 文件系统与软硬链接 理解硬件磁盘、服务器、机柜、机房磁盘物理结构磁盘的逻辑结构实际过程 CHS 与 LBA 地址转换 引入文件系统引入 " 块 " 概念引入 " 分区 " 概念引入 " inode " 概念 ext2 文件系统宏观认识Block Group 块组与其内…

Go语言sync.Mutex包源码解读

互斥锁sync.Mutex是在并发程序中对共享资源进行访问控制的主要手段&#xff0c;对此Go语言提供了非常简单易用的机制。sync.Mutex为结构体类型&#xff0c;对外暴露Lock()、Unlock()、TryLock()三种方法&#xff0c;分别用于阻塞加锁、解锁、非阻塞加锁操作&#xff08;加锁失败…

SQL注入流量分析

免责声明&#xff1a;本文仅作分享 ~ 目录 SQL注入流量分析 特征&#xff1a; sqlmap注入类型 漏洞环境搭建 error_sql: bool_sql: time_sql: union_sql: Stacked Queries: Inline Queries: SQL注入流量分析 https://www.freebuf.com/column/161797.html SQLMAP攻击…

Linux 时间同步工具 Chrony 简介与使用

一、Chrony 是什么&#xff1f; chrony 是一个开源的网络时间同步工具&#xff0c;主要由两个组件组成&#xff1a; chronyd&#xff1a;后台服务进程&#xff0c;负责与时间服务器交互&#xff0c;同步系统时钟。chronyc&#xff1a;命令行工具&#xff0c;用于手动查看或修…

Flutter:Flutter SDK版本控制,fvm安装使用

1、首先已经安装了Dart&#xff0c;cmd中执行 dart pub global activate fvm2、windows配置系统环境变量 fvm --version3、查看本地已安装的 Flutter 版本 fvm releases4、验证当前使用的 Flutter 版本&#xff1a; fvm flutter --version5、切换到特定版本的 Flutter fvm use …

Vue 项目中的package.json各部分的作用和用法的详细说明

1. 基本信息 {"name": "my-vue-app","version": "1.0.0","description": "A Vue.js project","author": "Your Name <your.emailexample.com>","license": "MIT"…

Linux网络编程——TCP通信的四次挥手

一、前言 上篇文章讲到了TCP通信建立连接的“三次握手”的一些细节&#xff0c;本文再对TCP通信断开连接的“四次挥手”的过程做一些分析了解。 二、TCP断开连接的“四次挥手” 我们知道TCP在建立连接的时需要“三次握手”&#xff0c;三次握手完后就可以进行通信了。而在通…

某碰瓷国赛美赛,号称第三赛事的数模竞赛

首先我非常不能理解的就是怎么好意思自称第三赛事的呢&#xff1f;下面我们进行一个简单讨论&#xff0c;当然这里不对国赛和美赛进行讨论。首先我们来明确一点&#xff0c;比赛的含金量由什么来定&#xff1f;这个可能大家的评价指标可能不唯一&#xff0c;我通过DeepSeek选取…

Redis 缓存问题:缓存雪崩、缓存击穿、缓存穿透

文章目录 缓存雪崩缓存击穿缓存穿透在实际的业务场景中,Redis 通常作为缓存和其他数据库(例如 MySQL)搭配使用,用来减轻数据库的压力。但是在使用 Redis 作为缓存数据库的过程中,可能会遇到一些常见问题,例如缓存穿透、缓存击穿和缓存雪崩等。 缓存雪崩 缓存雪崩是指缓存…

Qt 入门 4 之标准对话框

Qt 入门 4 之标准对话框 Qt提供了一些常用的对话框类型,它们全部继承自QDialog类,并增加了自己的特色功能,比如获取颜色、显示特定信息等。下面简单讲解这些对话框,可以在帮助索引中查看Standard Dialogs关键字,也可以直接索引相关类的类名。 本文将以一个新的项目为主介绍不…

买不起了,iPhone 或涨价 40% ?

周知的原因&#xff0c;新关税对 iPhone 的打击&#xff0c;可以说非常严重。 根据 Rosenblatt Securities分析师的预测&#xff0c;若苹果完全把成本转移给消费者。 iPhone 16 标配版的价格&#xff0c;可能上涨43%。 iPhone 16 标配的价格是799美元&#xff0c;上涨43%&am…

软件需求分析习题汇编

需求工程练习题 一、选择题 1. 软件需求规格说明书的内容不应包括对&#xff08; &#xff09;的描述。 A. 主要功能B. 算法的详细过程C. 用户界面及运行环境D. 软件的性能 *正确答案:*B:算法的详细过程; 2. 需求分析最终结果是产生&#xff08; &#xff09; A. 项目开发…