插入排序算法

        插入排序是一种简单直观的排序算法,其工作原理是通过构建有序序列,从后向前扫描,找到相应位置并插入。直接插入排序是插入排序的一种,它每次将一个待排序的记录按其关键字大小插入到前面已经排序的子序列中的适当位置,直到全部记录插入完成为止。

        具体来说,直接插入排序首先将第一个元素视为已排序序列,然后从第二个元素开始,在已排序序列中从后向前扫描。如果该元素(已排序)大于新元素,则将该元素移到下一位置。重复此步骤,直到找到已排序的元素小于或等于新元素的位置。这时,将新元素插入到该位置后。这个过程会一直持续到所有元素都已排序。

        需要注意的是,虽然插入排序的时间复杂度为O(n^2),但其空间复杂度为O(1),因此其在数据量较小或者部分有序的情况下仍然十分有效。

核心思想:

        首先,将第一个值固定下来,依次判断后面的值(临时保存下来后面会用到),是否(顺序输出)小于前面的数,如果小于前面的数,就将该位置的数字的前一个数,赋值给后一个数(后移);,然后此时当前判断位置的前一个位置的就是该数字的真正位置。依次循环(元素 - 1次)该操作~

核心代码: 

        tips:当待插入的数小于已排序部分的元素时,需要将已排序部分的元素后移一位,为待插入的数腾出空间。通过不断自减insertIndex,可以找到待插入的数应该插入的位置。

while (insertIndex >= 0 && arrays[insertIndex] > insertVal) {arrays[insertIndex + 1] = arrays[insertIndex];insertIndex--;}//当退出while循环时,说明插入的位置找到,insertIndex + 1arrays[insertIndex + 1] = insertVal;

推导过程:

public class SortInsert {public static void main(String[] args) {int[] arrays = {12, 5, 8, 9, 4, 2};
//        int[] arrays = {101, 34, 119, 4};System.out.println("排序前:" + Arrays.toString(arrays));int insertVal = arrays[1];int insertIndex = 1 - 1;while(insertIndex >= 0 && insertVal < arrays[insertIndex]){arrays[insertIndex + 1] = arrays[insertIndex];insertIndex--;}arrays[insertIndex + 1] = insertVal;System.out.println("排序后:" + Arrays.toString(arrays));insertVal = arrays[2];insertIndex = 2 - 1;while(insertIndex >= 0 && insertVal < arrays[insertIndex]){arrays[insertIndex + 1] = arrays[insertIndex];insertIndex--;}arrays[insertIndex + 1] = insertVal;System.out.println("排序后:" + Arrays.toString(arrays));insertVal = arrays[3];insertIndex = 3 - 1;while(insertIndex >= 0 && insertVal < arrays[insertIndex]){arrays[insertIndex + 1] = arrays[insertIndex];insertIndex--;}arrays[insertIndex + 1] = insertVal;System.out.println("排序后:" + Arrays.toString(arrays));insertVal = arrays[4];insertIndex = 4 - 1;while(insertIndex >= 0 && insertVal < arrays[insertIndex]){arrays[insertIndex + 1] = arrays[insertIndex];insertIndex--;}arrays[insertIndex + 1] = insertVal;System.out.println("排序后:" + Arrays.toString(arrays));insertVal = arrays[5];insertIndex = 5 - 1;while(insertIndex >= 0 && insertVal < arrays[insertIndex]){arrays[insertIndex + 1] = arrays[insertIndex];insertIndex--;}arrays[insertIndex + 1] = insertVal;System.out.println("排序后:" + Arrays.toString(arrays));}
}

 简写后:

public class InsertSort {public static void main(String[] args) {int[] arrays = {12, 5, 8, 9, 4, 2};
//        int[] arrays = {101, 34, 119, 4};System.out.println("排序前:" + Arrays.toString(arrays));for (int i = 1; i < arrays.length; i++) {//定义待插入的数int insertVal = arrays[i];int insertIndex = i - 1; //即arr[1]的前面这个数的下标//给insertVal 找到插入的位置/**说明:* 1. insertIndex >= 0 保证在给insertVal 找插入的位置,不越界* 2. insertVal < arr[insertIndex] 待插入的数,还没有找到插入位置* 3. 就需要将 arr[insertIndex] 后移*/while (insertIndex >= 0 && arrays[insertIndex] > insertVal) {arrays[insertIndex + 1] = arrays[insertIndex];insertIndex--;}//当退出while循环时,说明插入的位置找到,insertIndex + 1if(insertIndex + 1 != i) { //如果找到的位置不是自身的位置arrays[insertIndex + 1] = insertVal;}System.out.println("第" + i + "轮:" + Arrays.toString(arrays));}System.out.println("排序后:" + Arrays.toString(arrays));}
}

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

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

相关文章

【Week-P4】CNN猴痘病识别

文章目录 一、环境配置二、准备数据三、搭建网络结构四、开始训练五、查看训练结果六、总结2.3 ⭐torch.utils.data.DataLoader()参数详解6.1 print()常用的三种输出格式6.2 修改网络结构6.2.1 增加池化、卷积和bn层6.2.2 增加卷积、bn、卷积、bn &#x1f368; 本文为&#x1…

Uniapp使用wx.getFuzzyLocation()方法,没有超过日调用次数,报错:“此key每日调用已达到上限”

前言&#xff1a; 最近在进行一个小程序项目开发的时候&#xff0c;使用wx.getFuzzyLocation()方法&#xff0c;没有超过日调用次数&#xff0c;但是却出现了报错&#xff1a;“此key每日调用已达到上限”。 解决方案&#xff1a; 打开腾讯位置服务 - 立足生态&#xff0c;连…

Eureka学习思维导图

一、Eureka Server原理解析 参考&#xff1a;https://www.jianshu.com/p/eb690e6ab11d 二、Eureka Client源码解析 参考&#xff1a;https://www.jianshu.com/p/6e8850387da6

odoo 客制化审批流

以BPM、OA为代表的应用平台&#xff0c;低代码处理为前提的审批流功能定制化 功能介绍&#xff1a; 业务对象&#xff1a;针对侵入式注册BPM业务场景&#xff1a;设置审批场景&#xff1a;如&#xff1a;请假大于三天的场景、金额大于1000的场景节点条件&#xff1a; 当符合某…

钡铼分布式IO在玻璃制造中的实时数据采集与监控应用介绍

导读 玻璃行业多年来一直广泛使用 PLC 来帮助管理生产过程所需的精确材料比例&#xff0c;完全依赖其PLC进行数据采集与控制&#xff0c;并且大量依靠人工来操作&#xff0c;所以这些高成本推动了对成本较低的替代方案的需求。 场景描述 某玻璃厂生产的玻璃生产包括配料段、熔…

Android App从备案到上架全过程

不知道大家注意没有,最近几年来,新的移动App想要上架是会非常困难的,并且对于个人开发者和小企业几乎是难如登天,各种备案和审核。但是到底有多难,或许只有上架过的才会有所体会。 首先是目前各大应用市场陆续推出新的声明,各种备案截止日期到12月就要到最后期限责令整改…

74HC595驱动数码管程序

数码管的驱动分静态扫描和动态扫描两种&#xff0c;使用最多的是动态扫描&#xff0c;优点是使用较少的MCU的IO口就能驱动较多位数的数码管。数码管动态扫描驱动电路很多&#xff0c;其中最常见的是74HC164驱动数码管&#xff0c;这种电路一般用三极管作位选信号&#xff0c;用…

【UnityShader入门精要学习笔记】(3)章节答疑

本系列为作者学习UnityShader入门精要而作的笔记&#xff0c;内容将包括&#xff1a; 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更&#xff0c;有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 复习&#xff08;阶段性总结…

《JSR303参数校验》

一、基础概述 1.简介 Java API 规范 (JSR303) 定义了 Bean 校验的标准 validation-api&#xff0c;但没有提供实现。hibernate validation 是对这个规范的实现&#xff0c;并增加了校验注解如 Email、Length 等。Spring Validation 是对 hibernate validation 的二次封装&…

linux centos 部署 jenkins

一、试了用容器部署&#xff0c;不行。(建议别用容器部署) 二、直接部署在主机上 1、安装java环境 yum install java-11-openjdk-devel # 检查 java -version # 打印 [rootiZwz9a99mctbkabkh2imhdZ init.d] java -version openjdk version "11.0.21" 2023-10-17 L…

Django Web 开发实战-实现用户管理系统(部门管理、用户管理、注册登录、文件上传)

简介 基于Django Python Web框架 MySQL Bootstrap 开发的用户管理系统。支持增删改查、模糊搜索、分页。 功能介绍 部门管理---》已完成 用户管理---》已完成 认证&#xff08;注册/登录&#xff09;---》开发中 数据统计---》待开发 文件上传---》待开发 效果图 部门…

设计模式之建造者模式【创造者模式】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某…