15_插入排序算法(附java代码)

2023-11-11

15_插入排序算法

一、基本介绍

​ 插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。

二、插入排序算法

2.1 算法思想

​ 插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。下图为插入排序示意图:
在这里插入图片描述

三、代码实现

3.1 逐步分解插入排序

//逐步推导便于理解
//第一轮 {101,34,119,1} --> {34,101,119,1}

//定义待插入的数
int insertValue = arr[1];
int insertIndex = 1 - 1;    //即arr[1]前面这个数的下标

//给insertValue找到插入的位置
//说明
//1. insertIndex >= 0 保证在给insertValue找插入位置时不越界
//2.insertValue < arr[insertIndex] 待插入的数,还没有找到插入位置
while (insertIndex >= 0 && insertValue < arr[insertIndex]){
    arr[insertIndex + 1] = arr[insertIndex];
    insertIndex--;
}
//当退出while循环时,说明插入的位置找到,insertIndex + 1
arr[insertIndex + 1] = insertValue;

System.out.println("第一轮排序后:" + Arrays.toString(arr));


//第二轮{34,101,119,1} --> {34,101,119,1}
insertValue = arr[2];
insertIndex = 2 - 1;
while (insertIndex >= 0 && insertValue < arr[insertIndex]){
    arr[insertIndex + 1] = arr[insertIndex];
    insertIndex--;
}
//当退出while循环时,说明插入的位置找到,insertIndex + 1
arr[insertIndex + 1] = insertValue;

System.out.println("第二轮排序后:" + Arrays.toString(arr));

//第三轮{34,101,119,1} --> {1,34,101,119}
insertValue = arr[3];
insertIndex = 3 - 1;
while (insertIndex >= 0 && insertValue < arr[insertIndex]){
    arr[insertIndex + 1] = arr[insertIndex];
    insertIndex--;
}
//当退出while循环时,说明插入的位置找到,insertIndex + 1
arr[insertIndex + 1] = insertValue;

System.out.println("第三轮排序后:" + Arrays.toString(arr));

3.2 使用for循环进行代码整合

//使用for循环进行代码整理简化
for (int i = 1; i < arr.length; i++) {
    //定义待插入的数
    int insertValue = arr[i];
    int insertIndex = i - 1;    //即arr[1]前面这个数的下标

    //给insertValue找到插入的位置
    //说明
    //1. insertIndex >= 0 保证在给insertValue找插入位置时不越界
    //2.insertValue < arr[insertIndex] 待插入的数,还没有找到插入位置
    while (insertIndex >= 0 && insertValue < arr[insertIndex]){
        arr[insertIndex + 1] = arr[insertIndex];
        insertIndex--;
    }
    //当退出while循环时,说明插入的位置找到,insertIndex + 1
    //优化:判断是否需要赋值
    if ((insertIndex + 1) == i){
        arr[insertIndex + 1] = insertValue;
    }
    System.out.println("第" + i + "轮排序后:" + Arrays.toString(arr));
}

3.3 插入排序完整代码

import java.util.Arrays;

public class InsertSort {
    public static void main(String[] args) {
        int[] arr = {101,34,119,1,-1,89};
        System.out.println("排序前:" + Arrays.toString(arr));
        insertSort(arr);
        System.out.println("排序后:" + Arrays.toString(arr));
    }

    //插入排序
    public static void insertSort(int[] arr){
        //使用for循环进行代码整理简化
        for (int i = 1; i < arr.length; i++) {
            //定义待插入的数
            int insertValue = arr[i];
            int insertIndex = i - 1;    //即arr[1]前面这个数的下标

            //给insertValue找到插入的位置
            //说明
            //1. insertIndex >= 0 保证在给insertValue找插入位置时不越界
            //2.insertValue < arr[insertIndex] 待插入的数,还没有找到插入位置
            while (insertIndex >= 0 && insertValue < arr[insertIndex]){
                arr[insertIndex + 1] = arr[insertIndex];
                insertIndex--;
            }
            //当退出while循环时,说明插入的位置找到,insertIndex + 1
            //优化:判断是否需要赋值
            if ((insertIndex + 1) == i){
                arr[insertIndex + 1] = insertValue;
            }
            System.out.println("第" + i + "轮排序后:" + Arrays.toString(arr));
        }
    }
}
1] = insertValue;
            }
            System.out.println("第" + i + "轮排序后:" + Arrays.toString(arr));
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

15_插入排序算法(附java代码) 的相关文章

随机推荐

  • apache字体文件跨域_css引用跨域字体文件woff,eot,ttf问题

    今天把站点的字体的静态文件woff eot ttf放到cdn去速度快一些 改成了外链地址 居然不加载报错 用下面的公用地址可以正常使用 https cdn bootcss com font awesome 4 7 0 fonts 搜索下 是
  • H5 页面采坑记录

    1 页面布局时 上下滑动页面时通常会把一些盒子放在 section section 标签中 但是在一些机型如iphonex测试中 上下滑动页面会出现都抖动的情况 不知道什么原因 解决方案就是 不使用 section 标签 直接在大盒子中写滚
  • 多线程之常用线程安全类型分析

    写在前面 本文一起看下在日常工作中我们经常用到的线程安全的数据类型 以及一些经验总结 1 常用线程安全数据类型 1 1 jdk集合数据类型 jdk的集合数据类型分为两类 一种是线性数据结构 另外一种是字典结构 分别看下 1 1 1 线性数据
  • 通过PyInstaller打包报“文件遇到错误”

    前言 不知道大家在作为python程序后 是不是都通过PyInstaller打包给用户使用呢 但是通过PyInstaller打包会出现一点小小的问题 本文章就来教你如何去解决这些问题 让打包后显示出控制台窗口 在打包的时候 不用加上 w让窗
  • 解码(二):音视频解码上下文创建配置和打开avcodec_open2打开演示

    如下代码 视频解码器打开 找到视频解码器 AVCodec vcodec avcodec find decoder ic gt streams videoStream gt codecpar gt codec id if vcodec cou
  • 远期与期货

    概述 期货合约与远期合约都是规定在将来的某一时间购买或者出售某项资产 这一点与期权类似 关键不同之处在于 期权持有者不会被强制购买或者出售资产 当无利可图时 可以选择放弃交易 但是 期货或者远期合约由必须履行事先约定的合约义务 远期 仅仅是
  • Java Lombok 报错(IllegalAccessError: class lombok.javac.apt.LombokProcessor)解决方法

    本文主要介绍Java 中 使用Lombok报错 java java lang IllegalAccessError class lombok javac apt LombokProcessor的解决方法及示例代码 原文地址 Java Lom
  • Java Swing 如何让界面更加美观

    文章目录 一 设置窗体的背景图 二 设置Button组件 三 设置字体大小和颜色 四 设置组件的背景色 五 综合测试案例 一 设置窗体的背景图 利用JLable类的构造方法或方法加载图片 ImageIcon image new ImageI
  • 设计一个雇员Employee类

    题目内容 设计一个雇员Employee类 具体要求如下 1 设计雇员Employee类 记录雇员的情况 包括姓名 年薪 受雇时间 String name double salary MyDate start 2 定义MyDate类作为日期
  • 装系统时提示 无法在驱动器0分区上安装windows

    先看提示 先看提示 先看提示 1 在重装系统时遇到一个问题 无法在驱动器0分区上安装windows 2 解决方法 1 在当前安装界面按住Shift F10调出命令提示符窗口 2 输入diskpart 按回车执行 3 进入DISKPART命令
  • 负数为什么要用补码来表示?

    上篇文章讲了 负数在计算机中是怎么存储的 看完之后 应该对原码 反码 补码有了基本的了解了 今天 我们深入探讨一下 为什么计算机中要用补码来表示负数 首先 我们应该清楚 原码是方便给人看的 看到一个数的原码 我们就能根据符号位和后边的二进制
  • [144]如何用VBS编写一个简单的恶搞脚本

    windows系统的电脑 首先右击桌面 选择新建 文本文档 在桌面上新建一个文本文档 随后打开计算机或者是我的电脑 点击其中的组织 xp系统多为工具 选择下面的文件夹和搜索选项 在弹出的窗口中点击查看 向下滚到 找到隐藏已知文件类型的扩展名
  • Android(Kotlin)获取应用全局上下文 ApplicationContext

    需求 Android Kotlin 获取应用全局上下文 ApplicationContext 有些场景下需要使用的 Context 是和页面无关的 仅和应用进程相关 比如 读写文件或访问数据库 这些场景下 我们希望可以在项目内任意位置 直接
  • Allegro PCB的布局

    1 手工导入元器件 place manually进入放置设置页面 在需要放置的元器件前面打勾 可以依次放置元器件 2 快速放置元器件 place Quickplace 使用快速放置功能需要先画好板宽outline才可以 3 设置room区域
  • c++实现数据结构栈和队列

    1 栈 头文件 ifndef ZHAN H define ZHAN H define MAX 8 include
  • laravel-admin安装及使用教程

    安装命令 安装 Laravel 安装器 composer global require laravel installer 创建名为 shopAdmin 项目 laravel new shopAdmin 经过漫长的等待已经安装好了 进入项目
  • springboot中注入FilterRegistrationBean不生效原因

    springboot中注入FilterRegistrationBean不生效原因 回顾 最近自定义了两个过滤器 接口请求返回加密和sql注入处理过滤器 因为在封装一些工具包 我在单独调好之后 就打算做成一个注解 像springboot启动类
  • 基于自注意力机制的LSTM多变量负荷预测

    1 引言 在之前使用长短期记忆网络构建电力负荷预测模型的基础上 将自注意力机制 Self Attention 融入到负荷预测模型中 具体内容是是在LSTM层后面接Self Attention层 在加入Self Attention后 可以将负
  • 计算机操作系统--文件管理

    文件与文件系统 1 文件 文件 File 是具有符号名的 在逻辑上具有完整意义的一组相关信息项的集合 例如 一个源程序 一个目标程序 编译程序 一批待加工的数据和各种文档等都可以各自组成一个文件 信息项是构成文件内容的基本单位 可以是一个字
  • 15_插入排序算法(附java代码)

    15 插入排序算法 一 基本介绍 插入式排序属于内部排序法 是对于欲排序的元素以插入的方式找寻该元素的适当位置 以达到排序的目的 二 插入排序算法 2 1 算法思想 插入排序 Insertion Sorting 的基本思想是 把n个待排序的