【算法基础】插入排序算法 - JAVA

一、算法基础

1.1 什么是插入排序

插入排序是一种简单直观的排序算法,它的工作原理类似于我们打牌时整理手牌的过程。插入排序的核心思想是将数组分为已排序和未排序两部分,每次从未排序部分取出一个元素,插入到已排序部分的适当位置

1.2 插入排序的基本思想

  1. 将第一个元素视为已排序部分
  2. 取出下一个元素,在已排序部分找到合适的插入位置
  3. 将已排序部分中大于该元素的所有元素后移一位
  4. 将该元素插入到正确的位置
  5. 重复步骤2~4,直到所有元素都插入到正确的位置

1.3 时间复杂度

  • 最佳情况:O(n),当数组已经排好序时
  • 最坏情况:O(n²),当数组逆序排列时
  • 平均情况:O(n²)
  • 空间复杂度:O(1),原地排序算法

二、插入排序的实现

2.1 标准实现

public class InsertionSort {public static void sort(int[] arr) {int n = arr.length;// 从第二个元素开始,第一个元素被视为已排序for (int i = 1; i < n; i++) {// 取出当前元素int key = arr[i];int j = i - 1;// 将比key大的元素向后移动while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}// 将key插入到正确位置arr[j + 1] = key;}}
}

2.2 优化实现(针对部分有序数组)

public class OptimizedInsertionSort {public static void sort(int[] arr) {int n = arr.length;// 找到第一个逆序位置int startIndex = 1;for (int i = 0; i < n - 1; i++) {if (arr[i] > arr[i + 1]) {startIndex = i + 1;break;}}// 从startIndex开始进行插入排序for (int i = startIndex; i < n; i++) {int key = arr[i];int j = i - 1;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}}
}

2.3 二分查找优化

在插入过程中,可以使用二分查找来加速查找插入位置:

public class BinaryInsertionSort {public static void sort(int[] arr) {int n = arr.length;for (int i = 1; i < n; i++) {int key = arr[i];// 使用二分查找找到插入位置int insertPos = binarySearch(arr, 0, i - 1, key);// 将元素后移if (insertPos < i) {System.arraycopy(arr, insertPos, arr, insertPos + 1, i - insertPos);arr[insertPos] = key;}}}// 二分查找最小的不小于key的元素位置private static int binarySearch(int[] arr, int low, int high, int key) {while (low <= high) {int mid = low + (high - low) / 2;if (arr[mid] > key) {high = mid - 1;} else {low = mid + 1;}}return low;}
}

三、插入排序的特点分析

3.1 优点

  1. 实现简单:算法逻辑直观,容易理解和实现
  2. 稳定排序:相同元素的相对位置在排序后保持不变
  3. 原地排序:不需要额外空间
  4. 对小规模数据高效:当数据量小时,常数因子小,效率高
  5. 对近乎有序的数据非常高效:接近O(n)时间复杂度
  6. 在线算法:可以一边读取数据一边排序

3.2 缺点

  1. 时间复杂度高:对于大规模数据,O(n²)的时间复杂度较高
  2. 不适合逆序数组:在逆序数组上性能最差
  3. 不适合频繁交换元素的场景:在交换代价高的情况下可能效率低下

四、实际应用示例

4.1 完整示例程序

public class InsertionSortDemo {public static void main(String[] args) {// 示例数组int[] arr = {12, 11, 13, 5, 6, 7};System.out.println("原始数组:");printArray(arr);// 执行插入排序insertionSort(arr);System.out.println("排序后数组:");printArray(arr);}// 插入排序算法public static void insertionSort(int[] arr) {int n = arr.length;for (int i = 1; i < n; i++) {int key = arr[i];int j = i - 1;// 将比key大的元素向后移动while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}// 将key插入到正确位置arr[j + 1] = key;}}// 打印数组public static void printArray(int[] arr) {for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}System.out.println();}
}

4.2 排序过程示例

假设我们对数组 [5, 2, 4, 6, 1, 3] 进行插入排序:

  1. 初始状态:[5, 2, 4, 6, 1, 3](粗体表示已排序部分)
  2. 插入2:[2, 5, 4, 6, 1, 3](2比5小,所以插入到5前面)
  3. 插入4:[2, 4, 5, 6, 1, 3](4比5小,比2大,所以插入到位置2)
  4. 插入6:[2, 4, 5, 6, 1, 3](6比所有已排序元素都大,保持原位)
  5. 插入1:[1, 2, 4, 5, 6, 3](1比所有已排序元素都小,插入到开始位置)
  6. 插入3:[1, 2, 3, 4, 5, 6](3比2大,比4小,插入到位置2)

五、总结

插入排序是一种简单但实用的排序算法,尤其在以下场景中表现出色:

  1. 数据规模较小
  2. 数据已经部分有序
  3. 需要稳定排序
  4. 需要在线处理数据

虽然在最坏情况下时间复杂度为O(n²),但其简单性和在特定场景下的优势使其成为实际应用中的重要选择。在标准库中,很多高级排序算法在处理小规模子数组时,会转而使用插入排序,因为此时插入排序的常数因子优势明显。

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

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

相关文章

WEB前端小练习——记事本

一、登陆页面 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>记事本登录注册</title><link…

[ACTF2020 新生赛]Include [ACTF2020 新生赛]Exec

[ACTF2020 新生赛]Include 因为前端过滤的太多了 所以直接使用 日志包含 搞 包含这个 /var/log/nginx/access.log [ACTF2020 新生赛]Include蚁剑连接 翻看 flag{1ce7a81e-0339-44ef-a398-a7784d3efe37} [ACTF2020 新生赛]Exec [ACTF2020 新生赛]Exec 127.0.0.1 |echo <?…

VFS Global 携手 SAP 推动数字化转型

2025年5月2日&#xff0c;SAP 公司宣布&#xff0c;全球领先的签证、领事和技术服务提供商 VFS Global 将采用 SAP 的多项核心软件解决方案&#xff0c;推动其全球政务服务和跨境流动解决方案迈向全面数字化和智能化。此次合作标志着 VFS Global 在 AI 赋能的政府科技&#xff…

GTC2025全球流量大会:领驭科技以AI云端之力,助力中国企业出海破浪前行

在全球化与数字化浪潮下&#xff0c;AI技术正成为中国企业出海的重要驱动力。一方面&#xff0c;AI通过语言处理、数据分析等能力显著提升出海企业的运营效率与市场适应性&#xff0c;尤其在东南亚等新兴市场展现出"高性价比场景适配"的竞争优势&#xff1b;另一方面…

安全漏洞扫描费用受哪些因素影响?市场价格区间是多少?

安全漏洞扫描费用是个复杂且关键的话题。它涉及多种影响因素。合理的费用可让企业有效防范安全风险。下面我们深入探讨一番。 市场价格区间 安全漏洞扫描的费用在市场上差别很大。小型企业进行简单扫描&#xff0c;可能只要几千元。大型企业做全面的深度扫描&#xff0c;费用…

n8n工作流自动化平台的实操:解决中文乱码

解决问题&#xff1a; 通过ftp读取中文内容的文件&#xff0c;会存在乱码&#xff0c;如下图&#xff1a; 解决方案 1.详见《安装 iconv-lite》 2.在code节点&#xff0c;写如下代码&#xff1a; const iconv require(iconv-lite);const items $input.all(); items.forEa…

豪越科技消防立库方案:实现应急物资高效管理

在消防救援工作中&#xff0c;应急物资管理是至关重要的一环。然而&#xff0c;当前应急物资管理的现状却令人担忧。传统的应急物资管理方式存在诸多弊端&#xff0c;严重影响了消防救援的效率和效果。 走进一些传统的消防仓库&#xff0c;映入眼帘的往往是杂乱无章的存储场景。…

zabbix 重置登录密码

概述 本节介绍在 Zabbix 中重置用户密码的步骤。 步骤 如果您忘记了 Zabbix 密码并且无法登录&#xff0c;请联系您的 Zabbix 管理员。 超级管理员用户可以更改用户 配置表单 中所有用户的密码。 如果超级管理员忘记了密码并且无法登录&#xff0c;则必须运行以下 SQL 查询…

生成树、Prime、Kruskal

1、任何一个带权无向连通图的最小生成树——可能是不唯一的。 2、给定有权无向图的邻接矩阵如下&#xff0c;其最小生成树的总权重是&#xff1a;14 3、给定有权无向图如下。关于其最小生成树&#xff0c;最小生成树不唯一&#xff0c;其总权重为23。 4、给出如下图所示的具有…

用Suno V4.5试了一下1850字的歌词进行创作出来了6分钟的歌曲

我的宝贝V1,未来AI视界,5分钟 之前的Suno 3和Suno 4的版本&#xff0c;创作的音乐最长是4分钟&#xff0c;这里最大的问题就是&#xff0c;唱到4分钟歌曲就突然断了&#xff0c;那么只能使用续写的方式进行创作。对于续写的问题&#xff0c;其一增加用户的使用和理解成本&…

机器人编程基础---C语言中的表达式和求值

C语言中的表达式和求值 C语言中的表达式和求值表达式示例代码示例说明C语言中的表达式和求值 表达式是运算符和操作数(变量、常量、表达式等)的组合,它们可以产生一个值。 表达式示例 int x = 10, y = 20; int z = x + y * 2; // 根据运算符优先级,先计算y*2,然后计算x…

[UVM]在SoC中用寄存器模型backdoor访问寄存器的案例

在SoC中用寄存器模型backdoor访问寄存器的案例 摘要:在 UVM (Universal Verification Methodology) 验证环境中,寄存器模型是验证 DUT (Design Under Test) 寄存器行为的重要工具。特别是对于层次化的验证环境(如 IP 到 Sub-system 再到 SoC 的集成),使用 UVM 寄存…

NV203NV207SSD固态闪存NV208NV213

NV203NV207SSD固态闪存NV208NV213 美光SSD全解析&#xff1a;NV203/NV207/NV208/NV213技术矩阵 一、产品定位与技术脉络 在存储技术迭代浪潮中&#xff0c;美光NV系列产品构建起多层次的技术矩阵。NV203作为入门级SATA SSD&#xff0c;主打成本控制与基础性能平衡&#xff0c…

迭代器的思想和实现细节

1. 迭代器的本质 迭代器是一种行为类似指针的对象&#xff0c;它可能是指针&#xff08;如 std::vector 的迭代器&#xff09;&#xff0c;也可能是封装了指针的类&#xff08;如 std::list 的迭代器&#xff09;。如果是指针那天然就可以用下面的运算&#xff0c;如果是类&am…

工业传动核心部件深度剖析:丝杆升降机与气缸的技术特性及选型指南

在工业自动化技术飞速发展的当下&#xff0c;丝杆升降机与气缸作为关键的直线传动部件&#xff0c;广泛应用于各类机械设备中。对于工程师而言&#xff0c;深入了解它们的技术特性、优缺点及适用场景&#xff0c;是实现高效、精准设备设计的重要前提。本文将从技术原理出发&…

HarmonyOS NEXT——DevEco Studio的使用(还没写完)

一、IDE环境的搭建 Windows环境 运行环境要求 为保证DevEco Studio正常运行&#xff0c;建议电脑配置满足如下要求&#xff1a; 操作系统&#xff1a;Windows10 64位、Windows11 64位 内存&#xff1a;16GB及以上 硬盘&#xff1a;100GB及以上 分辨率&#xff1a;1280*8…

Modbus 通讯协议(超详细,简单易懂)

目录 一、协议中的寄存器定义 二、协议概述 三、使用串口的Modbus 报文帧 ​编辑 3.1、Modbus ASCII 模式 3.2、Modbus RTU 模式 3.3、功能码概要 3.4、Modbus 报文分析 四、什么是RS-485 RS-232&#xff1f; 一、协议中的寄存器定义 阅读 Modbus 协议时会发现它的概念别扭…

计算机总线系统入门:理解数据传输的核心

一、总线系统简介&#xff1a;计算机内部的交通网络 在计算机系统中&#xff0c;总线是指连接各个组件的一组共享信号线或传输通道&#xff0c;用于在系统内不同的硬件模块之间传递数据、地址、控制信号等信息。它类似于交通系统中的道路&#xff0c;帮助计算机各个部件&#…

《应用开发突围指南:敏捷开发的实战精髓》

如何在应用开发中精准且深入地应用敏捷开发方法呢&#xff1f;让我们一同深入探索。 敏捷开发&#xff0c;绝非仅仅是一种开发流程&#xff0c;更是一种蕴含深刻智慧的理念与思维方式。它与传统开发模式有着本质的区别&#xff0c;传统开发模式如同严谨的线性旅程&#xff0c;…

《高性能MySQL》第1讲:MySQL架构

MySQL是一个非常流行的关系型数据库管理系统,它的设计非常灵活,能够适应多种不同的应用场景。无论是Web应用、数据仓库,还是高可用性系统,MySQL都能胜任。为了更好地理解MySQL的工作原理,我们需要从它的架构入手。 1.1 MySQL逻辑架构 首先,我们来看一下MySQL的逻辑架构…