【算法设计与分析】4.2 插入排序

2023-05-16

说明:参考书目为《Computer Algorithms --- Introduction to Design and Analysis》(第三版)Sara Baase, Allen Van Gelder

部分内容参考自大工林晓惠老师的课程【算法设计与分析】讲解。林老师讲算法非常细致,让人很容易理解,推荐一波~

(如部分内容涉及侵权,请联系我删除,谢谢)

 

之前的文章请见:

【算法设计与分析】如何分析一个算法

之后的文章请见:

【算法设计与分析】(习题4.2-4.5) 冒泡排序

本篇文章目录

第四章 排序算法

4.1 章节介绍

1. 定义

2. 章节结构

3. 重点内容

 4.2 插入排序

1. 定义

2. 排序过程示例

3. 算法代码

4. 分析O(n), W(n), A(n)

5. 此类算法的性能分析


 

第四章 排序算法

4.1 章节介绍

1. 定义

对n个数据元素按照关键字key递增 / 递减排列

2. 章节结构

注意:在基于比较操作的排序算法中,一般是多次比较后移动数据,即数据移动的次数在量级上不会超过比较次数,所以本系列文章大多数时候只分析比较次数

3. 重点内容

①算法时间复杂度的分析——证明

②算法改进

③算法正确性证明

 

 

 4.2 插入排序

(章节号对应参考书目,前三章都是基础内容,可以查阅数据结构相关知识,本系列文章从第四章排序算法开始)

1. 定义

将待排序的数据元素按其关键字的大小依次插入到前面已排序的适当位置上

2. 排序过程示例

3. 算法代码

教材中算法的核心思想是构造一个shiftVac函数:

int shiftVac(Element[] E, int vacant, Key x)
    条件:vacant非负
    return -> x排序后的位置xLoc
    算法核心:1. xLoc之前的数据位置不变;2. xLoc后至原x位置(vacant)-1的数据均向后移动一位

教材给了两种算法思路,第一种是递归,第二种是迭代。

两种方法都是基于前面的数据已经排好序的前提下,试图在排好序的序列中找到合适的位置。只要前面有一个元素不大于自身,就将当前位置作为合适位置,否则将数据向后挪动一位。

// 递归
int shiftVac(Element[] E, int vacant, Key x){
    int xLoc;
    if(vacant ==0)
        xLoc = vacant;
    else if(E[vacant-1].key <= x)
        xLoc = vacant;
    else
        E[vacant] = E[vacant-1];
        xLoc = shiftVac(E, vacant-1, x);
    return xLoc;
}

 

// 迭代
int shiftVec(Element[] E, int vacant, Key x) {
    int xLoc = 0;    // Assume failure. 始终未找到key<=x,即x应排在第一位
    while(vacant > 0)
    {
        if(E[vacant-1].key <= x)
        {
            xLoc = vacant;    // Succeed.
            break;
        }
        E[vacant] = E[vacant-1];
        vacant --;    // Keep looking.
    }
    return xLoc;
}

insertionSort是调用shiftVec对整个数组进行插入排序的函数:

其中,Element[] E是待排序的数组,也是排好序输出的数组;n是数组大小

void insertionSort(Element[] E, int n) {
    int xindex;
    for(xindex=1; xindex<n; xindex++)
    {
        Element current = E[xindex];
        Key x = current.key;
        int xLoc = shiftVac(E, xindex, x);
        E[xLoc] = current;
    }
    return;
}

4. 分析O(n), W(n), A(n)

空间:O(1)【需要一个额外的辅助空间】

时间:

1)最好情况:O(n) 【待排序的数据已经有序, n-1次数据比较,0次数据移动】

2)最坏情况W(n)=\sum_{i=1}^{n-1}i=\frac{n(n-1)}{2}\in \Theta (n^{2})【待排序的数据逆序,第二个数据向前比较一次,第三个数据向前比较两次……第n个数据向前比较n-1次】

3) 平均情况:【假定①所有可能的输入都以同等概率出现②每个键值唯一,计算每种输入的比较次数并求和,然后除以输入的数量,即得到平均的时间复杂度】

用下面一张图说明什么是所有可能的输入

A(n)的推导过程:

5. 此类算法的性能分析

1)此类算法特点:①基于比较、数据移动完成排序  ②一次比较操作后不发生数据移动或仅仅交换一对相邻的数据元素

2)逆序概念:假定排列\pi:2, 4, 1, 5, 3。\pi(1)=2 即序列第一个位置的数据为2,同理\pi(2)=4。

若排列\pi前面的数据大于后面的数据[ i<j,\pi(i)>\pi(j) ],则是一对逆序。例如排列2, 4, 1, 5, 3 有4 对逆序:(2, 1), (4, 1), (4,3)和(5, 3)

3)性能分析:对排列\pi进行排序 <=> 消除\pi中所有逆序

如果排序时一次数据比较最多消除一对逆序 -> 有多少对逆序就要进行多少次比较

计算最坏情况W(n)

对于有n个元素的序列:两两一对,一共有\frac{n(n-1)}{2}个有序对(此为有序对最多的情况,即降序)

根据上面的假设,一次数据比较最多消除一个逆序,所以最坏情况W(n)=\frac{n(n-1)}{2} \in \Theta (n^2)

 ②计算平均情况A(n)

设有一个排列\pi\pi(1),\pi(2),...,\pi(n)。颠倒该排列\pi所有数据位置得到transpose排列:\pi(n),...,\pi(2),\pi(1)。

则在\pi中的逆序对在transpose中正序,在\pi中的正序在transpose中逆序 -> \pi + transpose的逆序对之和=n(n-1)/2 -> 平均一个排列\pi存在n(n-1)/4个逆序

根据上面的假设,一次数据比较最多消除一个逆序,所以平均情况A(n)=\frac{n(n-1)}{4}

4)定理4.1(由(3)推理得到)

任何一个基于关键字的比较且每一次比较最多消除一个逆序的排序算法,最坏的情况下至少比较n(n-1)/2次,平均情况至少比较n(n-1)/4次。

注:“至少”指的是算法设计得到,用相应的次数比较即可排好序,若是算法设计冗余,可能会用更多的比较次数才能排好序。

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

【算法设计与分析】4.2 插入排序 的相关文章

  • MATLAB实现传递函数模型、零极点模型和状态空间模型的建立与转换(1)

    1 传递函数模型的建立 xff1a tf 1 1 格式 xff1a G 61 tf num den xff0c num和den分别代表分子分母的零极点 输出为连续时间传递函数模型 注 xff1a 工作区的模型G对应 1 1 tf 表示G为单
  • MATLAB中subs函数

    subs函数 1 将变量x替换为数值1 xff1a subs S x 1 2 将变量x替换为变量z xff1a subs S x z 3 同时将变量x和y分别替换为1和z xff1a subs S x y 1 z 4 将单变量替换为数组 x
  • LQR线性二次型调节器3(Discrete-time system Linear-Quadratic Regulator design,离散系统分析及MATALB实例)

    离散系统线性二次型调节器 xff0c dlqr函数 xff0c dare函数 一 离散时间系统二次型优化 xff1a dlqr 函数1 1 MATLAB函数形式1 2 举例 xff1a 二 离散时间系统李卡提方程求解函数 xff1a dar
  • 彻头彻尾理解JVM系列之八:Java代码是如何被CPU狂飙起来的?

    大家好 我是慕枫 前阿里巴巴高级工程师 InfoQ签约作者 阿里云专家博主 一直致力于用大白话讲解技术知识 在这里和大家分享一线互联网大厂面试经验 技术人成长路线以及Java技术 分布式 高并发 架构设计方面的经验总结 感恩遇见 希望我们都
  • 最优控制理论(一)基本概念

    1 概念 在军事 航空航天 导航制导 生产 经济活动以及人类其他有目的的活动中 xff0c 常需要对被控系统 被控过程施加某种控制作用 xff0c 使某个性能指标达到最优 xff0c 这种控制作用称为最优控制 使控制系统的性能指标实现最优化
  • ROS学习笔记--cv_bridge

    cv bridge是在ROS图像消息和OpenCV图像之间进行转换的一个功能包 一 xff09 在ROS图像和OpenCV图像之间转换 xff08 C 43 43 xff09 xff11 xff0e Concepts xff08 概念 xf
  • stm32+esp8266+onenet (MQTT)

    使用stm32采集温湿度 MQ2的数值用过 esp8266 43 mqtT协议把数据传输给onenet平台 并且能通过onenet下发指令控制led灯的亮灭 打开onenet平台 xff0c 使用旧版MQTT协议 xff0c 选择多协议接入
  • Hadoop The Definitive Guide:Hadoop权威指南-PART 1

    简介 xff1a Hadoop起源于Nutch 当人们试图构建一个开源网络搜索引擎 xff0c 但在管理在少数计算机上运行的计算时遇到了麻烦 后来Google发表了GFS和MapReduce相关介绍 xff0c 路线就变得清晰了 他们设计了
  • 【计算机图形学】绘制一个基于GDI的图形程序

    这学期选修了计算机图形学这门课 xff0c 该合集用来记录课程所学知识 概念类的内容来自于百度文库 xff1a https wenku baidu com view c3c5b36048d7c1c708a145a2 html 概念介绍 GD
  • Ubuntu 18.04 安装无人机开发环境 PX4+ROS+Gazebo

    Ubuntu 18 04 安装无人机开发环境 PX4 43 ROS 43 Gazebo 本教程基于纯净的Ubuntu 18 04 配置上述环境 由于国内网络环境问题 xff0c 无法正常从github下载文件的请用代理 代理网站 xff1a
  • docker命令详解及参数作用

    下载镜像 docker pull 镜像名 标签 查看本地镜像 docker images 删除镜像 xff1a docker rmi 镜像名 标签 启动容器 docker run d name 61 mynginx resrart 61 a
  • Mac sourcetree连接gitee码云仓库

    一 复制自己的ssh key 添加到gitee的ssh 共钥中 二 添加后 xff0c 在终端输入 ssh T git 64 gitee com gt gt 出现下面的successfully就代表关联成功了 三 sourcetree中选择
  • 路径规划与避障算法(一)---DWA算法概述

    版权声明 xff1a 本文为博主原创文章 xff0c 转载请联系博主 https mp csdn net mdeditor 82764989 DWA 动态窗口算法 算法概述 算法原理可见 https blog csdn net heyiji
  • 路径规划与避障算法(七)---DWA算法流程之三---碰撞检测评价函数

    版权声明 xff1a 本文为博主原创文章 xff0c 原创不易 转载请联系博主 本篇博客主要介绍DWA算法所采用的评价函数中障碍物相关的评价函数 评价函数 轨迹主要依据以下三条准则进行评分 综合评分后选取分数最小的路径作为下一时刻选择路径
  • 彻头彻尾理解JVM系列之九:不会JVM调优怎么进互联网大厂

    大家好 我是慕枫 前阿里巴巴高级工程师 InfoQ签约作者 阿里云专家博主 一直致力于用大白话讲解技术知识 在这里和大家分享一线互联网大厂面试经验 技术人成长路线以及Java技术 分布式 高并发 架构设计方面的经验总结 感恩遇见 希望我们都
  • CVPR代码和论文链接目录大全

    最新 xff01 CVPR 2021 语义分割论文大盘点 xff08 39篇论文 xff09 xff1a https blog csdn net amusi1994 article details 118426626 CVPR代码和论文链接
  • Ubuntu 桌面被删除,恢复

    step1 在桌面上打开终端 xff0c cd 到自己的home文件夹 step2 ls la 出现隐藏的文件及文件夹 step3 找到 config文件夹中的user dirs dirs 如图 图是找的图片 将最后vim user dir
  • 在Linux中编译带有自己编写的头文件的C程序

    有三个文件callback c xff0c callback h xff0c demo c 其中callback h是自己编写的头文件 在Linux中编译运行demo c的时候注意也要编译callback c文件 xff0c 否则会报错 引
  • Anaconda和TensorFlow开发环境搭建

    参考链接 xff08 MOOC大学 深度学习应用开发 TensorFlow实践 第二讲 xff09 xff1a https www icourse163 org course ZUCC 1206146808 一 Anaconda下载 官网下
  • 【wxPython导入失败】Failed building wheel for wxPython

    导入包wxPython失败 xff1a Failed building wheel for wxPython 错误原因 xff1a 根据错误提示发现我的电脑上有两个版本的Python xff0c 一个是最开始学Pyhton的时候装的3 7版

随机推荐