数据结构与算法-排序算法3-插入排序

news2024/11/16 4:47:25

目录

1.插入排序:

1.介绍:

2.动态图解

3.举例

4.小结插入排序规则

5.插入排序代码

6.运行时间

代码:

运行结果:


1.插入排序:

1.介绍:

数组中n个元素,把这n个待排序元素看成一个有序序列和一个无序序列。开始时有序序列中只有一个元素,无序序列中有n-1个元素。排序过程中每次从无序序列中取出第一个元素,把它与有序序列中元素进行比较,将它插入到有序序列中的适当位置。这样有序序列中就多了一个元素,无序序列中就少了一个元素。直到无序序列中没有元素了,整个数组中元素就排好序了。

插入排序是将无序序列中元素一个个插入到有序序列中。

2.动态图解

3.举例

比如原始数组为:(17),3,25,14,20,9

第一次插入:(3,17),25,14,20,9 因为初始时17作为有序序列中的元素,3作为无序序列中的第一个元素,就把3和17比较,3更小,插入到17前面

第二次插入:(3,17,25),14,20,9 将25和(3,17)比较,在3和17之间,所以插入到中间

第三次插入:(3,14,17,25),20,9 将14和(3,17,25)比较,在3和17之间,所以插入到中间

第四次插入:(3,14,17,20,25),9 将20和(3,14,17,25)比较,在17和25之间,所以插入到中间

第五次插入:(3,9,14,17,20,25) 将9和(3,14,17,20,25)比较,在3和14之间,所以插入到中间

因为假设第一个数据是有序的,所以只需要对后面的n-1个元素进行插入。

4.小结插入排序规则

①数组元素个数为n,就一共进行n-1次插入

②每一趟插入都是先记下待插入的值,待插入数的前一个下标。在循环中找比待插入数大的数的下标,没找到就让已经比较过的有序序列中的数往后移,这个下标往前移,找到的下标就是待插入的前一个位置。所以待插入的数下标就是这个移动下标的后一个,也就是+1。

5.插入排序代码

包括推导代码和最终代码

    public static void insertSort1(int[] arr) {
        //第一轮
        //定义待插入的数
        int insertVal = arr[1];//先保存
        int insertIndex = 1 - 1;//待插入数的前面一个下标
        //找到insetVal的位置
        //为了保证插入位置不越界,且待插入数还没有找到插入位置
        //就将arr[insertIndex]后移,也就是把位置让出来
        while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
            arr[insertIndex + 1] = arr[insertIndex];
            insertIndex--;
        }
        //退出循环时就已经找到插入位置,想想什么时候退出循环?
        // insertVal>=arr[insertIndex],值比找到的下标对应的值大了,那么值应该在的位置是不是在找到的下标后面。
        // insertIndex+1这个下标才是真正的待插入位置,把前面保存的待插入的数的值赋给这个下标
        arr[insertIndex + 1] = insertVal;
        System.out.println("第一轮插入:" + Arrays.toString(arr));
        //第二轮
        //定义待插入的数
        insertVal = arr[2];//先保存
        insertIndex = 2 - 1;//待插入数的前面一个下标
        //找到insetVal的位置
        //为了保证插入位置不越界,且待插入数还没有找到插入位置
        //就将arr[insertIndex]后移,也就是把位置让出来
        while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
            arr[insertIndex + 1] = arr[insertIndex];
            insertIndex--;
        }
        //退出循环时就已经找到插入位置,想想什么时候退出循环?
        // insertVal>=arr[insertIndex],值比找到的下标对应的值大了,那么值应该在的位置是不是在找到的下标后面。
        // insertIndex+1这个下标才是真正的待插入位置,把前面保存的待插入的数的值赋给这个下标
        arr[insertIndex + 1] = insertVal;
        System.out.println("第二轮插入:" + Arrays.toString(arr));
        //第三轮
        //定义待插入的数
        insertVal = arr[3];//先保存
        insertIndex = 3 - 1;//待插入数的前面一个下标
        //找到insetVal的位置
        //为了保证插入位置不越界,且待插入数还没有找到插入位置
        //就将arr[insertIndex]后移,也就是把位置让出来
        while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
            arr[insertIndex + 1] = arr[insertIndex];
            insertIndex--;
        }
        //退出循环时就已经找到插入位置,想想什么时候退出循环?
        // insertVal>=arr[insertIndex],值比找到的下标对应的值大了,那么值应该在的位置是不是在找到的下标后面。
        // insertIndex+1这个下标才是真正的待插入位置,把前面保存的待插入的数的值赋给这个下标
        arr[insertIndex + 1] = insertVal;
        System.out.println("第三轮插入:" + Arrays.toString(arr));
        //第四轮
        //定义待插入的数
        insertVal = arr[4];//先保存
        insertIndex = 4 - 1;//待插入数的前面一个下标
        //找到insetVal的位置
        //为了保证插入位置不越界,且待插入数还没有找到插入位置
        //就将arr[insertIndex]后移,也就是把位置让出来
        while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
            arr[insertIndex + 1] = arr[insertIndex];
            insertIndex--;
        }
        //退出循环时就已经找到插入位置,想想什么时候退出循环?
        // insertVal>=arr[insertIndex],值比找到的下标对应的值大了,那么值应该在的位置是不是在找到的下标后面。
        // insertIndex+1这个下标才是真正的待插入位置,把前面保存的待插入的数的值赋给这个下标
        arr[insertIndex + 1] = insertVal;
        System.out.println("第四轮插入:" + Arrays.toString(arr));
        //发现输出和推的一样,就推四轮
        /*
        第一轮插入:[3, 17, 25, 14, 20, 9]
        第二轮插入:[3, 17, 25, 14, 20, 9]
        第三轮插入:[3, 14, 17, 25, 20, 9]
        第四轮插入:[3, 14, 17, 20, 25, 9]
         */
    }

    //归纳找到规律后就用两层循环写
    public static void insertSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int insertVal = arr[i];
            int insertIndex = i - 1;
            while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
                arr[insertIndex + 1] = arr[insertIndex];
                insertIndex--;
            }
            arr[insertIndex + 1] = insertVal;
            System.out.println("第" + i + "轮插入:" + Arrays.toString(arr));
        }
    }
}

运行结果:

6.运行时间

插入段记录时间的代码。排序前记一次时间,排序后记一次时间。

然后输出元素的代码就先注释掉。

代码:

package com.xjj.sort;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class InsertSort {
    public static void main(String[] args) {
//        int[] arr = {17, 3, 25, 14, 20, 9};
//        insertSort(arr);
        int arr2[]=new int[80000];
        for(int i=0;i<80000;i++){
            arr2[i]=(int)(Math.random()*80000);
        }
        Date date1=new Date();
        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date1Str=simpleDateFormat.format(date1);
        System.out.println("排序前的时间为:"+date1Str);
        insertSort(arr2);
        Date date2=new Date();
        String date2Str=simpleDateFormat.format(date2);
        System.out.println("排序后的时间为:"+date2Str);
    }

    //归纳找到规律后就用两层循环写
    public static void insertSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int insertVal = arr[i];
            int insertIndex = i - 1;
            while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
                arr[insertIndex + 1] = arr[insertIndex];
                insertIndex--;
            }
            arr[insertIndex + 1] = insertVal;
//            System.out.println("第" + i + "轮插入:" + Arrays.toString(arr));
        }
    }
}

运行结果:

80000个元素,选择排序运行时间1秒。


插入排序是将无序序列中元素一个个插入到有序序列中


后面会继续写希尔排序等排序算法的内容。分类排序部分写完之后再给出一些题目练习^_^加油加油

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

01 Triton backend

1 整体架构 三部分组成&#xff1a; Triton backend tensorRT_backend、onnx_backend、tfs_backend、torch_backend **Triton model ** 不同的模型 **Triton model instance ** 模型实例 ![P2}5X%2ULV(2OAC$_OKOP.png 2 设计思路 需要实现七个接口&#xff1a; TRITON…

Elasticsearch - HTTP

文章目录 安装基本语法索引创建索引查看索引删除索引 文档创建文档更新文档匹配查询多条件查询聚合查询映射 安装 https://www.elastic.co/downloads/past-releases/elasticsearch-7-17-0 下载完成启动bin/elasticsearch服务&#xff0c;可以在Postman调试各种请求。 基本语法…

风电功率预测 | 基于遗传算法优化BP神经网络实现风电功率预测(附matlab完整源码)

风电功率预测 风电功率预测 | 基于遗传算法优化BP神经网络实现风电功率预测(附matlab完整源码)完整代码风电功率预测 | 基于遗传算法优化BP神经网络实现风电功率预测(附matlab完整源码) 基于遗传算法优化BP神经网络是一种常见的方法,用于改进BP神经网络在风电功率预测中的性…

IBM Granite模型开源:推动软件开发领域的革新浪潮

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

基于MSWA相继加权平均的交通流量分配算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于MSWA相继加权平均的交通流量分配算法matlab仿真.如图所示交通网络中&#xff0c;包含6个节点、11各路段、9个OD对。经枚举可得每个OD对间存在3条无折返有效路…

RS编码和卷积码总结

RS编码 简要介绍RS编码及其原理 1. RS编码简介 Reed-Solomon编码&#xff08;RS编码&#xff09;是一种强大的纠错码&#xff0c;广泛应用于数据存储和传输中。RS编码由Irving S. Reed和Gustave Solomon于1960年提出&#xff0c;属于BCH码的一种&#xff0c;是基于有限域&am…

免费思维13招之十二:耗材型思维

免费思维13招之十二:耗材型思维 今天给你分享免费思维的两个子思维——相关性耗材思维和非相关性耗材思维。 相关性耗材思维,是指有一些产品的使用,需要大量的相关耗材,从而对该产品进行免费,而耗材进行资费。 举例:全世界最大的一家直销公司叫安利,它的明星产品是净水…

【Python探索之旅】列表

目录 特点 入门 访问元素 新增元素 修改元素 插入元素 删除元素 完结撒花 前言 在Python中&#xff0c;列表(List)是最常用的数据结构之一&#xff0c;类似于其他语言&#xff0c;如Java&#xff0c;与其不同啊Python中不需要声明数据类型。它提供了一种灵活且高效的方式…

数学建模入门手册

数模的主要比赛 美赛&#xff08;报名费100美元&#xff0c;每年2月比赛&#xff09;&#xff1b;国赛&#xff08;每年9月&#xff09; 电工杯&#xff08;每年5月&#xff09;&#xff1b;APMCM&#xff08;每年11月&#xff09;&#xff1b;MathorCup&#xff08;每年4月&a…

3.TCP的三次握手和四次挥手

一、前置知识 TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。在传输数据前通信双方必须建立连接&#xff08;所谓连接&#xff0c;是指客户端和服务端各自保存一份关于对方的信息&#xff0c;比如ip地址&#xff0c;端口号等&#xff09;。TCP通过三次握手建立一个…

Spring Boot 整合讯飞星火3.5通过接口Api接口实现聊天功能(首发)复制粘贴即可使用,后续更新WebSocket实现聊天功能

程序员必备网站&#xff1a; 天梦星服务平台 (tmxkj.top)https://tmxkj.top/#/ 1.pom.xml <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.72</version></dependency><depen…

信噪比(SNR)的基本定义及注意事项

本文介绍信噪比&#xff08;SNR&#xff09;的基本定义及注意事项。 1.基本定义 信噪比&#xff08;SNR&#xff09;&#xff0c;指的是系统中信号与噪声的比&#xff0c;通常用分贝&#xff08;dB&#xff09;表示。 1)用功率来描述 &#xff0c;分别为信号和噪声的功率 2…

Hello,World驱动之旅,用户层简单交互(三)

目录 &#xff08;一&#xff09;上篇回顾&#xff1a;上一篇讲到用户层怎么与驱动模块进行交互。Hello&#xff0c;World驱动之旅&#xff0c;对外接口(二)-CSDN博客 &#xff08;二&#xff09;通过简单程序与驱动交互 读操作&#xff0c;代码如下&#xff1a; 写操作&…

Day28

回溯算法part02 LC组合总和II 终止条件&#xff0c;sumn且mid.size()k加入result。其他终止条件sum>n或者mid.size()>k也结束一样可以引入剪枝操作进行优化&#xff0c;其实sum>n也可以算是剪枝操作的一部分 LC17电话号码的字母组合&#xff08;超时5min&#xff…

复利效应(应用于成长)

应用 每个人在智力、知识、经验上&#xff0c;复利效应都一样&#xff0c;只要能积累的东西&#xff0c;基本上最终都会产生复利效应。 再来看一下复利公式&#xff1a;FP*(1i)^n P本金&#xff1b;i利率&#xff1b;n持有期限。在使用时&#xff0c;一定要注意4个限定条件&a…

网络安全快速入门(十二)(下) 目录结构相关命令补充

12.4 补充命令 我们已经了解了linux的目录结构&#xff0c;接下来我们大概看一下针对目录及文件的一些相关命令&#xff0c; 我们本章只讲三个目录及文件相关的命令&#xff0c;分别是tree&#xff0c;find及校验文件命令&#xff0c;我们一个一个来看这些命令。 12.4.1 tree命…

数学建模——线性回归模型

目录 1.线性回归模型的具体步骤和要点&#xff1a; 1.收集数据&#xff1a; 2.探索性数据分析&#xff1a; 3.选择模型&#xff1a; 4.拟合模型&#xff1a; 5.评估模型&#xff1a; 1.R平方&#xff08;R-squared&#xff09;&#xff1a; 2.调整R平方&#xff08;Ad…

LeetCode 126题:单词接龙 II

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

[初学者来练]用html+css+javascript个人博客作业需求

文章目录 项目概述项目需求页面设计主页文章列表页文章详情页用户交互额外功能&#xff08;可选&#xff09; 技术要求提交要求评分标准文件代码格式提示HTML 页面结构CSS 样式设计JavaScript 交互功能 项目概述 这个项目旨在通过使用HTML、CSS和JavaScript创建一个简单而功能…

零样本身份保持:ID-Animator引领个性化视频生成技术新前沿

在最新的研究进展中&#xff0c;由Xuanhua He及其团队提出的ID-Animator技术&#xff0c;为个性化视频生成领域带来了突破性的创新。这项技术的核心在于其零样本&#xff08;zero-shot&#xff09;人物视频生成方法&#xff0c;它允许研究者和开发者根据单一的参考面部图像生成…