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

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

  • 前言
  • 一、什么是插入排序算法
  • 二、插入排序算法如何实现
  • 三、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 生成模型有…

播放器的音视频不同步问题:ffplay

自动丢帧的问题&#xff1a; 其实我都不知道目前播放的状态&#xff01;哪里有问题&#xff1f;说是延迟&#xff1f;那不是播放的挺好的嘛。音视频不是已经同步了吗&#xff1f; 一定要实时&#xff0c;断断续续也比延迟要好的思考。 这是对的&#xff0c; 之前是要求能显…

【故事】无人机学习之旅

今天是清明假期最后一天&#xff0c;晚上在看无人机的东西&#xff0c;翻到了欣飞鸽的知乎主页&#xff0c;读了他的一些文章。虽不曾相识&#xff0c;但感觉我们有很多相似的经历&#xff0c;也想记录一下自己的无人机学习之旅。 青铜&#xff1a;从使用开源飞控开始 我在大…

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

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

腾讯光子工作室群 一面 (30min)

问题&#xff1a; 你毕业是打算考研还是直接工作 深挖项目&#xff08;介绍、剖析遇到问题如何解决&#xff09;&#xff1a; 你在进行攻击的时候会不会有穿模的情况&#xff0c;怎么解决 为什么会造成卡顿&#xff08;多嘴说的&#xff09; 说说行为树和状态机之间的差别 …

无端科技一面(生死狙击项目组 战斗客户端 40min)

自我介绍 实习经历询问 项目询问 TCP和UDP的区别 什么情况会用到UDP 大小端 寻路算法了解多少 A*算法 场景题&#xff1a;扫雷如何随机分地雷&#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核…

对Fashion._mnist进行10分类ipynb

import os os.environ[TF_CPP_MIN_LOG_LEVEL] 2#设置tensorflow的日志级别 from tensorflow.python.platform import build_info import tensorflow as tf # 列出所有物理GPU设备 gpus tf.config.list_physical_devices(GPU) if gpus: # 如果有GPU&#xff0c;设…

Django -- 报错

通过终端命令来创建新的 app 时报错 执行命令: python manage.py startapp mysite04 具体报错内容如下: Traceback (most recent call last):File "mysite\manage.py", line 22, in <module>main()File "mysite\manage.py", line 18, in mainexecut…

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

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

[高考] 数理化

借助前些天总结的热乎劲&#xff1a;[高考] 数学题的一般解题思路。再总结一下数理化的一般认识。在高中分班的时候&#xff0c;还是建议选择理科。后续的路子会更广一些。 这三科与语文/英语的区别也是非常明显。当然也有类似的地方。英语和语文&#xff0c;这两个是语言类学…

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

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