目录

1、插入排序

2、流程介绍

3、java实现

4、性能介绍


前言

        在 Java 中, 冒泡排序(Bubble Sort) 和 选择排序(Selection Sort) 之后,下一个性能更好的排序算法通常是 插入排序(Insertion Sort)

        虽然它们的时间复杂度都是 O(n²),但在实际应用中,插入排序通常比选择排序和冒泡排序更快,尤其是在处理部分有序数据时表现更优。

总结:Java 排序算法进阶路线

  1. O(n²) 算法(适合学习原理)

    • 冒泡排序(最慢)→ 选择排序 → 插入排序(推荐先学)

  2. O(n log n) 算法(实际应用)

    • 归并排序(稳定)→ 快速排序(最快,但不稳定)→ 堆排序(空间省)

  3. Java 内置排序

    • Arrays.sort():对基本类型用 快速排序,对象类型用 归并排序(保证稳定性)。


1、插入排序

Insertion Sort:插入排序是一种简单直观的排序算法,适合小规模数据部分有序数据

1、核心思想

        将数组分为 已排序 和 未排序 两部分,逐个将未排序部分的元素插入到已排序部分的正确位置。

2、适合场景

小规模数据或基本有序的数据(如日志按时间插入)。

3、时间复杂度:

最坏情况下为O(N*N),此时待排序列为逆序,或者说接近逆序。
最好情况下为O(N),此时待排序列为升序,或者说接近升序。

4、空间复杂度:O(1)。


2、流程介绍

如下图所示:

步骤:

1.从第一个元素开始,该元素可以认为已经被排序.
2.取下一个元素tem,从已排序的元素序列从后往前扫描.
3.如果该元素大于tem,则将该元素移到下一位.
4.重复步骤3,直到找到已排序元素中小于等于tem的元素.
5.tem插入到该元素的后面,如果已排序所有元素都大于tem,则将tem插入到下标为0的位置.
6.重复步骤2~5.


3、java实现

代码示例如下:

public class InsertionSort {/*** 插入排序(升序)* @param arr 待排序数组*/public static void insertionSort(int[] arr) {if (arr == null || arr.length <= 1) {return; // 边界条件:数组为空或长度≤1时无需排序}// 从第二个元素开始(下标1),默认第一个元素已排序for (int i = 1; i < arr.length; i++) {int current = arr[i]; // 当前待插入的元素int j = i - 1;       // 已排序部分的最后一个元素下标// 从后往前遍历已排序部分,寻找插入位置while (j >= 0 && arr[j] > current) {arr[j + 1] = arr[j]; // 比 current 大的元素向后移动j--;}// 插入 current 到正确位置arr[j + 1] = current;}}public static void main(String[] args) {int[] arr = {12, 11, 13, 5, 6};System.out.println("排序前: " + Arrays.toString(arr));insertionSort(arr);System.out.println("排序后: " + Arrays.toString(arr));}
}

输出:

排序前: [12, 11, 13, 5, 6]
排序后: [5, 6, 11, 12, 13]

关键步骤解析

  1. 外层循环

    • 从 i = 1 开始(默认 arr[0] 是已排序部分)。

    • 每次迭代处理一个未排序元素 current = arr[i]

  2. 内层循环

    • 从 j = i - 1 开始,反向遍历已排序部分。

    • 如果 arr[j] > current,则将 arr[j] 向后移动一位。

    • 直到找到 arr[j] ≤ current 的位置,此时 j + 1 就是 current 的插入位置。

  3. 插入操作

    • 将 current 放入 arr[j + 1]


4、性能介绍

✅ 为什么插入排序比选择排序快?

  1. 比较次数更少:选择排序每一轮都要遍历剩余全部元素找最小值,而插入排序在数据基本有序时只需少量比较。

  2. 提前终止:如果数据已经有序,插入排序内层循环会立即终止(类似冒泡优化版)。

  3. 数据局部性:插入排序是顺序访问数组,对 CPU 缓存更友好。


总结

  1. 小数组排序

    • Java 的 Arrays.sort() 在子数组长度 ≤ 47 时,会切换到插入排序。

  2. 部分有序数据

    • 如日志按时间插入、游戏排行榜实时更新。

  3. 混合排序算法

    • 快速排序的递归基改用插入排序(如 QuickSort + InsertionSort)。


参考文章:

1、六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序-CSDN博客https://blog.csdn.net/weixin_50886514/article/details/119045154?ops_request_misc=%257B%2522request%255Fid%2522%253A%25220faf03d22b2d125d5f49a4649ad59c85%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=0faf03d22b2d125d5f49a4649ad59c85&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-119045154-null-null.142^v102^control&utm_term=%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F&spm=1018.2226.3001.4187

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

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

相关文章

《计算机网络》实验报告七 HTTP协议分析与测量

目 录 1、实验目的 2、实验环境 3、实验内容 4、实验结果与分析 4.1 使用tcpdump命令抓包 4.2 HTTP字段分析 5、实验小结 5.1 问题与解决办法&#xff1a; 5.2 心得体会&#xff1a; 1、实验目的 1、了解HTTP协议及其报文结构 2、了解HTTP操作过程&#xff1a;TCP三次…

面试实战,问题十三,Redis在Java项目中的作用及使用场景详解,怎么回答

Redis在Java项目中的作用及使用场景详解&#xff08;面试要点&#xff09; 一、Redis的核心作用高性能缓存层 原理&#xff1a;Redis基于内存操作&#xff08;引用[2]&#xff09;&#xff0c;采用单线程模型避免线程切换开销&#xff0c;配合IO多路复用实现高吞吐&#xff08;…

Python - 100天从新手到大师 - Day6

引言 这里主要是依托于 jackfrued 仓库 Python-100-Days 进行学习&#xff0c;记录自己的学习过程和心得体会。 1 文件读写和异常处理 实际开发中常常会遇到对数据进行持久化的场景&#xff0c;所谓持久化是指将数据从无法长久保存数据的存储介质&#xff08;通常是内存&…

IP--MGER综合实验报告

一、实验目的完成网络设备&#xff08;路由器 R1-R5、PC1-PC4&#xff09;的 IP 地址规划与配置&#xff0c;确保接口通信基础正常。配置链路层协议及认证&#xff1a;R1 与 R5 采用 PPP 的 PAP 认证&#xff08;R5 为主认证方&#xff09;&#xff0c;R2 与 R5 采用 PPP 的 CH…

window的WSL怎么一键重置

之前用WSL来在windows和服务器之间传输数据&#xff0c;所以有很多数据缓存&#xff0c;但是现在找不到他们的路径&#xff0c;所以想直接重置 首先使用spacesniffer看一下C盘的情况&#xff1a;看起来&#xff0c;这个WSL真的占用了很多空间&#xff0c;但是我又不知道该怎么删…

卷积神经网络研讨

卷积操作原理: 特征向量与遍历:假设已知特征向量(如蓝天白云、绿油油草地特征),在输入图像的各个区域进行遍历,通过计算内积判断该区域是否有想要的特征。 内积计算特征:内积为 0 表示两个向量垂直,关系不好,无想要的特征;夹角越小,内积越大,代表区域中有想要的特征…

【EWARM】EWARM(IAR)的安装过程以及GD32的IAR工程模板搭建

一、简介 IAR官网 EWARM&#xff0c;即 IAR Embedded Workbench for ARM&#xff0c;是由 IAR Systems 开发的一款专门用于 ARM 微处理器软件开发的集成开发环境。以下是具体介绍&#xff1a; 功能特性&#xff1a; 完整工具链支持&#xff1a;集成了高级编辑器、全面的编译…

【工程化】浅谈前端构建工具

一、前端构建工具概述​ 前端构建工具是辅助开发者将源代码转换为浏览器可直接运行的静态资源的工具集合。随着前端技术的发展&#xff0c;源代码往往包含浏览器无法直接解析的语法&#xff08;如 TypeScript、Sass&#xff09;、模块化规范&#xff08;如 ES Modules、Common…

数据取证:Elcomsoft Password Digger,解密 macOS (OS X) 钥匙串信息

Elcomsoft Password Digger&#xff08;EPD&#xff09;是一款在 Windows 平台上使用的工具&#xff0c;用于解密存储在 macOS 钥匙串中的信息。该工具可以将加密的钥匙串内容导出到一个纯文本 XML 文件中&#xff0c;方便查看和分析。一键字典构建功能可以将钥匙串中的所有密码…

2.JVM跨平台原理(字节码机制)

目录引言一、跨平台就跟国际语言翻译似的二、字节码和 JVM 到底是啥玩意儿三、解决 “语言不通” 这个老难题四、实现 “一次编写&#xff0c;到处运行” 就这四步五、字节码技术给世界带来的大改变总结引言 咱平常是不是老纳闷儿&#xff0c;为啥同一个 Java 程序&#xff0c…

06-ES6

微任务&宏任务JS是单线程执行。所有要执行的任务都要排队。所有的同步任务会在主线程上排队&#xff0c;等待执行。异步任务&#xff1a;不会进入主线程&#xff0c;而是会进入任务队列。等到主线程上的任务执行完成之后&#xff0c;通知任务队列&#xff0c;执行异步任务。…

FreeSWITCH配置文件解析(10) 配置IP封禁(防暴力破解)

以下是针对FreeSWITCH配置IP封禁&#xff08;防暴力破解&#xff09;的完整方案&#xff0c;结合Fail2Ban与系统级防护策略&#xff1a;一、Fail2Ban核心配置&#xff08;推荐方案&#xff09;​​启用FreeSWITCH鉴权日志​​修改SIP Profile&#xff08;conf/sip_profiles/int…

【React 入门系列】React 组件通讯与生命周期详解

&#x1f9e9; 第一章&#xff1a;组件通讯概述在 React 开发中&#xff0c;组件是封装的、独立的功能单元。为了实现组件间的数据共享与协作&#xff0c;需要通过组件通讯机制。组件通讯的意义&#xff1a; 让多个封闭的组件能够共享数据&#xff0c;实现协作功能。&#x1f4…

前端开发 Vue 状态优化

Vue 项目中的状态优化一般都会用Pinia替代Vuex&#xff0c;Pinia 是 Vue 生态系统中的一个轻量级状态管理库&#xff0c;作为 Vuex 的替代品&#xff0c;它提供了更简洁的 API 和更好的性能。模块化管理&#xff1a;使用 Pinia 时&#xff0c;建议将状态拆分为多个 store 模块&…

虚幻基础:创建角色——FPS

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录创建角色设置模型添加摄像机添加位置&#xff1a;插槽弹簧臂&#xff1a;伸缩防止由碰撞导致摄像机穿模摄像机添加武器添加位置&#xff1a;插槽创建动画蓝图&#xff1a;主动获取角色数据并播放相应动画设置角色控制…

2025年入局苹果Vision Pro开发:从零到发布的完整路线图

苹果Vision Pro的发布标志着空间计算(Spatial Computing)进入主流市场。作为开发者,如何快速掌握visionOS开发?本文将为你提供详细的路线图、实践建议与资源指南,涵盖从窗口式应用到沉浸式3D应用的完整开发路径。 一、visionOS开发的核心目标与阶段划分 visionOS的开发可…

百度文心大模型ERNIE全面解析

百度文心大模型ERNIE概述 百度推出的文心大模型(ERNIE,Enhanced Representation through kNowledge IntEgration)系列是结合知识增强技术的预训练大模型,涵盖自然语言处理(NLP)、跨模态、行业应用等多个方向。其开源版本为开发者提供了可商用的大模型能力支持。 ERNIE的…

【SpringAI实战】提示词工程实现哄哄模拟器

一、前言 二、实现效果 三、代码实现 3.1 后端实现 3.2 前端实现 一、前言 Spring AI详解&#xff1a;【Spring AI详解】开启Java生态的智能应用开发新时代(附不同功能的Spring AI实战项目)-CSDN博客 二、实现效果 游戏规则很简单&#xff0c;就是说你的女友生气了&#x…

速通python加密之AES加密

AES加密 AES加密&#xff08;Advanced Encryption Standard&#xff0c;高级加密标准&#xff09;是目前全球公认的最安全、应用最广泛的对称加密算法之一&#xff0c;于2001年被美国国家标准与技术研究院&#xff08;NIST&#xff09;确定为替代DES的标准加密算法&#xff0c;…

Java 对象秒变 Map:字段自由伸缩的优雅实现

前言 在开发中,我们常常需要把对象转成 Map 格式,用于序列化、传输、展示,甚至硬塞给某些第三方框架吃进去再吐出来。乍一看很简单,字段多起来后就像打翻调色盘,维护起来一不小心就翻车。想优雅地搞定这事,必须有一套稳妥、可扩展的方案,才能写出让同事膜拜、领导点赞、…