【唐老狮】排序——插入排序

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

【插入排序】


【基本原理】

两个区域

排序区

未排序区

用一个索引值来区分

未排序区元素

与排序区元素比较

插入到合适位置

直到未排序区清空

图片

 

排序开始前,首先认为第一个元素在排序区其它所有元素在未排序区

排序开始后,每次将未排序区第一个元素取出用于和排序区中元素比较。如果满足条件(较大或者较小),则排序区中元素往后移动一个位置

注意

所有数字都在一个数组中

所谓的两个区域是一个分水岭索引


【关键逻辑】

循环n-1次

有n个数就循环n-1次

 


每一轮

取出未排序区的第一个元素

得到排序区最后一个元素的索引位置

 

第一轮

未排序的第一个元素

noSortNum = 7

排序区的最后一个元素索引

sortIndex = 0

 

第二轮

noSortNum = 9

sortIndex = 1

以此类推


确定插入位置

 

用未排序区第一个元素

从已排序区最后一个元素开始

依次往前比较

如果满足条件

已排序区元素往后移动一个位置


插入数字

 


【标准实现】

 

排序结果

 

【逻辑分析】

-为什么有两层循环-

第一层循环

依次取出未排序区的元素进行排序

第二层循环

找到想要插入的位置

-为什么第一层循环从1开始遍历-

 

插入排序的关键是分两个区域

已排序区

未排序区

默认第一个元素在已排序区

每一轮循环的目的是

依次取出未排序区的元素进行排序

-为何用while循环-
 

之前学习的冒泡排序和选择排序,之所以第二层循环是for循环,是因为它们每一轮都需要数组中剩下的所有元素进行比较不存在中途停止循环的情况。而插入排序在比较过程中,只要条件不满足就马上要停止比较,所以while循环更适用!(当然用for循环也是可以实现的)

满足条件才比较

否则证明插入位置已确定

不需要继续循环

-为什么可以直接往后移位置   为什么后移结束要减减-

 

每轮未排序数已记录

最后一个位置不怕丢

 

减减比较下一数

以此类推找位置

 

-为什么确定位置后  是放在sortIndex + 1的位置-

 

 

接着会进行比较

 

这时sortIndex = 0,而3小于4所以不会再进循环了,因此循环结束,证明4应该放在1的位置,也就是sortIndex + 1的位置。所以这里的逻辑总结一下就是:当循环停止时,插入位置应该是停止循环的索引加1处!

-如何降序排列-

 

升序(从小到大)

降序(从大到小)

具体是哪种排序

关键点就是条件表达式

如果是大于(>)

已排序数大于未排序数

则进入循环继续往前找

也就是要把小的数往前放

结果就是升序排序

如果是小于(<)

已排序数小于未排序数

则进入循环继续往前找

也就是要把大的数往前放

结果就是降序排序

 


【练习】

之前的冒泡排序和选择排序,我们都知道他们是没有固定写法的,可以从前往后遍历,也可以从后往前遍历。而插入排序也是没有固定写法的,目前我们实现的是默认第一个为已排序区元素,如果你对插入排序已经了解了,可以自己尝试实现默认最后一个元素为已排序区元素,来实现插入排序


 

【总结】
 

-基本原理-

两个区域

用索引值来区分

未排序区与排序区

元素不停比较

找到合适位置

插入当前元素

-套路写法-

两层循环

一层获取未排序区元素

一层找到合适插入位置

第一个未排序元素值

最后一个已排序元素索引

用未排序元素值

依次遍历比较已排序元素

找到合适位置

第二层循环外插入

-注意事项-

默认开头已排序

默认结尾已排序

第二层循环外插入


关注唐老狮获取更多干货内容

 

唐老狮C#——多态和vob ​​截止目前,我们已经学会了面向对象中封装和继承两大特性的相关知识点。简单理解它们,封装就是用代码形容一个现实对象,继承就是复用代码,通过继承可以让类之间建立父子关系,复用一些特征和行为。 ​​那么,我们接下来要继续学习最重要的一个特性——多态。 【多态】 概念 同一类型对象 执行相同行为 有不同的表现 为什么要学习多态? ​​根据多态的概念,很多同学可能会写出如上的代码,子类中重新实现一个SpeakName的方法,前面加一... 阅读详情

相关推荐

零经验小白的独游历程——U3d学习经验与教程分享

前言 U3D作为主流引擎,网上的教程可以说是不计其数。但是程序是一种模式化的思维,引擎也有他的底层原理。网上很多网课只是一步一步地展示做法,看似实现了效果,但其实根本没有说清楚背后的原理。我们就算跟着做了一遍,也只是熟悉了引擎的基本操作,但是如果想要自己做点什么效果,便会问题百出。 比如说一开始我们打的第一行Unity代码一般都是控制玩家移动的。这时勤劳好学的我们一定会跟着师一起打下这行代码。 void FixedUpdate() { rb.MovePosition(transform.p

安都奕雨的博客 2206

俊飞师CISSP2018最新全套培训讲义

俊飞师CISSP的培训讲义,有学习的可以参考下,也可以报名师的培训班,讲得很好,很细。

Unity Shader入门 - 必备概念 师教程 笔记

什么是渲染管线?渲染管线(渲染流水线)它是计算机图形学中用于将三维场景转换为最终屏幕图像的过程它是由一系列的阶段和操作组成的,每个阶段都负责执行特定的任务逐步处理输入的集合数据和纹理信息最终生成可视化图像的过程简单理解:渲染管线(流水线)就是将数据分阶段的变为屏幕图像的过程渲染管线中的数据指的是什么?渲染管线(流水线)是:将数据分阶段的变为屏幕图像的过程这里的数据指的是:1.:模型的顶点坐标、法线向量、纹理坐标等等2.:纹理贴图等3.:光照参数、光源信息等。

z2014z的博客 1793

泰课Unity3D基础班视频教程

泰课Unity3D基础班视频教程 百度云下载 很适合初学者的Unity3D视频教程 非常详细

经典树型表结构之SORT_NO

为什么80%的码农都做不了架构师?>>> ...

weixin_34049032的博客 720

Unity3d实战就业路线》

唐老狮Unity3d实战就业路线》课程 市场上缺少专门围绕核心路线设计的成体系的unity课程。本套餐完整统一的unity3d学习路线,统一的师与内容设计。内容难度层层推进,核心能力养成无死角 适合什么学员? ·接触unity不久,需要系统的学习 ·不知道如何从头到尾,系统学习掌握unity ·学过少量或很多散课,但不得要领,不知如何选课 ·希望扎实掌握c#unity,成为有能力可就业的开发者 就业路线套餐包括以下模块课程: 1、C#语言教学四部曲 + 实践四部曲 2、U..

zzc168zzc的博客 3703

唐老狮C#四部曲之C#入门:习题汇总

本篇文章对视频教程 《【唐老狮Unity系列之C#四部曲—C#入门》 当中的课后练习题进行了汇总,方便同学们统一进行练习和复习 这些习题的解题部分都在本教程中以视频的形式进行了详细讲解 B站免费试看 【唐老狮Unity系列之C#四部曲—C#入门_哔哩哔哩_bilibili 泰课会员免费看: https://www.taikr.com/goods/show/589 本套课程属于Unity实战就业路线(打折预售中) https://www.taikr.com/goods/show/5.

MrTang_Unity的博客 4465

唐老狮 UGUI 实战学习笔记(2)

嘻嘻

咩咩的博客 627

页面拖动图片排序后更新表中顺序字段

需求: 数据库表结构中有sortno这个排序字段,当页面拖动,更改排序顺序后,调用更改排序接口,将目前顺序的copid(图片id)以逗号”,”分割,传到后台,后台将排序字段更新,列表按照新的顺序进行排列 实现方案: 将传过来的copid串进行解析,存到数组中,传给xml,并进行批量修改,更新数据库表中的排序字段。 补充:mybatis中foreach标签的使用 <foreac...

single0515的博客 1189

唐老狮Unity入门笔记

1. Inspector窗口中的变量关联的就是对象的成员变量,运行时改变他们就是在改变成员变量。2.拖拽到GameObject对象后,再改变脚本中变量默认值,界面上不会改变。3.运行中修改的信息不会保存(可以copy后paste)让自定义类型可以显示编辑。大部分类型都能显示编辑。

m0_61939767的博客 2469

利用C#实现贪吃蛇

不应该强迫别人依赖他们不需要使用的方法,一个接口不需要提供太多的行为,一个接口应该尽量只提供一个对外的功能,让别人去选择需要实现什么样的行为,而不是把所有的行为都封装到一个接口当中。②为了能在此类中调用ChangeScene函数,特将Game类中的ChangeScene函数设为static,由于静态方法中不能调用成员变量,则将nowScene也设为静态变量。例如:飞行接口、走路接口、跑步接口等等虽然都是移动的行为,但是我们应该把他们分为一个一个单独的接口,让别人去选择使用。

K_CRACKING的博客 1694

Unity游戏工程师学习路线(唐老狮

最后的最后我想说,坚持就有可能成功!加油,相信自己一定能行!

weixin_66584806的博客 954

唐老狮-unity-c#-4-进阶

目录ArrayList:object数组Stack:栈:先进后出的object数组Queue:队列:先进先出的object数组Hashtable:散列表:KV结构的object数组泛型:参数变量化泛型约束:参数变量化加一点限制List:泛型数组Stack:泛型栈Queue:泛型队列Dictionary:泛型KV结构的数组,v>顺序存储和链式存储LinkedList委托:装函数的容器事件:外面只能往里装函数的安全型委托匿名函数:lambda表达式:()=>{} 不想取名的函数List排序协变逆变多线程:你干你

u011549406的专栏 686

Java自定义注解导入和导出合并一对多单元格工具类

excel工具类对poi的封装,所以需要导入poi的依赖,我用的是4.1.0版本,如果是4以下,工具里面的poi的相关api需要改变; 导入/导出支持:一对多合并(不限制层级数,但每个类只能有一个子集)、必填字段检测(读取的时候能用到)、排序(导出能用到)、动态隐藏字段(导入导出会忽略该字段) 创建注解IExcel注解 name : 用作excel列名isSon :用作判断是否是子集(默认false,如果有子集,在子集成员变量上标注: @IExcel(isSon = true))hiddenField

weixin_44947862的博客 2161

唐老狮C++基础 笔记

typedef原变量名 新类型名 比如 typedef bool bbb;别名的意义 代替复杂的,不方便书写和记忆的基本类型,提高高代码的可读性。

2303_76778520的博客 957

唐老狮C#——万物之父中的方法

知识点回顾 万物之父 关键字 object 概念 object是所有类型的基类 它是一个类(引用类型) 作用 可以利用里氏替换原则 用object装所有对象 可以用来表示不确定类型 作为函数参数类型 选中输入的object 按F12或者右键转到定义 ​​我们可以看到作为万物之父的object本质上就是一个Object类,里面有2个静态方法,3个虚方法,2个普通成员方法。其中对于我们来说,常被我们重写和使用的就是ToString方法...

MrTang_Unity的博客 1459

唐老狮Unity——物理系统(射线检测)

【学习目标】 射线检测 能够通过射线检测进行碰撞判断 能够通过玩家点击屏幕检测选中的物体 【射线检测】 作用 可以利用3D世界中的射线,和3D世界中的物体进行碰撞(相交)判断,利用它可以实现射击 ​ 必要条件碰撞体 射线 【3D世界中射线】 由线段的一端无限延长所形成的直的线,由起点和方向两个关键属性构成 代码中创建射线对象 代码中创建射线对象 注意:这里画的是线段,用来看射线的方向的,真的射线是从起点向方向无限延伸的 【屏幕发出的射线】 根据玩家在屏幕上点击的位置,

MrTang_Unity的博客 3708

唐老狮C#——Stack

【Stack】 本质 栈 特点 先进后出 存在装箱拆箱 存储任意类型 无法遍历查看元素 无法获取指定位置元素 只能查看获取栈顶元素 Stack是栈存储容器,栈是一种先进后出的数据结构,先存入的数据后获取,后存入的数据先获取。如图 【声明】 需要引用命名空间 【添加】 向栈中添加元素 Push方法 【获取】 移除并获取栈顶元素 Pop方法 【查看】 查看栈顶元素 Peek方法 ...

MrTang_Unity的博客 562

唐老狮C#——泛型

【泛型】 语法 class类名<占位字母> 返回值类型 函数名<占位字母>(参数类型参数...) 概念 泛型相当于类型占位符 占位字母可以有多个 占位字母一般为大写字母 定义类或方法时使用替代符代表变量类型 当真正使用类或者方法时再具体指定类型 种类 泛型类 泛型方法 【泛型类】 【泛型方法】 泛型类中的 泛型方法 普通类中的 泛型方法 【泛型替代符数量不定】 ...

MrTang_Unity的博客 822
上一篇: 【唐老狮】排序——选择排序
下一篇: 【唐老狮】排序——快速排序
一唐老狮一
博客等级 码龄5年 505粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值