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

目录

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.hqwc.cn/news/701760.html

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

相关文章

虚拟化技术 在vCenter Server创建数中心、添加主机

一、实验内容 1.安装Flash 2.在vCenter Server创建数中心、添加主机 二、实验主要仪器设备及器材 1.安装有64位Windows操作系统的台式电脑或笔记本电脑&#xff0c;建议4C8G或以上配置 2.在Windows Server 2008 R2已安装vCenter Server 3.Adobe Flash Player 12.0.0.70.e…

Tomcat Server无法连通的调试方法1

作者&#xff1a;私语茶馆 1.局域网Tomcat服务不通 组网如下&#xff1a; 问题&#xff1a; Tomcat Server 服务方式启动后&#xff0c;无法访问&#xff0c;但命令行方式启动可以。IP地址都在同网段或不同网段现象都一样。 调试手段&#xff1a; &#xff08;1&#xff09;…

基于Django实现的(bert)深度学习文本相似度检测系统设计

基于Django实现的&#xff08;bert&#xff09;深度学习文本相似度检测系统设计 开发语言:Python 数据库&#xff1a;MySQL所用到的知识&#xff1a;Django框架工具&#xff1a;pycharm、Navicat、Maven 系统功能实现 登录页面 注册页面&#xff1a;用户账号&#xff0c;密码…

HyperLogLog的使用做UV统计

使用Jedis连接Redis并操作HyperLogLog import redis.clients.jedis.Jedis;public class RedisHyperLogLogExample {public static void main(String[] args) {// 连接到本地的Redis服务Jedis jedis new Jedis("localhost", 6379);String hyperLogLogKey "hll…

智慧安防监控EasyCVR视频汇聚管理平台视频播放花屏的原因分析及处理

智慧安防监控EasyCVR视频管理平台能在复杂的网络环境中&#xff0c;将前端设备统一集中接入与汇聚管理。国标GB28181协议视频监控/视频汇聚EasyCVR平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、…

机器学习实战宝典:用scikit-learn打造智能应用

书接上文——《数据探险家的终极指南&#xff1a;用Python挖掘机器学习的奥秘》 前文我们在这段精彩的机器学习探险之旅中&#xff0c;从基础概念出发&#xff0c;深入探索了使用Python和scikit-learn库进行数据分析和模型构建的全过程。 我们首先了解了机器学习的基本原理&am…

47 tcp网络程序

网路聊天 API详解 下面用到的API&#xff0c;都在sys/socket.h中 socket (): socket() 打开一个网络通讯端口&#xff0c;如果成功的话&#xff0c;就像open() 一样返回一个文件描述符应用程序可以像读文件一样用read/write在网络上收发数据如果调用出错返回-1对于IPv4&am…

Dubbo3.x 异步转同步源码

底层netty通信是异步的&#xff0c;那我们平时调用采取的同步是如何将底层的异步转为同步的呢&#xff1f; dubbo远程rpc协议和网络框架有多种&#xff0c;我们以默认的dubbo协议、网络框架netty作为切入点. 注意点&#xff1a;debug时将过期时间设置长一点&#xff1a; 调用…

SpringBoot解决CORS跨域——WebMvcConfigurationSupport

前端请求后端报错了。 状态码&#xff1a;403 返回错误&#xff1a;Invalid coRs request 增加配置类WebMvcConfig Configuration public class WebMvcConfig extends WebMvcConfigurationSupport {Overridepublic void addCorsMappings(CorsRegistry registry) {// 允许跨域…

prompt工程策略(三:使用 LLM 防护围栏创建系统提示)

原文&#xff1a;我是如何赢得GPT-4提示工程大赛冠军的 原文的原文&#xff1a; How I Won Singapore’s GPT-4 Prompt Engineering Competition &#xff01;&#xff01;本内容仅适用于具有 System Prompt&#xff08;系统提示&#xff09;功能的 LLM。具有这一功能的最著名 …

PG pageinspect使用与块空间清理学习

1.创建有时候会报错 ERROR: could not open extension control file "/usr/local/pgsql/share/extension/pageinspect.control": No such file or directory 解决方案&#xff1a; 2.使用 PostgreSQL中&#xff0c;对于每一行数据&#xff08;称为一个tuple&#…

GRE over IPsec VPN实验

一、拓扑图 二、组网需求 某企业总部、分支1、分支2分别通过 R1&#xff0c;R3&#xff0c;R4 接入互联网&#xff0c;配置默认路由连通公网按照图示配置 IP 地址&#xff0c;R1&#xff0c;R3&#xff0c;R4 分别配置 Loopback0 口匹配感兴趣流&#xff0c;Loopback1 口模拟业…