【学习分享】小白写算法之插入排序篇

【学习分享】小白写算法之插入排序篇

  • 前言
  • 一、什么是插入排序算法
  • 二、插入排序算法如何实现
  • 三、C语言实现算法
  • 四、复杂度计算
  • 五、算法稳定性
  • 六、小结


前言

要学好每个算法,我觉得需要先总结出规律,然后自己去推演一遍,加深记忆,否则的话很难真正领悟算法真谛,以后也很难实际去应用起来。所以沉下心来慢慢学,学会算法真的很有意思哈~


一、什么是插入排序算法

想象一下我们在打扑克,我们每拿到一张牌习惯于将其插入到手中的扑克中并按顺序排列,这个就是我们第一次接触到插入排序算法。
在这里插入图片描述
如下动图展示了从10到1的逆序序列如何进行插入排序到顺序序列的过程。
在这里插入图片描述


二、插入排序算法如何实现

我们设定一个序列{6,5,3,4,2,1},第i轮需要做的事情是把第i个数插入到正确的位置。
在这里插入图片描述

插入到正确的位置怎么实现?
我们选择第3轮进行分析,分析见下图。
在这里插入图片描述

分析:
所以第3轮中一共执行了3次。
第1次4跟第2个(数组中计数从0位开始)数6比较,6大,所以6向右移动1位,在第2位插入4。
第2次4跟第1个数5比较,5大,所以5向右移动1位,在第1位插入4。
第3次4跟第0个数3比较,4大,所以4不移动,相当于在第1位插入4。第3轮排序结束。

其他依次类推,可以得出如下规律:
第i轮中一共执行了i次。
先记录一下第i个数为key。在i的范围内用参数j来指向每次比较位,j的初始值为i-1
第i次key跟第j位的数进行比较,如果第j位的数>key,那么第j位的数向右移动1位,然后在第j位插入key。
如果第j位的数≤key,那么不移动,在第(j+1)位插入key。
在这里插入图片描述
但是这样有个问题,就是插入key的位置不统一,为了统一插入key的位置,我们修改下如上的规律,改成下面的方式:
第i次key跟第j位的数进行比较,如果第j位的数>key,那么第j位的数向右移动1位,先让j=j-1,然后在第(j+1)位插入key。
如果第j位的数≤key,那么不移动,在第(j+1)位插入key。(这样可以统一插入key的位置到j+1位)。
这个就是插入排序的算法了。


三、C语言实现算法

void insertionsort(int arr[],int n)   //插入排序算法
{for(int i=1;i<n;i++){int key = arr[i];       //暂存第i位的数到参数keyint j=i-1;              //从第i-1位开始和key进行比较while(j>=0 && arr[j]>key)   //关键语句,j=-1或者第j位比key要小退出循环{arr[j+1] = arr[j];    //如果第j位>key,那么第j位右移到第j+1位j = j-1;              //j继续左移j=j-1;}arr[j+1] = key;            //在第j+1位插入暂存在key的第i位数值。}
}

加入打印后用gcc编译后运行,得到的结果也是符合预期的。
在这里插入图片描述
在《软件设计师教程》里算法是这样写的,这种写法和冒泡排序的写法很像,看个人选择。

void insertsort(int arr[],int n)
{int i,j;int tmp;for(i=1;i<n;i++){	if(data[i]<data[i-1])  //如果第i位数≥第i-1位数,不移动。{tmp = data[i];     //如果第i位数<第i-1位数,则插入到比第i位大的第j位。data[i] = data[i-1];for(j=i-1;j>=0 && data[j] > tmp;j++)data[j+1] = data[j];data[j+1] = tmp;}	}	
}

四、复杂度计算

时间复杂度很容易计算,跟冒泡排序类似。一共嵌套了两次,时间复杂度就是O(n^2)。
在这里插入图片描述
空间复杂度也很容易计算,三个临时参数i,key,j,所以空间复杂度就是O(3),记为O(1)。
在这里插入图片描述
对这部分有疑问的请先看前面的文章复杂度计算部分
【学习分享】小白写算法之冒泡排序篇


五、算法稳定性

因为相同元素的情况下插入排序算法是不改变元素相对位置的,这个很好理解吧,所以插入排序算法是稳定的。
在这里插入图片描述


六、小结

插入排序算法在中间实现过程比冒泡排序有一点点绕的地方,但是深入理解下其实也还好,复杂度和稳定性都是一样的,两者有共通的地方,学会总结规律就可以掌握了。码字不易,且行且珍惜~~

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

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

相关文章

【Java设计模式】创建型——抽象工厂模式

目录 背景/问题解决方案&#xff1a;抽象工厂模式解析生活场景模拟上一章的案例图解 意图主要解决何时使用如何解决关键代码抽象工厂模式涉及多个角色&#xff1a; 代码示例优点缺点应用场景 背景/问题 在某些情况下&#xff0c;需要创建一系列相关或相互依赖的对象&#xff0…

线程池详解并使用Go语言实现 Pool

写在前面 在线程池中存在几个概念&#xff1a;核心线程数、最大线程数、任务队列。 核心线程数指的是线程池的基本大小&#xff1b;也就是指worker的数量最大线程数指的是&#xff0c;同一时刻线程池中线程的数量最大不能超过该值&#xff1b;实际上就是指task任务的数量。任务…

MacOS下载和安装HomeBrew的详细教程

在MacOS上安装Homebrew的详细教程如下&#xff1a;&#xff08;参考官网&#xff1a;macOS&#xff08;或 Linux&#xff09;缺失的软件包的管理器 — Homebrew&#xff09; 步骤1&#xff1a;检查系统要求 确保你的MacOS版本至少为macOS Monterey (12) (or higher) 或更高版本…

在单交换机局域网中,不同网段的主机通信探秘

在理解局域网中不同网段主机之间的通信之前&#xff0c;我们首先要明白网络的基本组成和工作原理。局域网&#xff08;LAN&#xff09;是一个封闭的网络环境&#xff0c;通常由交换机&#xff08;Switch&#xff09;作为核心设备连接网络中的各个主机。当我们谈论不同网段的主机…

Github 2024-04-06Rust开源项目日报Top10

根据Github Trendings的统计,今日(2024-04-06统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10HTML项目1Dart项目1RustDesk: 用Rust编写的开源远程桌面软件 创建周期:1218 天开发语言:Rust, Dart协议类型:GNU Affero General …

文献学习-28-Endora: 用于内镜仿真的视频生成模型

Endora : Video Generation Models as Endoscopy Simulators Authors: Chenxin Li, Hengyu Liu, Yifan Liu, Brandon Y. Feng, Wuyang Li, Xinyu Liu, Zhen Chen, Jing Shao, Yixuan Yuan Keywords: Medical Generative AI Video Generation Endoscopy Abstract 生成模型有…

如何在没有备份的情况下从 iPad 恢复照片?

有很多操作都可能导致iPad照片丢失&#xff0c;包括误删除、出厂设置、iPad的iOS更新等。如果没有备份&#xff0c;似乎没有办法找回它们。然而&#xff0c;即使您将备份保留在 iCloud 或iTunes上&#xff0c;这些方式也需要您的 iPad 首先重置&#xff0c;从而用备份内容覆盖当…

职场新变革:AI赋能ICT劳动力联盟的行动与展望

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

基于vue+node.js导师选择分配管理系统

开发语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode .设计一套导师选择管理系统&#xff0c;帮助学校进行导师选择管理等繁琐又重复的工作&#xff0c;提高工作效率的同时&#xff0c…

C++【适配器模式】

简单介绍 适配器模式是一种结构型设计模式 | 它能使接口不兼容的对象能够相互合作。&#xff08;是适配各种不同接口的一个中间件&#xff09; 基础理解 举个例子&#xff1a;当你引用了一个第三方数据分析库&#xff0c;但这个库的接口只能兼容JSON 格式的数据。但你需要它…

2024年阿里云服务器优惠价格表:新购/续费/升级真便宜

阿里云服务器租用价格表2024年最新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核…

汽车疲劳测试试验平台技术要求(北重厂家)

汽车疲劳测试试验平台技术要求通常包括以下几个方面&#xff1a; 车辆加载能力&#xff1a;测试平台需要具备足够的承载能力&#xff0c;能够同时测试多种车型和不同重量的车辆。 动力系统&#xff1a;测试平台需要具备稳定可靠的动力系统&#xff0c;能够提供足够的力和速度来…

设计模式之建造者模式:灵活可扩展的对象创建过程

目录 一、什么是建造者模式 二、建造者模式的应用场景 三、建造者模式的优缺点 3.1. 优点 3.2. 缺点 四、建造者模式示例 4.1. 问题描述 4.2. 问题分析 4.3. 代码实现 五、建造者模式的另一种实现方式 六、总结 一、什么是建造者模式 建造者模式&#xff08;Builder…

C# 分布式自增ID算法snowflake(雪花算法)

文章目录 1. 概述2. 结构3. 代码3.1 IdWorker.cs3.2 IdWorkerTest.cs (测试) 1. 概述 分布式系统中&#xff0c;有一些需要使用全局唯一ID的场景&#xff0c;这种时候为了防止ID冲突可以使用36位的UUID&#xff0c;但是UUID有一些缺点&#xff0c;首先他相对比较长&#xff0c…

vue项目使用element ui

目录 1、创建一个vue项目 2、找到element官网&#xff0c;点击指南&#xff0c;找到安装栏 3、 找到使用包管理器&#xff0c;复制命令 4、在main.js中引入element 5、使用element ui 6、找到App.vue&#xff0c;导入Button.vue文件&#xff0c;保存启动项目 1、创建一个vu…

MySQL复制拓扑1

文章目录 主要内容一.安装MySQL服务器1.MySQL 安装程序和其它文件保存在下发的 mysql8-files.iso 镜像文件中&#xff0c;可以使用虚拟光驱来提取到 Linux 文件系统。代码如下&#xff08;示例&#xff09;: 2.将 MySQL8.0 程序解压到 /opt 目录&#xff0c;再创建到 MySQL 默认…

闪站侠洗护管理系统,洗衣洗鞋小程序软件定制,干洗连锁店软件系统搭建;

闪站侠洗护管理系统&#xff0c;洗衣洗鞋小程序软件定制&#xff0c;干洗连锁店软件系统搭建&#xff1b; 为了让每一个洗衣洗鞋工厂与门店的连接更加高效便捷&#xff0c;送洗流程更加简单轻松&#xff0c;拽牛科技倾心打造洗衣洗鞋管理软件。我们的目标是通过高效和优质的服务…

双指针(复习)

基本概念 双指针:在区间操作时&#xff0c;利用两个下标同时遍历&#xff0c;进行高效操作 双指针利用区间性质可以把0(n2)时间降低到0(n) 蓝桥532 import os import sys# 请在此输入您的代码 w int(input()) n int(input()) b [] ans 0 for i in range(n):b.append(int(…

复现chatgpt_ros,需要openapi key

&#xff11;&#xff0e; 前置工作&#xff1a; 现在&#xff55;buntu系统是20.04ros1&#xff0c;现在用docker新建并安装ros2&#xff1a; 最简单的&#xff0c;用大佬的一键安装&#xff1a; wget http://fishros.com/install -O fishros && . fishros 其次自己装…

基于沙漏 Tokenizer 的高效三维人体姿态估计框架HoT

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 摘要Abstract文献阅读&#xff1a;基于沙漏 Tokenizer 的高效三维人体姿态估计框架HoT1、研究背景2、提出方法3、模块详细3.1、什么是HoT3.2、HoT 框架3.3、Token 剪…