8.2 数据结构——插入排序

news2025/7/12 17:43:43

1、基本思想:每步将一个排序的对象,按其关键码大小插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止。即边插入边排序,保证子序列中随时都是有序的。

2、基本操作:

(1)在有序序列中插入一个元素,保持序列有序,有序长度不断增减;

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

(3)在插入a[i]前,数组a的前半段(a[0]~a[i-1])是有序段,后半段(a[i]~a[n-1])是停留在输入次序的“无序段”;

(4)插入a[i]使a[0]~a[i-1]有序,也就是要为a[i]找到有序位置j(0 <= j <= i),将a[i]插入到a[j]的位置上。

3、插入排序的分类

(1)直接插入排序:顺序法定位插入位置

(2)二分插入排序:二分法定位插入位置

(3)希尔排序:缩小增量多遍插入排序

8.2.1 直接插入排序

 1、复制插入元素, x = a[i];

2、记录后移,查找插入位置;

for (int j = i - 1; j >= 0 && x < a[j]; j--)
{
    a[j+1] = a[j];
}

3、插入到正确位置 a[j+1] = x;

使用哨兵的方式:

 1、复制为哨兵 L->r[0] = L->r[i];

2、记录后移,查找插入位置

for (int j = i - 1; L->r[0].key < L->r[i].key; --j)
{
    L->r[j+1] = L->r[j];
}

 3、插入到正确位置,L->r[j+1] = L->r[0]

直接插入排序算法:

void InsertSort(SQList *L)
{
    for (int i = 2; i <= L->length; i++)
    {
        if (L->r[i]->key < L->r[i-1].key)
        {
            L->r[0] = L->r[i]
            for (int j = i - 1; L->r[0].key < L->r[j].key; j--) //记录后移,找到插入位置
            {
                L->r[j+1] = L->r[j];
            }
            L->r[j+1] = L->r[0];
        }
    }
}

8.2.2 折半插入排序

查找插入位置时采用折半查找法

折半插入排序算法

void BInsertSort(SQList *L)
{
    for (int i = 2; i <= L->length; i++)
    {
        L->r[0] = L->[i];
        int low = 1, high = i - 1;
        while (low <= high)
        {
            mid = (low + high) / 2;
            if (L->r[0].key < L->r[mid].key)
                high = mid - 1;
            else
                low = mid + 1;
        }
        for (int j = i - 1; j >= high + 1; j--)
        {
            L->r[j+1] = L->r[j];    
        }
        L->r[high + 1] = L->r[0];
    }
}

 8.2.3 希尔排序(Donald.L.Shell)

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

希尔排序的特点:

(1)缩小增量,(2)多遍插入排序

希尔排序的思路

(1)定义增量序列Dk:Dm > Dm-1 > ... >D1 = 1

(2)对每个Dk进行“Dk间隔”插入排序(K= M,M-1,...,1)

希尔排序的特点:

(1)一次移动,移动位置较大,跳跃式地接近排序的最终位置; 

(2)最后一次只需要少量移动

(3)增量序列必须是递减的,最后一个必须是1

(4)增量序列应该是互质的

希尔排序算法(主程序):

void ShellSort(SQList *L, int dlta[], int len)
{
    //按增量序列dlta[0~len-1]对顺序表L做希尔排序
    for (int k = 0; k < len; k++)
        ShellInsert(L, dlta[k]);
}

希尔排序(其中一趟的排序操作)

void ShellInsert(SQList *L, int dk)
{
    //对顺序表L进行一趟增量为dk的希尔排序,dk为步长因子
    for (int i = dk + 1; i <= L->length; i++)
    {
        if (L->r[i].key < L->r[i-dk].key)
        {
            L->r[0] = L->r[i];
            for (int j = i - dk; j > 0 && L->r[0].key < L->r[j].key; j = j-dk)
            {
                L->r[j+dk] = L->r[j];
            }
            L->r[j+dk] = L->r[0];
        }
    }
}

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

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

相关文章

嗯哦哎辟 NOIP 2022 游寄

虽然上次不是假的&#xff0c;但这次是真的寄了。 Day 0 虽然是南京本地人&#xff0c;但因疫情原因&#xff0c;晚上决定去住了酒店。 看了一眼考场&#xff0c;感觉位置小得离谱。不愧是 NOI 2022 团体总分第十的“强省”江苏。 刚开始去了 409&#xff0c;发现房间里一股…

非凡社群管理之社群管理如何制定规则

1、加人规则&#xff1a;我们上篇文章里说到了&#xff0c;拉人前也是要进行一个明确定位的&#xff0c;不能什么人都拉&#xff0c;这就是我们常说的“设门槛”&#xff0c;避免占用群资源以及后期花费精力对其进行筛除。常用到的方式有这么几种&#xff1a;邀请式&#xff08…

【C++】类和对象(下)(再谈构造函数 初始化列表 explicit关键字 static成员 特性 友元 友元函数 友元类 内部类 匿名对象)

文章目录再谈构造函数初始化列表explicit关键字static成员特性友元友元函数友元类内部类匿名对象再谈构造函数 我们之前学习构造函数的时候&#xff0c;调用构造之后对象中就已经有了一个初始值&#xff0c;但不能说它是对对象像成员变量的初始化&#xff0c;构造函数体中的语…

windows10不支持Miracast无线投屏(不能进行无线投影)

电脑屏幕小看视频不爽&#xff0c;想把电脑屏幕投屏到电视上&#xff08;单独买一块高质量显示屏太贵&#xff0c;而且没有大尺寸的电视看的爽&#xff09;&#xff0c;但是windows提示不支持Miracast&#xff0c;跟着下面步骤教你解决问题。 当链接电视时出现下图提示不支持Mi…

SpringBoot 3.0 来啦!

SpringBoot 3.0 来啦&#xff01;&#xff01; 大家好&#xff0c;我 是 Ding Jiaxiong。 没赶上热乎的&#xff0c;晚了两天&#xff0c;2022年11月24日&#xff0c;SpringBoot 3.0 正式发布了&#xff01; 文章目录SpringBoot 3.0 来啦&#xff01;&#xff01;1 看看官网2…

ARM 37 个通用寄存器详解

一、简介 1、ARM 总共有 37 个寄存器&#xff0c;但是每种模式下最多只能看到 18 个寄存器&#xff0c;其他寄存器虽然名字相同&#xff0c;但是在当前模式不可见。 2、例如&#xff0c;对 r13 这个名字来说&#xff0c;在 ARM 中共有 6 个名叫 r13&#xff08;又叫 sp&#x…

SpringBoot SpringBoot 原理篇 1 自动配置 1.10 bean 的加载方式【八】

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇1 自动配置1.10 bean 的加载方式【八】1.10.1 BeanDefinitionRegistryPostPro…

ABAP学习笔记之——第五章:内表

内表&#xff1a; 内表是可以在程序内部定义且使用的表&#xff0c;属于本地表。 与C语言比较&#xff1a; C语言的数组和内表比较&#xff1a; 内表是动态数组(Dynamic Data Object) INITIALSIZE 语句并非实际占用内存空间&#xff0c;而只是预约(RESERVE)内存空间。 创建…

Python每日一练 06

Python每日一练 06 文章目录Python每日一练 06while循环实例一、斐波那契数列前n项实例二、Leibniz公式计算圆周率while循环 循环结构表示程序重复执行某个或某些操作&#xff0c;直到某条件为假&#xff08;或为真&#xff09;时才可终止循环。 在问题求解过程中&#xff0c;…

[算法笔记]最长递增子序列和编辑距离

最长递增子序列 例如对于 a[] {2,1,5,3,6,4,8,9,7}其最长递增子序列为{1,3,4,8,9}所以长度&#xff08;或者说是结果&#xff09;为5。 对于a[0...n-1]&#xff0c;用dp[i]表示a[0...i]中以a[i]结尾的最长递增子序列长度 其状态状态方程&#xff1a; dp[i]1 // 0≤i≤…

【无人机通信优化】基于粒子群算法的多跳无线网络部署优化附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

[附源码]SSM计算机毕业设计时事资讯平台JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Date对象

文章目录Date日期对象Date对象的创建格式化日期3.获取Date总的毫秒数(时间戳)&#xff0c;是距离1970年1月1日过了多少毫秒数。二&#xff1a;常用时间获取方法三&#xff1a;日期设置方法四&#xff1a;时间转字符串菜鸟工具&#xff1a;https://www.runoob.com/jsref/jsref-o…

在Express框架使用ORM模型访问关系型数据库

一、ORM模型&#xff1a;设计思想&#xff0c;主要目的是简化计算机程序访问数据库 1、ORM&#xff1a;对象关系模型(对象关系映射) Object Releastion Model,将程序中的对象和数据库中关系(表格)进行映射。可以使开发者在程序中方便的对数据库进行操作(用户在程序操作对对象实…

【网页制作课作业】用HTML+CSS制作一个简单的学校网页(9页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

一文熟悉 Go 的分支结构(if - else-if - else、switch)

哈喽大家好&#xff0c;我是陈明勇&#xff0c;今天分享的知识是 Go 的分支结构。如果本文对你有帮助&#xff0c;不妨点个赞&#xff0c;如果你是 Go 语言初学者&#xff0c;不妨点个关注&#xff0c;一起成长一起进步&#xff0c;如果本文有错误的地方&#xff0c;欢迎指出&a…

Python爬虫脚本+XML解析实现自动保存某商城的商品图

文章目录 1.背景介绍2.代码分析2.1.创建图片保存的目录2.2.定一下载函数2.3.发送请求解析数据2.源代码(全)1.背景介绍 Python脚本可以实现数据的爬取,而XML可以解析网页数据。将Python爬虫脚本与XML解析功能相结合,可以实现自动保存某商城的商品图功能。 注:本功能仅用于…

基于AlexNet卷积神经网络的手写体数字识别系统研究-附Matlab代码

⭕⭕ 目 录 ⭕⭕✳️ 一、引言✳️ 二、手写体数字识别系统✳️ 2.1 MNIST 数据集✳️ 2.2 CNN✳️ 2.3 网络训练✳️ 三、手写体数字识别结果✳️ 四、参考文献✳️ 五、Matlab代码获取✳️ 一、引言 手写数字识别是计算机视觉领域中的一个重要应用&#xff0c;已广泛应用在很…

电动汽车充电站的最优选址matlab程序

​摘要&#xff1a;以规划期内充电站的总成本 &#xff08;包括投资、运行和维护成本&#xff09;和网损费用之和最小为目标&#xff0c;考虑了相关的约束条件&#xff0c;构造了电动汽车充电站最优规划的数学模型&#xff0c; 关键词&#xff1a;电动汽车&#xff1b;充电站&a…

角色扮演?一款跨平台可移植开源游戏

程序员宝藏库&#xff1a;gitee.com/sharetech_lee/CS-Books-Store DevWeekly收集整理每周优质开发者内容&#xff0c;包括开源项目、资源工具、技术文章等方面。 每周五定期发布&#xff0c;同步更新到 知乎&#xff1a;Jackpop 。 欢迎大家投稿&#xff0c;提交issue&#…