插入排序超详解释,一看就懂

这篇具有很好参考价值的文章主要介绍了插入排序超详解释,一看就懂。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、插入排序的相关概念

1、基本思想

2、基本操作:有序插入

二、插入排序的种类

三、直接插入排序

1、直接插入排序的过程:顺序查找法查找插入位置

2、使用“哨兵”直接插入排序

四、 直接插入排序算法描述

五、折半插入排序

1、查找插入位置时采用折半查找法,如下图所示:​

 2、折半插入排序——算法描述

3、折半插入排序——算法分析

六、希尔排序

1、基本思想:

2、希尔排序算法的特点:

3、希尔排序的典例

4、由上图可知,希尔排序的思路

5、希尔排序的特点

6、希尔排序的算法描述


一、插入排序的相关概念

1、基本思想

每步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止。即边插入边排序, 保证子序列中随时都是排好序的。就像玩扑克牌抓牌的时候。

2、基本操作:有序插入

■在有序序列中插入一个元素,保持序列有序,有序长度不断增加。

■起初,a[0]是长度为1的子序列。然后,逐一将a[1]至a[n-1 ]插入到有序子序列中。

二、插入排序的种类

插入排序,排序,数据结构与算法,笔记,排序算法,算法,数据结构

三、直接插入排序

1、直接插入排序的过程:顺序查找法查找插入位置

插入排序,排序,数据结构与算法,笔记,排序算法,算法,数据结构

(1)直接插入排序在基本有序时,效率较高。

(2)在待排序的记录个数较少时,效率较高。

2、使用“哨兵”直接插入排序

插入排序,排序,数据结构与算法,笔记,排序算法,算法,数据结构

四、 直接插入排序算法描述

void InsertSort(SqList &L){

int i, j;

for (i=2; i<=L.length; ++i) {

if (L.r[i].key < L.r[i-1].key){                 //若"<"需将L.r[i]插入有序子表
L.r[0]=L.r[i];                                 //复制为哨兵

for (j=i-1;L.r[O].key<L.r[j].key; --j){

L.r[j+1]=L.r[j];                            //记录后移

}

L.r[j+1]=L.r[O];                          //插入到正确位置
     }

}

五、折半插入排序

1、查找插入位置时采用折半查找法,如下图所示:

 2、折半插入排序——算法描述

void BInsertSort (SqList &L){

for(i= 2; i <= L.length; ++i){         //依次插入第2~第n个元素
L.r[0] = L.r[i];                      //当前插入元素存到"哨兵"位置

low= 1;high= i-1;                   //采用二分查找法查找插入位置
while (low <= high) {

mid= (low+high)/2;

if ( L.r[O].key < L.r[mid].key )      high = mid -1;
else low=mid+1;

}                        //循环结束,high+1则为插入位置

for (j=i-1;j>=high+1;--j) 
L.r[j+1]= L.r[j;                  //移动元素
L.r[high+1] = L.r[0];            //插入到正确位置
       }

}        //BInsertSort

3、折半插入排序——算法分析

(1)折半查找比顺序查找快,所以折半插入排序就平均性能来说比直接插入排序要快;

(2)它所需要的关键码比较次数与待排序对象序列的初始排列无关,仅依赖于对象个数。

(3)当n较大时,总关键码比较次数比直接插入排序的最坏情况要好得多,但比其最好情况要差;

(4)在对象的初始排列已经按关键码排好序或接近有序时,直接插入排序比折半插入排序执行的关键码比较次数要少;

(5)折半插入排序的对象移动次数与直接插入排序相同,依赖于对象的初始排列

减少了比较次数,但没有减少移动次数

六、希尔排序

1、基本思想:

先将整个待排记录序列分割成若干子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。

2、希尔排序算法的特点:

(1)缩小增量

(2)多遍插入排序

3、希尔排序的典例

插入排序,排序,数据结构与算法,笔记,排序算法,算法,数据结构

4、由上图可知,希尔排序的思路

①定义增量序列: >>...>=1;

   上图的典例就是:D3=5;D2=3;D1=1;

②对每一个进行“-间隔”插入排序(k=M,M-1,...1)

5、希尔排序的特点

一次移动,移动位置较大,跳跃式地接近排序后的最终位置,最后一次只需要少量移动。文章来源地址https://www.toymoban.com/news/detail-824479.html

6、希尔排序的算法描述

void ShellSort (Sqlist &L int dlta[], int t){  //按增量序列dlta[0...t- 1]对顺序表L作希尔排序。

for(k=O; k<t; ++k)

Shellinsert(L, dlta[k]); //一趟增量为dlta[k]的插入排序

}//ShellSort


void ShellInsert(SqList &L,int dk)

//对顺序表L进行一趟增量为dk的Shell排序,dk为步长因子
for(i=dk+1; i<=L.length; ++i)

if(r[i].key < r[i-dk].key) {

r[0]=r[i];

for(j=i-dk; j>0 &&(r[0].key<r[j].key); j=j-dk)

r[j+dk]=r[j];

r[j+dk]=r[0];
}

    }

到了这里,关于插入排序超详解释,一看就懂的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 嵌入式数据库sqlite3【基础篇】基本命令操作,小白一看就懂(C/C++)

    目录 前言 一、sqlite概念和特性 二、sqlite安装 三、sqlite3数据类型  四、sqlite数据库约束 五、sqlite常用命令  六、SQL语句(增删改查) 七、sqlite使用实例(教学管理数据库) 总结 数据在实际工作中应用非常广泛,数据库的产品也比较多,oracle、DB2、SQL2000、mySQL;基于嵌入式

    2024年02月08日
    浏览(45)
  • C# for循环案例1 (一看就懂)

     效果:  用f10可以清楚的看到程序执行的每一步,  #region for循环 /*   语法:     for(表达式1;表达式2;表达式3) {    循环体; } for(表达式1;表达式2;表达式3)   表达式1 定义循环的次数,可以理解为循环变量。表达式2 执行的条件。 表达式3,改变循环的条件,使循环条件不

    2023年04月11日
    浏览(37)
  • C# 一看就懂的装箱拆箱案例

    在C#中,装箱(Boxing)和拆箱(Unboxing)是值类型与引用类型之间相互转换的过程。 当一个值类型(如整数、结构体或枚举等)需要转换为对象(System.Object)或接口类型时,系统会自动创建一个新的对象实例,并将该值类型变量的值复制到新创建的对象中。这个过程就称为装

    2024年02月02日
    浏览(33)
  • AI —— 一看就懂的代码助手Copilot获取教程

            随着chatgpt的发布,人工智能领域近期站上了风口浪尖。GitHub Copilot由github与 OpenAI 合作创建,是世界上第一个使用 OpenAI 的 Codex 模型(GPT-3 的后代)制作的大规模生成式 AI 开发工具。GitHub Copilot 作为 AI 结对程序员开启了软件开发的新时代,通过自动完成注释和代

    2024年02月02日
    浏览(47)
  • 微信小程序实现倒计时功能,一看就懂,直接用

    结构完整,直接用就可以

    2024年02月01日
    浏览(51)
  • java三层架构,有图有案例有代码,一看就懂!!!

    三层架构 三层结构解释: 视图层:主要是用于与用户进行交互,比如接收用户输入的内容将返回结果向用户展示等。 业务逻辑层:实现每个功能的特定的逻辑方法。 数据访问层:主要是与数据库进行连接,然后对数据库进行增删改查工作。 结构一: 包的层级结构: 三层结

    2024年02月03日
    浏览(36)
  • 如何在android运行lua脚本(最简单的讲解,一看就懂)

    1.打开 android studio 2.引入luaj-jse-3.0.1.jar包(百度自行下载) 3.新建assets文件夹 4.在assets文件夹下新建一个 main.lua文件,内容如下 5.MainActivity.java 内容如下 5.运行程序

    2024年02月11日
    浏览(26)
  • 一看就懂的保姆级教程:open vn设置 (亲测通过)

    OpenVPN是一款优秀用于创建虚拟私人网络的软件,但是由于其涉及了服务器证书、TLS密钥、防火墙等一堆衍生概念,因此设置显得比较复杂。本文化繁为简,仅以 “能连通” 这个最低要求,完整地展示了一遍OpenVPN的安装调试过程。万事开头难,在实现了连通的基础上再来探索

    2024年02月02日
    浏览(37)
  • 【Unity】图解 碰撞检测函数,一看就懂!(OnCollisionEnter、OnCollisionStay、OnCollisionExit、OnTriggerEnter......)

    现有: Lesson16脚本的代码: 运行: 何为触发器:勾选了碰撞器的Is Trigger参数,这个游戏物体就会变成一个触发器 现有: Lesson16脚本的代码: 运行: 1.只要脚本挂载的对象 能和别的物体产生碰撞或触发,那么上面那六个函数就能够被相应 (有物理效果的相应的是\\\"物理碰撞

    2023年04月09日
    浏览(32)
  • 正则表达式 运算符优先级与匹配规则 | 一看就懂!!!(四)

    目录 一、正则表达式 - 运算符优先级 (一)正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。 (二)相同优先级的从左到右进行运算,不同优先级的运算先高后低。 (三)下表从最高到最低说明了各种正则表达式运算符的优先级顺序:  二、正

    2024年02月12日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包