26考研——排序_插入排序(8)

408答疑


文章目录

  • 二、插入排序
    • 基本概念
    • 插入排序方法
    • 直接插入排序
      • 算法描述
      • 示例
      • 性能分析
    • 折半插入排序
      • 改进点
      • 算法步骤
      • 性能分析
    • 希尔排序
      • 相关概念
      • 示例分析
      • 希尔排序的效率
        • 效率分析
        • 空间复杂度
        • 时间复杂度
  • 九、参考资料
    • 鲍鱼科技课件
    • 26王道考研书


二、插入排序

基本概念

  • 定义:插入排序是一种简单直观的排序算法,其基本思想是每次将一个待排序的记录按其关键字大小插入前面已排好序的子序列,直到全部记录插入完成。

在这里插入图片描述

插入排序方法

  • 直接插入排序:将待排元素往已排序好的序列进行插入,叫做直接插入排序。

  • 折半插入排序:由插入排序的思想可以引申出折半插入排序。

  • 希尔排序:由插入排序的思想可以引申出希尔排序。

直接插入排序

算法描述

  • 基本思想:直接插入排序是一种最简单也最直观的排序算法。其基本思想是每次将一个待排序的记录按其关键字大小插入前面已排好序的子序列,直到全部记录插入完成。

在这里插入图片描述

  • 操作步骤:要将元素 L ( i ) L(i) L(i) 插入已有序的子序列 L [ 1... i − 1 ] L[1...i-1] L[1...i1],需要执行以下操作(下面用 L [ ] L[] L[] 表示一个表,而用 L ( ) L() L() 表示一个元素):

    1. 查找出 L ( i ) L(i) L(i) L [ 1... i − 1 ] L[1...i-1] L[1...i1] 中的插入位置 k k k
    2. L [ k . . . i − 1 ] L[k...i-1] L[k...i1] 中的所有元素依次后移一个位置。
    3. L ( i ) L(i) L(i) 复制到 L ( k ) L(k) L(k)
  • 实现过程:为了实现对 L [ 1... n ] L[1...n] L[1...n] 的排序,可以将 L ( 2 ) L(2) L(2) L ( n ) L(n) L(n) 依次插入前面已排好序的子序列,初始 L [ 1 ] L[1] L[1] 可以视为一个已排好序的子序列。

  • 执行次数:共进行 n − 1 n-1 n1 次插入操作(从 L ( 2 ) L(2) L(2) L ( n ) L(n) L(n))。

  • 原地排序:仅需常数级辅助空间,空间复杂度为 O ( 1 ) O(1) O(1)

示例

  • 初始序列 4 9 1 , 38 , 65 , 97 , 76 , 13 , 27 , 4 9 2 49_1, 38, 65, 97, 76, 13, 27, 49_2 491,38,65,97,76,13,27,492

  • 排序过程
    初始时 49 可以视为一个已排好序的子序列,按照上述算法进行直接插入排序的过程如下图所示,括号内是已排好序的子序列。

在这里插入图片描述

性能分析

  • 空间效率:仅使用了常数个辅助单元,因而空间复杂度为 O ( 1 ) O(1) O(1)

  • 时间效率

    • 在排序过程中,向有序子表中逐个地插入元素的操作进行了 n − 1 n-1 n1 趟,每趟操作都分为比较关键字和移动元素,而比较次数和移动次数取决于待排序表的初始状态。
    • 在最好情况下,表中元素已经有序,此时每插入一个元素,都只需比较一次而不用移动元素,因而时间复杂度为 O ( n ) O(n) O(n)
    • 在最坏情况下,表中元素顺序刚好与排序结果中的元素顺序相反(逆序),总的比较次数达到最大,总的移动次数也达到最大,总的时间复杂度为 O ( n 2 ) O(n^2) O(n2)
    • 平均情况下,考虑待排序表中元素是随机的,此时可以取上述最好与最坏情况的平均值作为平均情况下的时间复杂度,总的比较次数与总的移动次数约为 n 2 / 4 n^2/4 n2/4
    • 因此,直接插入排序算法的时间复杂度为 O ( n 2 ) O(n^2) O(n2)
  • 稳定性:因为每次插入元素时总是从后往前先比较再移动,所以不会出现相同元素相对位置发生变化的情况,即直接插入排序是一个稳定的排序算法。

  • 适用性:直接插入排序适用于顺序存储和链式存储的线性表,采用链式存储时无须移动元素。

折半插入排序

改进点

  • 折半插入排序算法对直接插入排序算法进行了改进,主要在于查找待插入元素位置的方法。通过使用折半查找来确定待插入元素的位置,从而减少比较次数。

算法步骤

  1. 将待插入的元素暂存到数组的第一个位置。
  2. 使用折半查找确定该元素在已排序子序列中的正确位置。
  3. 从后向前移动元素,为新元素腾出空间。
  4. 将新元素插入到正确的位置。

性能分析

  • 时间复杂度:折半插入排序的时间复杂度约为 O ( n log ⁡ 2 n ) O(n\log_2 n) O(nlog2n),这是因为折半查找减少了比较元素的次数。然而,由于元素的移动次数并未改变,总的时间复杂度仍为 O ( n 2 ) O(n^2) O(n2)。对于数据量不大的排序表,折半插入排序往往能表现出很好的性能。

  • 稳定性:折半插入排序是一种稳定的排序算法,因为它在插入元素时总是从后往前先比较再移动,不会出现相同元素相对位置发生变化的情况。

  • 适用性:折半插入排序仅适用于顺序存储的线性表,因为它依赖于顺序存储的线性结构来实现折半查找和元素的移动。

希尔排序

相关概念

  • 基本思想:希尔排序是基于直接插入排序进行改进而得来,又称缩小增量排序。它更适用于基本有序的排序表和数据量不大的排序表。

  • 排序过程:先将待排序表分割成若干形如 L [ i , i + d , i + 2 d , ⋯ , i + k d ] L[i, i+d, i+2d, \cdots, i+kd] L[i,i+d,i+2d,,i+kd] 的“特殊”子表,即相隔某个“增量”的记录组成一个子表,对各个子表分别进行直接插入排序,当整个表中的元素已呈“基本有序”时,再对全体记录进行一次直接插入排序。

  • 增量选择:先取一个小于 n n n 的增量 d 1 d_1 d1,把表中的全部记录分成 d 1 d_1 d1 组,所有距离为 d 1 d_1 d1 的倍数的记录放在同一组,在各组内进行直接插入排序;然后取第二个增量 d 2 < d 1 d_2 < d_1 d2<d1,重复上述过程,直到所取到的 d i = 1 d_i = 1 di=1,即所有记录已放在同一组中,再进行直接插入排序,由于此时已经具有较好的局部有序性,因此可以很快得到最终结果。

  • 稳定性:当相同关键字的记录被划分到不同的子表时,可能会改变它们之间的相对次序,因此希尔排序是一种不稳定的排序算法。

  • 适用性:希尔排序仅适用于顺序存储的线性表。

示例分析

在这里插入图片描述

希尔排序的效率

效率分析
  • 希尔排序的效率很高,尽管它也属于插入排序的一种,但其高效的原因有两个:
    1. 对于直接插入排序来说,数据量越小,效率越高。
    2. 对于直接插入排序来说,数据基本有序时,效率越高。
空间复杂度
  • 仅使用了常数个辅助单元,因此空间复杂度为 O ( 1 ) O(1) O(1)
时间复杂度
  • 增量序列的影响:希尔排序的时间复杂度依赖于所取“增量”序列的函数,这涉及一些数学上尚未解决的难题。

  • 特定情况下的时间复杂度: 当增量序列为 d l t a [ k ] = 2 t − k + 1 − 1 dlta[k] = 2^{t-k+1} - 1 dlta[k]=2tk+11 时,希尔排序的时间复杂度为 O ( n 3 / 2 ) O(n^{3/2}) O(n3/2),其中 t t t 为排序趟数, 1 ≤ k ≤ t ≤ ⌊ log ⁡ 2 ( n + 1 ) ⌋ 1 \leq k \leq t \leq \lfloor \log_2(n+1) \rfloor 1ktlog2(n+1)⌋

  • 实验基础上的推论:在大量的实验基础上推出:当 n n n 在某个特定范围内,希尔排序所需的比较和移动次数约为 n 1.3 n^{1.3} n1.3,当 n → ∞ n \to \infty n 时,可减少到 n ( log ⁡ 2 n ) 2 [ 2 ] n(\log_2 n)^{2^{[2]}} n(log2n)2[2]

  • 最坏情况:在最坏情况下希尔排序的时间复杂度为 O ( n 2 ) O(n^2) O(n2)

九、参考资料

鲍鱼科技课件

b站免费王道课后题讲解:
在这里插入图片描述

网课全程班:
在这里插入图片描述

26王道考研书

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

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

相关文章

精华贴分享|从不同的交易理论来理解头肩形态,殊途同归

本文来源于量化小论坛策略分享会板块精华帖&#xff0c;作者为孙小迪&#xff0c;发布于2025年2月17日。 以下为精华帖正文&#xff1a; 01 前言 学习了一段时间交易后&#xff0c;我发现在几百年的历史中&#xff0c;不同门派的交易理论对同一种市场特征的称呼不一样&#x…

leetcode437.路径总和|||

对于根结点来说&#xff0c;可以选择当前结点为路径也可以不选择&#xff0c;但是一旦选择当前结点为路径那么后续都必须要选择结点作为路径&#xff0c;不然路径不连续是不合法的&#xff0c;所以这里分开出来两个方法进行递归 由于力扣最后一个用例解答错误&#xff0c;分析…

北斗导航 | 改进奇偶矢量法的接收机自主完好性监测算法原理,公式,应用,RAIM算法研究综述,matlab代码

改进奇偶矢量法的接收机自主完好性监测算法研究 摘要 接收机自主完好性监测(RAIM)是保障全球导航卫星系统(GNSS)安全性的核心技术。针对传统奇偶矢量法在噪声敏感性、多故障隔离能力上的缺陷,本文提出一种基于加权奇偶空间与动态阈值的改进算法。通过引入观测值权重矩阵重…

深度神经网络全解析:原理、结构与方法对比

深度神经网络全解析&#xff1a;原理、结构与方法对比 1. 引言 随着人工智能的发展&#xff0c;深度神经网络&#xff08;Deep Neural Network&#xff0c;DNN&#xff09;已经成为图像识别、自然语言处理、语音识别、自动驾驶等领域的核心技术。相比传统机器学习方法&#x…

经典论文解读系列:MapReduce 论文精读总结:简化大规模集群上的数据处理

&#x1f9e0; MapReduce 论文解读总结&#xff1a;简化大规模集群上的数据处理 原文标题&#xff1a;MapReduce: Simplified Data Processing on Large Clusters 作者&#xff1a;Jeffrey Dean & Sanjay Ghemawat 发表时间&#xff1a;2004 年 发表机构&#xff1a;Google…

通过Appium理解MCP架构

MCP即Model Context Protocol&#xff08;模型上下文协议&#xff09;&#xff0c;是由Anthropic公司于2024年11月26日推出的开放标准框架&#xff0c;旨在为大型语言模型与外部数据源、工具及系统建立标准化交互协议&#xff0c;以打破AI与数据之间的连接壁垒。 MCP架构与Appi…

网页版五子棋项目的问题处理

文章目录 config.WebSocketConfig将键值对加⼊OnlineUserManager中线程安全、锁ObjectMapper来处理json针对多开情况的判定处理连接关闭、异常&#xff08;玩家中途退出&#xff09;后的不合理操作游戏大厅数据更新 config.WebSocketConfig 把MatchAPI注册进去 • 在addHandle…

【初探数据结构】归并排序与计数排序的序曲

&#x1f4ac; 欢迎讨论&#xff1a;在阅读过程中有任何疑问&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;如果你觉得这篇文章对你有帮助&#xff0c;记得点赞、收藏&#xff0c;并分享给更多对数据结构感…

算法刷题记录——LeetCode篇(8.7) [第761~770题](持续更新)

更新时间&#xff1a;2025-03-30 算法题解目录汇总&#xff1a;算法刷题记录——题解目录汇总技术博客总目录&#xff1a;计算机技术系列博客——目录页 优先整理热门100及面试150&#xff0c;不定期持续更新&#xff0c;欢迎关注&#xff01; 763. 划分字母区间 给你一个字…

Pod 网络与 CNI 的作用

在 Kubernetes 中&#xff0c;Pod 网络 是实现容器间通信的核心机制&#xff0c;每个 Pod 拥有独立的 IP 地址&#xff0c;可直接跨节点通信。CNI&#xff08;Container Network Interface&#xff09; 是 Kubernetes 的网络插件标准&#xff0c;负责为 Pod 分配 IP、配置网络规…

使用keepalived结合tomcat和nginx搭建三主热备架构

角色主机名软件IP地址用户client172.25.250.90keepalivedVIP172.25.250.100keepalivedVIP172.25.250.101keepalivedVIP172.25.250.102masterserverAkeepalived, nginx172.25.250.30backupserverBkeepalived, nginx172.25.250.31backupserverCkeepalived, nginx172.25.250.32web…

STRUCTBERT:将语言结构融入预训练以提升深度语言理解

【摘要】最近&#xff0c;预训练语言模型BERT&#xff08;及其经过稳健优化的版本RoBERTa&#xff09;在自然语言理解&#xff08;NLU&#xff09;领域引起了广泛关注&#xff0c;并在情感分类、自然语言推理、语义文本相似度和问答等各种NLU任务中达到了最先进的准确率。受到E…

leetcode_977. 有序数组的平方_java

977. 有序数组的平方https://leetcode.cn/problems/squares-of-a-sorted-array/ 1.题目 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1…

Nginx—nginx.conf 配置结构详解

一、nginx.conf 配置结构 函数 说明 main 全局配置 event 配置工作模式以及连接数 http http模块相关配置 server 虚拟主机配置&#xff0c;可以有多个 location 路由规则&#xff0c;表达式 upstream 集群、内网服务器&#xff08;负载均衡也在这里边配&#xff…

斐波那契数列----C语言

关于斐波那契 已知&#xff1a; 问题背景&#xff1a;一对兔子从第3个月开始每月生一对新兔子&#xff0c;新兔子同样在第3个月开始繁殖。 关键观察&#xff1a; 第1个月&#xff1a;1对&#xff08;初始兔子&#xff09;。 第2个月&#xff1a;1对&#xff08;未成熟&#…

vulhub靶场—— Tomcat8

目录 一、漏洞描述 二、靶场搭建 三、漏洞复现 1、弱密码 2、文件上传 一、漏洞描述 环境描述&#xff1a; Tomcat 支持后台部署 war 文件&#xff0c;可以直接将 webshell 部署到 web 目录下。tomcat 默认的管理页面 manager 使用 basic 认证用户名和密码登录&#xff0…

使用 Spring AI Aliabab Module RAG 构建 Web Search 应用

使用 Spring AI Alibaba 构建大模型联网搜索应用 Spring AI 实现了模块化 RAG 架构&#xff0c;架构的灵感来自于论文“模块化 RAG&#xff1a;将 RAG 系统转变为类似乐高的可重构框架”中详述的模块化概念。 Spring AI 模块化 RAG 体系 总体上分为以下几个步骤&#xff1a; …

一些练习 C 语言的小游戏

一些练习 C 语言的小游戏 — 1. 猜数字游戏 描述&#xff1a;程序随机生成一个数字&#xff0c;玩家需要猜测这个数字&#xff0c;并根据提示&#xff08;太高或太低&#xff09;调整猜测&#xff0c;直到猜中为止。 功能点&#xff1a; 随机数生成 (rand() 函数)。循环和…

关于中文编程的一些思考

随着信息化与数字化的发展&#xff0c;工业4.0时代亦将徐徐到来。当计算机的普及程度越来越高&#xff0c;数据的产生、传输、处理等变得越来越快、越来越大量的时候&#xff0c;人们想要自动化办公的愿望也越来越强烈&#xff0c;希望能将自身从耗费脑力但是重复繁琐的工作中解…

golang 日志log与logrus

目录 一、Go 标准库 log 详解 1. 功能特点 2. 常用函数 3. 示例代码 4. 优势和局限 二、第三方库 logrus 详解 1. 功能特点 2. 核心功能 3. 示例代码 4. 优势和扩展性 三、总结 1. 何时选择 log&#xff1f; 2. 何时选择 logrus&#xff1f; 3. 对比总结 一、Go 标…