插入排序

插入排序

      • 概述
      • 步骤
      • 代码示例
      • 输出结果

概述

插入排序是一种最简单直观的排序算法,它的工作原理是通过创建有序序列和无序序列,然后再遍历无序序列得到里面每一个数字,把每一个数字插入到有序序列中正确的位置。

插入排序是一种简单直观的排序算法,其基本思想是将未排序的元素逐个插入到已排序序列中的正确位置,从而构建有序的序列。

插入排序在插入的时候,有优化算法,在遍历有序序列找正确位置时,可以采取二分查找

插入排序的时间复杂度为 O(n^2),但是在处理小型数组或基本有序的数组时,插入排序的性能往往比其他复杂的排序算法更好。此外,插入排序是稳定的排序算法,即具有相等值的元素在排序后的相对位置不会改变。

步骤

插入排序的过程如下:

  1. 从第一个元素开始,认为该元素已经是有序序列。

  2. 取出下一个元素,将其与已排序的元素从右到左依次比较。

  3. 如果已排序的元素大于当前元素,则将已排序的元素后移一位,继续比较前一个已排序的元素。

  4. 重复步骤 3,直到找到一个已排序的元素小于或等于当前元素,或者到达已排序序列的起始位置。

  5. 将当前元素插入到已排序序列中找到的位置后面。

  6. 重复步骤 2 到 5,直到所有元素都被插入到有序序列中。

插入排序每次将一个元素插入到已排序序列中,并将该元素放置在正确的位置上。通过逐步扩大已排序的部分,最终完成整个数组的排序。

黑马程序员阿伟老师制作的

将0索引的元素到N索引的元素看做是有序的,把N+1索引的元素到最后一个当成是无序的。遍历无序的数据,将遍历到的元素插入有序序列中适当的位置,如遇到相同数据,插在后面。

N的范围:0~最大索引

代码示例

需求:采用插入排序将下列数据进行排序,数据如下{3, 23, 36, 37, 40, 43, 44, 38, 5, 47, 15, 47, 36, 26, 27, 2, 46, 4, 19, 23, 50, 23, 48};

例如:

package text.text02;/*
插入排序:插入排序是一种最简单直观的排序算法,它的工作原理是通过创建有序序列和无序序列,然后再遍历无序序列得到里面每一个数字,把每一个数字插入到有序序列中正确的位置。插入排序在插入的时候,有优化算法,在遍历有序序列找正确位置时,可以采取二分查找*/
public class text13A {public static void main(String[] args) {int[] arr = {3, 23, 36, 37, 40, 43, 44, 38, 5, 47, 15, 47, 36, 26, 27, 2, 46, 4, 19, 23, 50, 23, 48};//定义一个变量记录无序序列的起始索引int startIndex = -1;//遍历数组,找到无序序列的起始索引for (int i = 0; i < arr.length - 1; i++) {//表明前i-1个数和第i+1个数都小于第i个数,说明前i个数都是有序的,第i+1个数以后都是无序的if (arr[i] > arr[i + 1]) {//将无序序列的起始索引赋值给startIndexstartIndex = i + 1;break;}}//调用method1方法遍历数组,将无序序列中的数据插入到有序序列中(顺序查找/基本查找)int[] arr1 = method1(arr, startIndex);//调用method2方法遍历数组,将无序序列中的数据插入到有序序列中(折半查找/二分查找)int[] arr2 = method2(arr, startIndex);//调用printfArray方法遍历输出数组数据System.out.println("这是基本查找/顺序查找的方法:");printfArray(arr1);     //2	3	4	5	15	19	23	23	23	26	27	36	36	37	38	40	43	44	46	47	47	48	50System.out.println();  //换行System.out.println("这是折半查找/二分查找的方法:");printfArray(arr2);    //2	3	4	5	15	19	23	23	23	26	27	36	36	37	38	40	43	44	46	47	47	48	50}//遍历数组方法1,将无序序列中的数据插入到有序序列中(顺序查找/基本查找)public static int[] method1(int[] arr, int startIndex) {for (int i = startIndex; i < arr.length; i++) {//定义一个变量记录i的值(因为后面要更改j的值(j--),如果直接更改i,则循环永远不到达到i < arr.length)int j = i;while (j > 0 && arr[j - 1] > arr[j]) {    //j表示无序序列的其实索引,j-1表示有序序列的最后索引//交换数据int temp = arr[j];arr[j] = arr[j - 1];arr[j - 1] = temp;j--;}}return arr;}//遍历数组方法2,将无序序列中的数据插入到有序序列中(折半查找/二分查找)public static int[] method2(int[] arr, int startIndex) {//利用循环交换数组元素进行排序for (int i = startIndex; i < arr.length; i++) {//调用judgeIndex方法获取要插入元素的位置int index = judgeIndex(arr, i);//定义一个变量记录要插入的数int number = arr[i];//利用循环将已排序部分中要插入位置之后的元素向右移动,为待插入元素腾出空间(从 i1 开始向左遍历,将每个元素向右移动一位,直到达到插入位置 index。)for (int i1 = i; i1 > index; i1--) {arr[i1] = arr[i1 - 1];}//将记录要插入的值的变量赋值给要插入的位置arr[index] = number;}return arr;}//定义方法用来判断要插入的数的位置public static int judgeIndex(int[] arr, int startIndex) {//定义变量记录已经排序的数中的起始索引int min = 0;//定义变量记录已经排序的数中的结束索引int max = startIndex - 1;//利用循环找到要插入的位置while (min <= max) {//获取已排序的数的中间索引int mid = (min + max) / 2;//如果中间索引所对应的数等于要插入得数if (arr[mid] == arr[startIndex]) {return mid;}//如果中间索引所对应的数小于要插入得数if (arr[mid] < arr[startIndex]) {min = mid + 1;}//如果中间索引所对应的数大于要插入得数if (arr[mid] > arr[startIndex]) {max = mid - 1;}}//当循环结束时,“min” 指针指向了插入位置的右侧。在每次二分查找的过程中,如果目标元素小于当前中间元素,那么 “max” 指针会更新为 “mid - 1”,如果目标元素大于当前中间元素,那么 “min” 指针会更新为 “mid + 1”。最终当满足 “min > max” 时,说明目标元素应该插入的位置就是 “min” 指向的位置。因此,当二分查找未找到目标元素时,插入位置就是 “min” 所指向的位置,所以返回 “min”。如果找到目标元素,那么也返回该元素在数组中的位置。return min;}//遍历输出数组数据public static void printfArray(int[] arr) {for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + "\t");}}
}

输出结果

在这里插入图片描述

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

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

相关文章

某马头条——day10

热文章数据查询 分布式任务调度xxl-job 概述 环境搭建 docker化部署 docker run -p 3306:3306 --name mysql57 \ -v /opt/mysql/conf:/etc/mysql \ -v /opt/mysql/logs:/var/log/mysql \ -v /opt/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORDroot\ -d mysql:5.7 dock…

尝试给docker ubuntu22.04镜像添加远程访问桌面

实在时不愿折腾&#xff0c;但是ubuntu 镜像没有桌面&#xff0c;有些操作实在太难受了&#xff0c;效率也不高。硬着头皮上吧。幸亏这是个docker的镜像。要是个虚拟机&#xff0c;这折腾来去&#xff0c;直接崩溃了。docker的好处就是立马就能从头来过&#xff0c;秒级的删除安…

分辨率 时钟频率 lane速率计算

PCLK: pixel clock(像素频率) 计算方法如下&#xff1a; 以1920x1080p/60hz为例&#xff0c;total pixel&#xff1a;2200&#xff0c;total line&#xff1a;1125&#xff0c;filed rate&#xff1a;60Hz&#xff0c;那么&#xff1a;PCLK 2200*1125*60 148.5MHz&#xff1b…

ATF(TF-A)安全通告TF-V11——恶意的SDEI SMC可能导致越界内存读取(CVE-2023-49100)

目录 一、ATF(TF-A)安全通告TFV-11 (CVE-2023-49100) 二、透过事务看本质SDEI是干啥的呢&#xff1f; 三、CVE-2023-49100 1、GICv2 systems 2、GICv3 systems 四、漏洞修复 一、ATF(TF-A)安全通告TFV-11 (CVE-2023-49100) Title 恶意的SDEI SMC可能导致越界内存读取&am…

Spring Security架构

文章目录 过滤器回顾DelegatingFilterProxyFilterChainProxySecurityFilterChainSecurity Filters打印Security Filters将自定义过滤器添加到过滤器链 Handling Security ExceptionsSaving Requests Between AuthenticationRequestCachePrevent the Request From Being Saved R…

Mysql的备份以及恢复

第五章 MySQL的备份及恢复 5.1 MySQL日志管理 在数据库保存数据时&#xff0c;有时候不可避免会出现数据丢失或者被破坏&#xff0c;这样情况下&#xff0c;我们必须保证数据的安全性和完整性&#xff0c;就需要使用日志来查看或者恢复数据了 数据库中数据丢失或被破坏可能原…

Spring SpEL在Flink中的应用-与Filter结合实现数据动态分流

文章目录 前言一、POM依赖二、主函数代码示例三、FilterFunction实现总结 前言 SpEL表达式与Flink fiter结合可以实现基于表达式的灵活动态过滤。有关SpEL表达式的使用请参考Spring SpEL在Flink中的应用-SpEL详解。 可以将过滤规则放入数据库&#xff0c;根据不同的数据设置不…

【c++学习】数据结构中的顺序表

c顺序表 数据结构中的顺序表代码 数据结构中的顺序表 顺序表强调数据的存储结构&#xff0c;表示数据在内存中连续存储。&#xff08;线性表与链表相对&#xff0c;链表数据在内存中的存储空间是不连续的&#xff09; 代码 下述代码实现了线性表及其接口 包括增、删、查、改…

《游戏-01_3D-开发》之—人物动画控制器

创建变量&#xff0c; 创建线&#xff0c; 连接&#xff0c; 选中线会变为蓝色&#xff0c;新增变量&#xff0c; 设置线&#xff0c; 双击子层进入子层&#xff0c; 创建变量&#xff0c; 双击SkillPanel 拖拽好之后返回上一层&#xff0c; 依次连接&#xff0c; 设置线&#…

解释LoRA参数

目录 LoRA参数含义 LoRA在深度学习中的作用 示例代码中的LoRA应用 结论 LoRA参数含义 LoRA (lora_r): LoRA代表"Low-Rank Adaptation"&#xff0c;是一种模型参数化技术&#xff0c;用于在不显著增加参数数量的情况下调整预训练模型。lora_r参数指的是LoRA中的秩&…

[Tomcat] [从安装到关闭] MAC部署方式

安装Tomcat 官网下载&#xff1a;Apache Tomcat - Apache Tomcat 9 Software Downloads 配置Tomcat 1、输入cd空格&#xff0c;打开Tomca目录&#xff0c;把bin文件夹直接拖拉到终端 2、授权bin目录下的所有操作&#xff1a;终端输入[sudo chmod 755 *.sh]&#xff0c;回车 …

springboot(ssm干洗店预约洗衣系统 衣物清洗预约系统Java系统

springboot(ssm干洗店预约洗衣系统 衣物清洗预约系统Java系统 开发语言&#xff1a;Java 框架&#xff1a;springboot&#xff08;可改ssm&#xff09; vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7…

docker: 搭建 harbor 镜像仓库

harbor 企业级内网镜像管理软件&#xff0c;加速拉取镜像速度&#xff0c;web 页面管理方便。 系统优化 systemctl stop NetworkManager systemctl disable NetworkManager iptables -F systemctl restart docker安装docker [roottest05 ~]# yum install -y docker-compose…

【GitHub项目推荐--不错的 Go 学习项目】【转载】

开源实时性能分析平台 Pyroscope 是基于 Go 的开源实时性能分析平台&#xff0c;在源码中添加几行代码 pyroscope 就能帮你找出源代码中的性能问题和瓶颈、CPU 利用率过高的原因&#xff0c;调用树展示帮助你理解程序&#xff0c;支持 Go、Python、Ruby 语言。 Pyroscope 可以…

nestjs之适配器模式的应用

NestJS 是一个用于构建高效、可靠和可扩展的服务器端应用程序的框架。在 NestJS 中&#xff0c;适配器模式&#xff08;Adapter Pattern&#xff09;主要体现在其对不同类型的 HTTP 服务端框架的适配上。NestJS 本身是建立在 Express 或者 Fastify 这样的底层 HTTP 框架之上的&…

openssl3.2/test/certs - 033 - time stamping certificates

文章目录 openssl3.2/test/certs - 033 - time stamping certificates概述笔记END openssl3.2/test/certs - 033 - time stamping certificates 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 /*! \file my_openssl_linux_log_doc_033.txt\note openssl3.2/test/ce…

《解释与话语权》——西游真假美猴王是自导自演吗

解读与话语权 引言 一旦有人或者组织垄断了话语权&#xff0c;那么什么都可以被重新定义和解读&#xff0c;本篇旨在让读者有更多视角的思考。 为什么一个耶和华能分裂成天主教&#xff0c;东正教&#xff0c;新教等&#xff0c;都是对于圣经和圣经故事的不同解读。 红学那…

解析GPT-3、GPT-4和ChatGPT关系-迈向自然语言处理的新高度“

Hello&#xff0c;小索奇&#xff01;很高兴为你拓展关于GPT-3、GPT-4、ChatGPT之间关系的信息&#xff0c;以及解释自然语言模型和Transformer的区别。 首先&#xff0c;GPT-3、GPT-4、ChatGPT都是建立在GPT系列技术基础上的自然语言处理模型。它们在不同的代数、性能和应用场…

k8s的图形化工具---rancher

rancher是一个开源的企业级多集群的k8s管理平台。 rancher和k8s的区别&#xff1a;都是为了容器的调度和编排系统。但是rancher不仅可以调度还可以管理整个k8s集群。 rancher自带监控(普罗米修斯) 实验部署 master01 20.0.0.32 node01 20.0.0.34 node02 20.0.0.35 test …

linux系统mysql8单机多实例+主从复制部署

一、解压mysql压缩包 参考我的另一篇博文&#xff0c;tag.gz解压完并且配置完环境变量即可&#xff0c;暂时不要初始化 linux单机部署mysql(离线环境解压即可)-CSDN博客 二、修改配置文件 可能因为版本不同&#xff0c;我的这个配置可能不是通用的&#xff0c;我安装的是my…