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

2023-11-20

目录

一、插入排序的相关概念

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、由上图可知,希尔排序的思路

①定义增量序列D_{k}: D_{M}>D_{M-1}>...>D_{1}=1;

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

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

5、希尔排序的特点

一次移动,移动位置较大,跳跃式地接近排序后的最终位置,最后一次只需要少量移动。

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];
}

    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

插入排序超详解释,一看就懂 的相关文章

随机推荐

  • nvdiffrecmc在Windows上的配置及使用

    nvdiffrecmc是NVIDIA研究院开源的项目 源代码地址 https github com NVlabs nvdiffrecmc 论文为 Shape Light and Material Decomposition from Ima
  • PL/SQL中从数据表对变量赋值select into异常

    概述 pl sql从数据表中向变量赋值 使用select into 子句 会带动来一些问题 如果查询没有记录时 会抛出no data found异常 如果有多条记录时 会抛出too many rows异常 CREATE OR REPLACE
  • selenium js 删除网页代码

    js var child document getElementsByTagName link child 115 parentNode removeChild child 115 js var child document getElem
  • leetcode shell

    leetcode 195 第十行 cat file txt head n 10 tail n 1 cat file txt tail n 10 head n 1 第一种是先取出前10行 然后取出最后一行 但是不足10行 也可以取出最后一行
  • 2023年智能材料与表面国际会议(ICoSMS 2023)

    会议日期 2023 3 24 至 2023 3 26 会议简介 2023年智能材料与表面国际会议 ICoSMS 2023 重要信息 会议网址 www icosms org 会议时间 2023年3月24 26日 召开地点 中国上海 截稿时间
  • 深聊测开领域之:虫剂悖论

    测试免疫 1 初识虫剂悖论 2 应对虫剂悖论 2 1 更新测试策略 2 2 更新测试用例 1 初识虫剂悖论 提到 虫剂悖论 pesticide paradox 我相信很多人都没听说的 除非是生物学专业的同学或者砖家 虫剂悖论描述的是重复使用
  • Log4j2突发重大漏洞之解决方案

    漏洞描述 Apache Log4j2是一款优秀的Java日志框架 与Logback平分秋色 大量主流的开源框架采用了Log4j2 像Apache Struts2 Apache Solr Apache Druid Apache Flink等均
  • wget: 无法解析主机地址

    root hadoop102 wget O etc yum repos d CentOS Base repo http mirrors aliyun com repo Centos 6 repo 2018 10 09 14 22 53 ht
  • 云服务器车牌识别系统,人脸识别/车牌识别系统安防视频云服务EasyCVR支持大华SDK语音对讲...

    TSINGSEE青犀视频平台EasyCVR内 已经能够通过国标GB28181协议实现语音对讲功能 在大华SDK的研发方面 也开发了该功能 本文和大家分享下 EasyCVR语音对讲主要用于实现本地平台与前端设备所处环境间的语音交互 解决本地平
  • SQLite的shell简单使用

    下载最新的shell for windows http www sqlite org sqlite shell win32 x86 3070800 zip 解压后得到 sqlite3 exe1 1 创建数据库 C sqlite3 gt sq
  • 使用moment.js推算当前时间的前多少天

    在项目中遇到一个问题 推算当前时间的前7天 30天 当然使用js一点点推算可以的 但是可以使用moment js 简单就可以推算出来 获取当前时间 moment format YYYY MM DD HH mm ss 当前时间的前7天 mom
  • QLineEdit和QPushButton实现了输入用户名、密码并验证的功能

    使用QLineEdit和QPushButton实现了输入用户名 密码并验证的功能 该程序使用正则表达式限制了用户名和密码只能包含数字 字母和下划线 且长度在4到16个字符之间 如果输入的用户名和密码符合要求 则弹出一个消息框显示 登录成功
  • 【安装篇】- 基于 VMWARE Oracle Linux7.9 安装 Oracle19c RAC 详细配置方案

    作者 yanwei 来源 墨天轮 https www modb pro db 95684 大家好 我是 JiekeXu 很高兴又和大家见面了 今天和大家一起来看看 Linux7 9 安装 Oracle19c RAC 详细配置方案 欢迎点击上
  • Mockito的使用(二)——@InjectMocks、@Spy、@Mock

    项目中 有些函数需要处理某个服务的返回结果 而在对函数单元测试的时候 又不能启动那些服务 这里就可以利用Mockito工具 其中有如下三种注解 InjectMocks 创建一个实例 简单的说是这个Mock可以调用真实代码的方法 其余用 Mo
  • 鸿蒙系统可以微信吗,鸿蒙系统可以用微信吗?微信鸿蒙版本下载-游戏大玩家...

    微信是一款由腾讯开发的聊天社交软件 在这里你可以去进行和更多好友的交流 我们给你提供了多种不同的交流模式 享受更加独特的交流带给你的全新体验 使用语音 文字 表情包 图片 视频等等都种不同的方式 我们让大家们的交流更加的便利起来 微信鸿蒙版
  • Python+Opencv 调用USB摄像头(一)

    一 最简单的调用笔记本内置相机 import cv2 引入库 cap cv2 VideoCapture 0 while True ret frame cap read cv2 imshow Video frame 读取内容 if cv2 w
  • 10 微服务流程规范篇:高速迭代的研发过程需要怎样的规范?

    上一课时 我讲解了微服务质量保障体系的全景概览 本课时我主要讲解流程规范 高速迭代的研发过程需要怎样的规范呢 业务流程阶段 众所周知 产品研发是为业务服务的 在深入讲解产品研发流程之前 我们先整体看下业务流程 分为 3 个阶段 产品研发阶段
  • C++新特性

    std bind 概述 std bind 是一个C 函数模板 简单说它就像一个函数适配器 用来接受一个可调用对象 callable object 生成一个新的可调用对象来 适应 原对象的参数列表 该函数模板定义在头文件 include
  • Ubuntu - OpenSSH安装或升级

    1 准备安装包 openssl 1 0 2o tar gz wget https www openssl org source openssl 1 0 2o tar gz https www openssl org source opens
  • 插入排序超详解释,一看就懂

    目录 一 插入排序的相关概念 1 基本思想 2 基本操作 有序插入 二 插入排序的种类 三 直接插入排序 1 直接插入排序的过程 顺序查找法查找插入位置 2 使用 哨兵 直接插入排序 四 直接插入排序算法描述 五 折半插入排序 1 查找插入