插入排序【Java算法】

文章目录

    • 1. 概念
    • 2. 思路
    • 3. 代码实现

1. 概念

通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应的位置并插入。
插入排序非常类似于整扑克牌。在开始摸牌时,左手是空的,牌面朝下放在桌上。接着,一次从桌上摸起一张牌,并将它插入到左手一把牌中的正确位置上。为了找到这张牌的正确位置,要将它与手中已有的牌从右到左地进行比较。无论什么时候,左手中的牌都是排好序的。

2. 思路

① 把它想象成搬扑克牌,你首先搬到了第一张牌放到手里,接着你拿到了第二张牌,你要跟手里的第一张做一个比较,小的放左边大的放右边;

② 然后你又搬到了第三张牌,这时候我们一般是从右往左去观察手中的牌,一一与搬到的新牌作比较。当然,最先参与比较的一定是离它最近的那张牌(即第二张牌),如果新牌比第二张牌小,自然这个第二张牌是要向右移一位的(移了之后就不能叫它第二张了),如果新牌比第二张牌大,由于前面均已排好序,那么它就直接被放在了第二张牌的右边,结束比较;

③ 对应于程序,待排序数组我用 arr 来表示,当前待插入数据用 insertVal = arr[i] 表示,因为第一个数据是不需要进行比较的,所以这里的 i 从 1 开始,让 arr[1] 和 arr[0] 进行比较;

④ for 循环 i 的初始值为 1,每循环一次 i 就自增1,那结束状态呢?当走到最后一个数据的时候循环就到了尽头,而最后一个数据是 arr[arr.length - 1],所以这里的 i < arr.length;

⑤ 待插入数据要和谁来比较呢?初始情况下,肯定是跟它前面那一个数据进行比较,即 a[i - 1],在同一个待插入数据下,我们不太可能说只跟前一个数比较一下就完事了,往往还要跟前前个,前前前 … 个数据进行比较,也就是说这个被比较的数据,大概率是会改变的,所以,我这里用一个变量 index 来表示当前被比较数据的索引,i - 1 是初始情况下的值,在后续比较过程中,我们的 index 是会向左移动的,也就是以下代码中的 index–;

⑥ 由于待插入数据会从右往左不断地进行大小比较,而停止的具体位置我们也无法确定,那么这里,我们可以通过一个 while 循环来控制这个移动的动作;

⑦ 循环条件是什么呢?首先你既然要跟人家作比较,你必须得保证对方存在吧?不能说人家有都没有,你还隔这比较那就没有意义了。所以,这个被比较的数据索引一定要大于等于0(index >= 0),等于0的时候已经是尽头了,就不用再比较了啊。还有,如果说待插入数据比 arr[index] 要大,那么就没有必要循环下去了,直接把这个数据放到 index +1 位置即可。如果待插入数据比 arr[index] 小,就重复循环体中的动作,首先将 arr[index] 向后移一位(腾出位置),然后让 index 向前移一位(再跟下一位比较),一直重复,直到待插入数据比 arr[index] 大,才跳出循环;

⑧ 综上,我们的循环条件是 index >= 0 && insertVal < arr[index],循环结束之后,把待插入的数放入合适位置,index + 1 的位置。

3. 代码实现

public class Main {
    public static void main(String[] args) {
        int[] arr = {3, 2, 9, 11, 17, 4, 13, 7, 5, 1, 12};
        int[] newArr = sort(arr);
        for (int number : newArr) {
            System.out.print(number + " ");
        }
    }

    public static int[] sort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int insertVal = arr[i];
            int index = i - 1;
            while (index >= 0 && insertVal < arr[index]) {
                arr[index + 1] = arr[index];
                index--;
            }
            arr[index + 1] = insertVal;
        }
        return arr;
    }
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

程序员副业指南:怎样实现年入10w+的目标?

大家好&#xff0c;这里是程序员晚枫&#xff0c;全网同名。 今天给大家分享一个大家都感兴趣的话题&#xff1a;程序员可以做什么副业&#xff0c;年入十万&#xff1f; 01 推荐 程序员可以从事以下副业&#xff0c;以获得一年收入10w&#xff1a; 兼职编程&#xff1a;可…

数学知识(二)

一、裴蜀定理 对于任意整数a,b&#xff0c;一定存在非零整数x,y&#xff0c;使得 ax by gcd(a,b) #include<iostream> #include<algorithm>using namespace std;int exgcd(int a,int b,int &x,int &y) {if(!b){x 1,y 0;return a;}int d exgcd(b,a %…

铰接式车辆的横向动力学仿真提供车辆模型研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【Opencv入门到项目实战】(四):图像梯度计算|Sobel算子|Scharr算子|Laplacian算子

文章目录 0.引言1. Sobel算子2. Scharr算子3. Laplacian算子 0.引言 在图像处理中&#xff0c;梯度是指图像中像素灰度变化的速率或幅度&#xff0c;我们先来看下面这张图 假设我们想要计算出A点的梯度&#xff0c;我们可以发现A点位于边缘点&#xff0c;A点左边为黑色&#x…

74. 搜索二维矩阵

题目链接&#xff1a;力扣 解题思路&#xff1a;因为矩阵整体上是有序的&#xff0c;所以可以先二分查找target在哪一行中&#xff0c;然后再次二分查找target在当前行的哪一列中。 具体算法如下&#xff1a; 对行使用二分查找&#xff1a; 初始值&#xff1a; int m matrix…

Mr. Cappuccino的第55杯咖啡——Mybatis一级缓存二级缓存

Mybatis一级缓存&二级缓存 概述一级缓存特点演示前准备效果演示在同一个SqlSession中在不同的SqlSession中 源代码怎么禁止使用一级缓存一级缓存在什么情况下会被清除 二级缓存特点演示前准备效果演示在不同的SqlSession中 源代码怎么关闭二级缓存 一级缓存&#xff08;Spr…

ad+硬件每日学习十个知识点(18)23.7.29 (LDO原理、LDO的补偿引脚)

文章目录 1.LDO名字介绍2.LDO的应用范围3.LDO的原理4.LDO输出端和输入端的差值至少满足多少V&#xff1f;怎么计算的&#xff1f;5.输出的误差和输出电流&#x1f446;&#xff08;右下角图像&#xff09;6.LDO一般会有个引脚是做补偿之用&#xff0c;datasheet会说明一个器件的…

C++20 协程(coroutine)入门

文章目录 C20 协程&#xff08;coroutine&#xff09;入门什么是协程无栈协程和有栈协程有栈协程的例子例 1例 2 对称协程与非对称协程无栈协程的模型无栈协程的调度器朴素的单线程调度器让协程学会等待Python 中的异步函数可等待对象M:N 调度器——C# 中的异步函数 小结 C20 中…

如何在 Ubuntu 上部署 ONLYOFFICE 协作空间社区版?

ONLYOFFICE 协作空间是一个在线协作平台&#xff0c;帮助您更好地与客户、业务合作伙伴、承包商及第三方进行文档协作。今天我们来介绍一下&#xff0c;如何在 Ubuntu 上安装协作空间的自托管版。 ONLYOFFICE 协作空间主要功能 使用 ONLYOFFICE 协作空间&#xff0c;您可以&am…

安全文件传输的重要性及其对企业的影响

在当今的信息时代&#xff0c;企业之间的文件传输已经成为日常工作的重要组成部分。无论是在商务合作、人力资源还是财务审计等方面&#xff0c;文件传输都发挥着关键的作用。然而&#xff0c;随着网络技术的发展&#xff0c;网络安全问题也日益突出&#xff0c;泄漏、篡改、丢…

复习之selinux的管理

一、什么是selinux? SELinux&#xff0c;Security Enhanced Linux 的缩写&#xff0c;也就是安全强化的 Linux&#xff0c;是由美国国家安全局&#xff08;NSA&#xff09;联合其他安全机构&#xff08;比如 SCC 公司&#xff09;共同开发的&#xff0c;旨在增强传统 Linux 操…

Jmeter 压测工具使用手册[详细]

1. jemter 简介 jmeter 是 apache 公司基于 java 开发的一款开源压力测试工具&#xff0c;体积小&#xff0c;功能全&#xff0c;使用方便&#xff0c;是一个比较轻量级的测试工具&#xff0c;使用起来非常简 单。因为 jmeter 是 java 开发的&#xff0c;所以运行的时候必须先…

paddlenlp:社交网络中多模态虚假媒体内容核查

初赛之环境配置篇 一、背景二、任务三、数据集1、初赛阶段2、评分标准 四、环境操作五、写在最后 一、背景 随着新媒体时代信息媒介的多元化发展&#xff0c;各种内容大量活跃在媒体内中&#xff0c;与此同时各类虚假信息也充斥着社交媒体&#xff0c;影响着公众的判断和决策。…

vue3—SCSS的安装、配置与使用

SCSS 安装 使用npm安装scss&#xff1a; npm install sass sass-loader --save-dev 配置 配置到全局 &#x1f31f;附赠代码&#x1f31f; css: {preprocessorOptions: {scss: {additionalData:import "./src/Function/Easy_I_Function/Echarts/ToSeeEcharts/utill.…

防火墙规则分析管理

防火墙规则在高效的网络安全管理中起着至关重要的作用&#xff0c;在添加规则之前&#xff0c;确保提议的新规则不会对网络产生负面影响至关重要。 通过防火墙规则影响分析&#xff0c;安全管理员可以详细了解添加新规则的可能影响&#xff0c;防火墙规则影响分析的一个重要方…

智能卡通用安全检测指南 思度文库

范围 本标准规定了智能卡类产品进行安全性检测的一般性过程和方法。 本标准适用于智能卡安全性检测评估和认证。 规范性引用文件 下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件&#xff0c;仅注日期的版本适用于本文件。凡是不注日期的引用文件&#xff0c;…

git仓库与本地暂存区的同步问题

向下同步 对于远程仓库的项目&#xff0c;初始化一个配置文件&#xff0c;配置远程仓库及相关信息&#xff0c;赋值远程仓库的地址&#xff0c;使用git pull命令即可拉取仓库代码。 git pull [remote_addr] 该部分完成向下同步 向上同步 向上同步时会遇到很多的问题&#xf…

6.3 填充和步幅

一.填充 1.作用&#xff1a; 为了防止丢失边缘像素。如240x240的像素图像&#xff0c;经过10层5x5卷积&#xff0c;变成了200x200像素。可以根据输出形状计算公式 (w-k1) x (h-k1)计算得出。 2.方法: 最常用的方法是填充0。如下&#xff1a; 3.公式&#xff1a;计算填充原…