当前位置: 首页 > news >正文

Java算法之插入排序(Insertion Sort)

插入排序简介

插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。这个过程像打牌时整理手中的牌一样,逐步将数据排列成有序。

算法原理

插入排序的工作原理如下:

  1. 将第一元素视为已排序的序列。
  2. 从未排序序列中取第一个元素,从已排序序列的末尾开始比较。
  3. 比较如果已排序序列中的元素比待插入元素大,则将已排序序列的元素向后移动一位。
  4. 重复步骤3,直到找到已排序序列中第一个小于或等于待插入元素的位置。
  5. 将待插入元素插入到这个位置。
  6. 重复步骤2-5,直到所有未排序元素都被插入到已排序序列中。

代码实现

以下是使用Java实现插入排序的示例代码:

public class InsertionSort {public static void insertionSort(int[] arr) {int n = arr.length;for (int i = 1; i < n; i++) {// 记录当前待插入的元素int current = arr[i];int j = i - 1;// 从已排序序列中从后向前扫描while (j >= 0 && arr[j] > current) {// 将已排序序列中比当前元素大的元素向后移动arr[j + 1] = arr[j];j--;}// 将当前元素插入到正确的位置arr[j + 1] = current;}}public static void main(String[] args) {int[] arr = {9, 5, 1, 4, 3};insertionSort(arr);System.out.println("排序后的数组: ");for (int value : arr) {System.out.print(value + " ");}}
}

优缺点分析

优点

  • 简单性:算法原理简单,易于理解和实现。
  • 稳定性:插入排序是稳定的排序算法,相等的元素在排序后保持原有的顺序。
  • 空间效率:是原地排序算法,空间复杂度为O(1)。
  • 性能优势:对于部分有序的数据,插入排序的性能接近线性时间。

缺点

  • 时间复杂度:平均和最坏情况下的时间复杂度都是O(n^2),对于大规模数据集效率较低。
  • 不适合大数据量:对于大数据量,插入排序的性能不如其他更高级的排序算法。

使用场景

  • 小规模数据:当处理的数据量较小,且对性能要求不高时,插入排序是一个不错的选择。
  • 部分有序数据:如果已知数据已经部分有序,插入排序的性能会相对较好。
  • 教学目的:由于其简单性,插入排序常用于教学中,帮助初学者理解排序算法的基本概念。

结语

插入排序虽然在实际应用中的效率不如一些更高级的排序算法,但它的原理简单,易于实现,且对于部分有序的数据集表现良好

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于STM32的RFID高速收费系统(论文+源码+实物)
  • Github 2024-08-28 C开源项目日报 Top9
  • 基于python的足球比赛数据及可视化 python 足球预测
  • Unet改进11:在不同位置添加MLCA||轻量级的混合本地信道注意机制
  • Xaas傻傻分不清楚,看完这个你就明白了!
  • pgloader 是什么及如何使用?
  • Python数据清洗基础
  • Vmware扩容空间不见的问题
  • C++set与map容器
  • Vue3中 defineProps 与 defineEmits 基本使用
  • django orm的Q和~Q的数据相加并不一定等于总数
  • 影视会员充值API接口如何开发?
  • 生物信息学:DNA序列的构成
  • 大模型battle,哪家才是真的“价美”也“物美”
  • windows 11/ubuntu Teredo 设置 (ipv4 转 ipv6)
  • css布局,左右固定中间自适应实现
  • Git 使用集
  • Javascript编码规范
  • Linux Process Manage
  • Linux中的硬链接与软链接
  • nodejs:开发并发布一个nodejs包
  • Python socket服务器端、客户端传送信息
  • TCP拥塞控制
  • Vue 动态创建 component
  • Web标准制定过程
  • 对JS继承的一点思考
  • 给初学者:JavaScript 中数组操作注意点
  • 如何在GitHub上创建个人博客
  • 实现菜单下拉伸展折叠效果demo
  • 新手搭建网站的主要流程
  • 学习笔记TF060:图像语音结合,看图说话
  • 移动端解决方案学习记录
  • - 转 Ext2.0 form使用实例
  • No resource identifier found for attribute,RxJava之zip操作符
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 选择阿里云数据库HBase版十大理由
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • # Maven错误Error executing Maven
  • #if #elif #endif
  • ${factoryList }后面有空格不影响
  • (4)事件处理——(7)简单事件(Simple events)
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (转) Android中ViewStub组件使用
  • (转)Linux下编译安装log4cxx
  • (转)ORM
  • (自用)gtest单元测试
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例