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

Java手写插入排序和算法案例拓展

1. Java手写插入排序和算法案例拓展

1.1 算法思维导图

插入排序
比较相邻元素
是否需要交换
交换元素
结束
结束

1.2 手写插入排序的必要性

手写插入排序是为了更好地理解算法的原理和实现过程。通过手写插入排序,我们可以深入思考每个步骤的逻辑,优化算法的性能,并且能够更好地应用到实际问题中。

1.3 插入排序的市场调查

插入排序是一种简单直观的排序算法,适用于小规模数据的排序。在实际应用中,插入排序常用于对已经基本有序的数据进行排序,或者用作其他排序算法的优化部分。它的时间复杂度为O(n^2),对于大规模数据的排序效率较低,但在某些特定场景下仍然有较好的应用效果。

1.4 插入排序的详细介绍和步骤

插入排序的基本思想是将待排序的元素依次插入到已排序序列中的合适位置,从而得到一个新的有序序列。具体步骤如下:

  1. 首先,将待排序序列的第一个元素看作已排序序列,将其作为参照物。
  2. 然后,从待排序序列的第二个元素开始,依次与已排序序列中的元素进行比较。
  3. 如果待排序元素小于已排序元素,则将已排序元素后移一位,为待排序元素腾出位置。
  4. 重复步骤3,直到找到待排序元素的正确位置。
  5. 将待排序元素插入到正确位置后,已排序序列的长度加1。
  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 key = arr[i];int j = i - 1;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}}
}

代码解释:

  • insertionSort函数接受一个整型数组作为参数,对数组进行插入排序。
  • 首先,获取数组的长度,并从数组的第二个元素开始遍历。
  • 将当前元素保存为key,并将j初始化为当前元素的前一个位置。
  • while循环中,如果j大于等于0且当前元素大于key,则将当前元素后移一位。
  • 重复上述过程,直到找到当前元素的正确位置。
  • key插入到正确位置后,继续下一个元素的排序。
  • 最后,数组中的所有元素都被插入到正确位置,排序完成。

1.5 插入排序的手写实现总结和必要性

通过手写插入排序,我们更深入地理解了算法的原理和实现步骤。手写实现可以帮助我们更好地掌握算法的细节,从而能够优化算法的性能和适应不同的应用场景。同时,手写实现也有助于我们在面试等场合展示自己的编码能力和对算法的理解。

1.6 插入排序的完整代码

public class InsertionSort {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;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}}public static void main(String[] args) {int[] arr = {5, 2, 8, 9, 1};insertionSort(arr);for (int num : arr) {System.out.print(num + " ");}}
}

1.7 插入排序的应用前景调研

插入排序由于其简单直观的特点,在某些特定场景下仍然有较好的应用前景。以下是插入排序的一些应用前景:

  • 对小规模数据进行排序:插入排序在数据规模较小时,由于其时间复杂度为O(n^2),相对于其他高效排序算法(如快速排序、归并排序)来说,性能较好。
  • 部分有序数据的排序:对已经基本有序的数据进行排序时,插入排序的性能优于其他排序算法,因为插入排序每次只需要移动少量元素。
  • 排序算法的优化部分:插入排序可以作为其他排序算法的优化部分,例如快速排序的优化版本(快速排序+插入排序)。

1.8 插入排序的拓展应用案例

案例1:对学生成绩进行排序

假设有一批学生的成绩数据,需要按照从低到高的顺序进行排序。由于学生人数较少,可以使用插入排序进行排序。

public class Student {private String name;private int score;public Student(String name, int score) {this.name = name;this.score = score;}public String getName() {return name;}public int getScore() {return score;}public static void insertionSort(Student[] students) {int n = students.length;for (int i = 1; i < n; i++) {Student key = students[i];int j = i - 1;while (j >= 0 && students[j].getScore() > key.getScore()) {students[j + 1] = students[j];j--;}students[j + 1] = key;}}public static void main(String[] args) {Student[] students = {new Student("Alice", 80),new Student("Bob", 90),new Student("Charlie", 70)};insertionSort(students);for (Student student : students) {System.out.println(student.getName() + ": " + student.getScore());}}
}

案例2:插入排序的优化

在插入排序中,每次比较都需要进行交换操作,这样会导致大量的数据移动。为了减少数据移动的次数,可以将交换操作改为赋值操作。

public class InsertionSort {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;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}}public static void insertionSortOptimized(int[] arr) {int n = arr.length;for (int i = 1; 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;}}public static void main(String[] args) {int[] arr = {5, 2, 8, 9, 1};insertionSortOptimized(arr);for (int num : arr) {System.out.print(num + " ");}}
}

在优化后的插入排序中,每次比较只需要进行赋值操作,不需要进行交换操作,从而减少了数据移动的次数,提高了排序的效率。

相关文章:

Java手写插入排序和算法案例拓展

1. Java手写插入排序和算法案例拓展 1.1 算法思维导图 #mermaid-svg-jIZ3LAdg1NLcOvaM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-jIZ3LAdg1NLcOvaM .error-icon{fill:#552222;}#mermaid-svg-jIZ3LAdg1NLcOvaM…...

Python Opencv实践 - 视频文件操作

参考资料&#xff1a; 视频处理VideoCapture类---OpenCV-Python开发指南&#xff08;38&#xff09;_python opencv videocapture_李元静的博客-CSDN博客 OpenCV VideoCapture.get()参数详解 - 简书FOURCC四字符码对照表_4fvcc_Kellybook的博客-CSDN博客 import cv2 as cv im…...

HCS 中的一些概念(二)

一、Service OM 1、首页&#xff08;资源状态&#xff09; 2、服务列表 计算资源&#xff1a;计算资源又分为可用分区&#xff08;AZ&#xff09;、规格和虚拟机组&#xff0c;可在此处创建虚拟机、虚拟机组、主机组和规格 网络资源&#xff1a;网络资源又分为物理网络…...

Scanner类用法(学习笔记)

Scanner类用法&#xff08;学习笔记&#xff0c;后续会补充&#xff09; 1.next&#xff08;&#xff09;用法 package com.yushifu.scanner; import java.util.Scanner;//util java工具包 //Scanner类&#xff08;获取用户的输入&#xff09; Scanner s new Scanner&#…...

idea2021.1.3版本双击启动,没反应

今天打开电脑&#xff0c;点开idea&#xff0c;界面悬在这里&#xff0c;几秒然后就是没了。然后就一直打不开idea了。 然后又是卸载重装&#xff0c;又是删除缓存文件。我把电脑关于idea的文件全都删除了 。重新安装后&#xff08;首次运行倒是可以打开&#xff0c;但是关掉id…...

MC-4/11/01/400 ELAU 软件允许用户完全访问相机设置

MC-4/11/01/400 ELAU 软件允许用户完全访问相机设置 一个完整的Sentinel模具保护解决方案包括一到四台冲击式摄像机、专用红外LED照明和镜头、Sentinel软件以及所有与模压机连接的必要互连组件。摄像机支架基于磁性&#xff0c;可快速、安全、灵活地部署。此外&#xff0c;一个…...

Error contacting service. It is probably not running.问题解决

一 问题描述 Error contacting service. It is probably not running. 查看zookeeper 目录下数据目录下的zookeeper.out 如果你没找到这个目录那么 OK 你的问题就是 zoo.cfg 文件中数据目录设置错误 zookeeper.out下报错 ERROR [main:QuorumPeerMain86] - Invalid config,…...

01_网络编程_传统IO

网络编程 1.什么是网络编程 在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行的数据传输。 如果想把一个计算的结果&#xff0c;或者是电脑上的文件通过网络传递给你的朋友&#xff0c;就需要用到网络编程。 在实际生活中&#xff0c;网络通信无处不在…...

vue 检查指定路由是否存在

今天路由跳转报错了 RangeError: Maximum call stack size exceeded 但显然 我的代码只有一个简单的路由跳转 并没有很大的的堆栈数据操作 所以 我就联想到了 会不会是因为路由不存在 我们可以通过 console.log(this.$router.options.routes)输出整个路由对象类看一下 或者…...

自动化办公更简单了:新版python-office,有哪些更新?

#职场经验谈# 大家好&#xff0c;这里是程序员晚枫&#xff0c;小破站/小红薯都叫这个名。 去年4月开源了一个Python自动化办公项目&#xff1a;python-office&#xff0c;GitHub和Gitee都能看到。1行代码实现复杂的自动化办公任务&#xff0c;帮助不懂代码的小白&#xff0c;…...

windows flask服务卡死的问题

windows flask服务卡死的问题 最近的工作中&#xff0c;需要用python写一个flask服务&#xff0c;供C端调用&#xff0c;但是偶尔服务会卡住&#xff0c;只接收数据但不进行处理&#xff0c;不过CtrlC后又可以继续运行。 查看了网上的一些解决方法&#xff0c;但似乎都没有什…...

项目上线部署--》服务器部署流程(一)

目录 &#x1f31f;准备工作 服务器购买 域名购买 域名解析&#xff08;配置 DNS&#xff09; &#x1f31f;服务器环境搭建 配置服务器 安装 CentOS 开发人员相关包 ​编辑 配置免密登陆 &#x1f31f;写在最后 &#x1f31f;准备工作 服务器购买 国内服务器&#x…...

Python:函数调用的实参

相关阅读 Python专栏https://blog.csdn.net/weixin_45791458/category_12403403.html 调用就是附带可能为空的一系列参数来执行一个可调用对象 &#xff08;例如函数&#xff09;&#xff0c;它的语法的BNF范式如下所示&#xff0c;有关BNF范式的规则&#xff0c;可以参考之前…...

174. 地下城游戏 -- 动规

174. 地下城游戏 class CalculateMinimumHP:"""174. 地下城游戏https://leetcode.cn/problems/dungeon-game/"""def solution(self, dungeon: List[List[int]]) -> int:# 我们想计算左上⻆到右下⻆所需的最⼩⽣命值m, n len(dungeon), len(d…...

js实现websocket服务端和客户端

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

qt qml RadioButton如何设置字体颜色,style提示找不到怎么办?

qt QML中设置RadioButton的字体颜色&#xff0c;可以使用RadioButton的label属性来设置文本的样式。下面是一个示例代码&#xff1a; import QtQuick 2.6 import QtQuick.Controls 2.2 import QtQuick.Controls 1.4 as Controls1_4 import QtQuick.Controls.Styles 1.4 import…...

Docker 的使用

一、Docker 的作用和优势 软件集装箱化平台&#xff0c;可让开发者构建应用程序时&#xff0c;将它与环境一起打包到一个容器中&#xff0c;发布应用到任意平台中。 能在单台机器上运行多个Docker微容器&#xff0c;而每个微容器里都有一个微服务或独立应用&#xff0c; 如&am…...

【无公网IP内网穿透】Java支付宝沙箱环境支付,SDK接口远程调试

目录 1.测试环境 2.本地配置 3. 内网穿透 3.1 下载安装cpolar内网穿透 3.2 创建隧道 4. 测试公网访问 5. 配置固定二级子域名 5.1 保留一个二级子域名 5.2 配置二级子域名 6. 使用固定二级子域名进行访问 1.测试环境 MavenSpring bootJdk 1.8 2.本地配置 获取支付…...

axios 用formData的方式请求数据

需求&#xff1a;使用axios库用来做http数据传输。 问题&#xff1a;传递数据的时候不是直接通过json的方式来传输的数据&#xff0c;二是通过formData的方式 解决&#xff1a; axios 请求头设置&#xff0c;Content-Type "Content-Type": "application/x-w…...

Mapbox加载arcgis的底图

成果图 这种底图基本上都是按照raster来加载的&#xff0c;主要就是知道地址了&#xff0c;拼参数 具体参数请参考官网 https://developers.arcgis.com/rest/services-reference/enterprise/export-map.htm 源码 我的服务列表是这样的 http://XXXX:XXXX/arcgis/rest/services/…...

OpenClaw技能安装失败全解析:从依赖冲突到网络问题的系统性解决方案

1. 项目概述&#xff1a;当技能“卡住”时&#xff0c;我们遇到了什么&#xff1f;最近在折腾OpenClaw这类开源AI助手平台时&#xff0c;不少朋友都踩进了同一个坑&#xff1a;从官方市场或者第三方渠道找到了心仪的技能&#xff08;Skill&#xff09;&#xff0c;点击“安装”…...

Buzz音频转录完全指南:3大核心功能+5个实战场景,快速掌握本地语音转文字技术

Buzz音频转录完全指南&#xff1a;3大核心功能5个实战场景&#xff0c;快速掌握本地语音转文字技术 【免费下载链接】buzz Buzz transcribes and translates audio offline on your personal computer. Powered by OpenAIs Whisper. 项目地址: https://gitcode.com/GitHub_Tr…...

UOS系统下WPS卸载不干净?手把手教你用命令行精准清理(附dpkg/apt组合拳)

UOS系统下WPS卸载不干净&#xff1f;手把手教你用命令行精准清理 在UOS系统日常使用中&#xff0c;WPS Office作为常用办公软件&#xff0c;有时因版本更新或功能调整需要彻底卸载。但不少用户发现&#xff0c;通过图形界面或简单命令卸载后&#xff0c;系统中仍残留配置文件、…...

HarmonyOS ArkTS DateUtil 日期增减与日历计算完整指南

文章目录 背景一、引言二、日期增减方法详解使用示例 三、日历计算方法详解四、Demo 演示&#xff1a;日期增减结果展示五、Demo 演示&#xff1a;月历视图完整实现六、日历视图关键点解析为什么要填充前置空格&#xff1f;getLastDayOfMonth 的实现技巧 七、小结 背景 近期发现…...

AI写的论文双率如何压到20%以下?这几款工具实测有效

毕业季、投稿季用AI写论文已经成为不少人的高效选择&#xff0c;但查重率飘红、AIGC疑似率超标两大问题&#xff0c;让很多人犯了难。2026年学术检测标准持续收紧&#xff0c;知网、维普及主流AIGC检测系统同步上线双检规则&#xff0c;两项指标均控制在20%以下才符合基本提交要…...

深度解析:JetBrains IDE试用期重置机制的技术实现

深度解析&#xff1a;JetBrains IDE试用期重置机制的技术实现 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 在软件开发工作流中&#xff0c;JetBrains IDE试用期管理是一个常见的技术挑战&#xff0c;尤其是在多…...

Taotoken用量看板功能详解,助你洞察团队AI资源消耗模式

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken用量看板功能详解&#xff0c;助你洞察团队AI资源消耗模式 对于技术管理者或项目负责人而言&#xff0c;清晰了解团队的AI…...

基于Arduino Uno与MQ-2传感器的智能气体检测报警系统DIY全攻略

1. 项目概述与核心思路最近在捣鼓家里的智能安防&#xff0c;琢磨着能不能自己做一个成本可控、反应灵敏的气体检测报警装置。市面上成品烟雾报警器虽然成熟&#xff0c;但要么功能单一&#xff0c;要么价格不菲&#xff0c;而且很难根据自己的需求进行定制化调整&#xff0c;比…...

自然语言处理的实战项目:从0到1搭建属于自己的文本分类系统

对于软件测试从业者而言&#xff0c;日常工作中我们每天都会接触大量的文本数据&#xff1a;缺陷管理系统中的bug描述、测试用例的步骤说明、用户反馈的问题报告、需求文档的规格描述&#xff0c;甚至是接口返回的异常信息文本。这些非结构化文本往往隐含着关键业务信息&#x…...

市面上有哪些是真正安全的降AIGC网站(轻松压低AI生成疑似率)

最崩溃的不是查重难题&#xff0c;而是查重达标却AI率超标亮红灯&#xff01;很多工具只会简单同义词替换、浅层改字&#xff0c;根本洗不掉AI专属句式、行文逻辑和高频模板话术&#xff0c;学校AIGC检测一查一个准&#xff0c;论文直接凉凉。 本篇结合全网实测数据&#xff0c…...