目录

一、插入排序

二、直接插入排序(straight insertion sort)

1. 思路介绍

2. 代码实现

3. 特性总结 

三、希尔排序(Shell sort)

1. 思路介绍

2. 代码实现

3. 特性总结 

四、总结


一、插入排序

常见的排序算法有:

而本篇文章要介绍的是插入排序。

插入排序可以分为 直接插入排序 和 希尔排序 


二、直接插入排序(straight insertion sort)

1. 思路介绍

        直接插入排序是一种简单的插入排序法,其基本思想是:

        把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。

如图是基本思想的示意图:排序思路:

  1. 将整个数据划分为有序区和无序区,初始时有序区只有一个数据,无序区包含了剩余所有待排序数据。
  2. 将无序区的第一个数据插入到有序区的合适位置中,从而使无序区减少一个数据,有序区增加一个数据。
  3. 重复步骤2,知道无序区没有数据。

 对于一组数据:3,44,38,5,47,15,36,26,27,2,46,4,19,50,48  它的排序个过程如下:

排序动图如下:

排序一个数据的方法(排升序):

        将要排序数据先和有序区的最后一个数据比较,如果比该数据小,就将有序区该数据向后移动一位;如果比该数据大,就什么都不做,因为这样已经将该要排序数据排好了。排序一个数据的代码实现:

int end;// 有序区最后一个数据的下标
int tmp;// 该趟要排序的数据// 插入:将tmp插入到[0,end]区间中去
while (end >= 0)
{if (tmp < a[end]){a[end + 1] = a[end];// 后移有序区数据end--;}else{break;// 已经找到到合适位置,则退出循环}
}
a[end + 1] = tmp;// 插入合适位置

2. 代码实现

排序一组数据,就只需要遍历所有数据,逐步插入就可以了。则C语言代码实现:

// 插入排序 - 排升序
void InsertSort(int* a, int n)
{for (int i = 1; i < n; i++){int end = i - 1;// 有序区最后一个数据的下标int tmp = a[i];// 该趟要排序的数据// 插入:将tmp插入到[0,end]区间中去while (end >= 0){if (tmp < a[end]){a[end + 1] = a[end];// 后移有序区数据end--;}else{break;// 已经找到到合适位置,则退出循环}}a[end + 1] = tmp;// 插入合适位置}
}

3. 特性总结 

直接插入排序的特性总结:

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高
  2. 时间复杂度:O(N^2),最好情况:O(N),最坏情况:O(N^2)
  3. 空间复杂度:O(1)
  4. 稳定性:稳定


    三、希尔排序(Shell sort)

    1. 思路介绍

            希尔排序是对直接插入排序的一种改进。

            希尔排序法又称缩小增量法。希尔排序法的基本思想是: 

            把待排序数据分割为若干子序列,再对各个子序列分别进行直接插入排序。

    排序思路:

    1. 先选定一个整数gap,表示间隔,把待排序文件中所有记录分成gap个组,把所有距离为gap的记录分在同一组内,并对每一组内的记录进行直接插入排序,让整个数据接近有序。
    2. 然后,每次将gap缩小一半,重复上述分组排序的工作,让整个数据逐渐接近有序。
    3. 当到达gap = 1时,就相当于普通的直接插入排序,但此时整个数据已经非常接近有序,排序效率是非常高。

    所以,当gap>1时,这就是对数据的预排序;当gap=1时,这就是普通直接插入排序。

    如图是希尔排序的示意图:

    排序间隔为gap的一组。

    如图为假设 gap = 3 时其中一组数据的的直接插入排序:

    排序间隔为gap的其中一组的代码实现:

    int gap;// 间隔
    for (int i = gap; i < n; i += gap)
    {int end = i - gap;// 有序区最后一个数据的下标int tmp = a[i];// 该趟要排序的数据// 间隔gap插入while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];// 后移有序区数据end -= gap;}else{break;// 已经找到到合适位置,则退出循环}}a[end + gap] = tmp;// 插入合适位置
    }

    那么排序gap时,所有组的实现就是通过调整状态的起始位置,然后重复上述实现:

    int gap;// 间隔
    for (int j = 0; j < gap; j++)
    {for (int i = j + gap; i < n; i += gap){int end = i - gap;// 有序区最后一个数据的下标int tmp = a[i];// 该趟要排序的数据// 间隔gap插入while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];// 后移有序区数据end -= gap;}else{break;// 已经找到到合适位置,则退出循环}}a[end + gap] = tmp;// 插入合适位置}
    }

    如图所示,为当gap=3时的一组排序过程:


    直到一组gap值的排序后,就可以再调整gap值为原来的一半,重复这个过程就可以了。

      一般来说,gap的值是可以随意取的。但

      gap如果越大,那么间隔就大,排完一组的的时间就快,但这样越不接近有序;

      gap如果越小,那么间隔就小,排完一组的的时间就慢,但这样越接近有序;

              所以,希尔排序(Shell Sort)的间隔gap初始值通常取原数据长度的一半(即 gap = n/2),然后逐步缩小(如每次减半),最终缩小到1进行最后一次插入排序。

              n/2 的间隔能确保子序列覆盖整个数组,避免遗漏元素。

      2. 代码实现

      希尔排序C语言实现如下:

      //希尔排序
      void ShellSort(int* a, int n)
      {int gap = n;// 间隔while (gap > 1){gap /= 2;for (int j = 0; j < gap; j++){for (int i = j + gap; i < n; i += gap){int end = i - gap;// 有序区最后一个数据的下标int tmp = a[i];// 该趟要排序的数据// 插入while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];// 后移有序区数据end -= gap;}else{break;// 已经找到到合适位置,则退出循环}}a[end + gap] = tmp;// 插入合适位置}}}
      }

      可以发现这里的循环很多,所以这里可以简化一下:

      void ShellSort(int* a, int n)
      {int gap = n;// 间隔while (gap > 1){gap /= 2;for (int i = gap; i < n; i++){int end = i - gap;// 有序区最后一个数据的下标int tmp = a[i];// 该趟要排序的数据// 插入while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];// 后移有序区数据end -= gap;}else{break;// 已经找到到合适位置,则退出循环}}a[end + gap] = tmp;// 插入合适位置}}
      }

      3. 特性总结 

      希尔排序的特性总结:

      1. 希尔排序是对直接插入排序的优化。
      2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。
      3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算。一般来说,时间复杂度是Q(n^{1.3})~O(n^{2})之间。
      4. 空间复杂度:O(1)
      5. 稳定性:不稳定

      四、总结

      • 直接插入排序通过将待排序元素逐个插入已排序序列来实现排序,时间复杂度为O(N^2),适用于接近有序的数据。
      • 希尔排序是直接插入排序的改进版本,采用分组排序策略,先通过较大间隔进行预排序,再逐步缩小间隔直至1,提高了整体排序效率。
      • 希尔排序的时间复杂度难以精确计算,但优于直接插入排序,空间复杂度均为O(1)。
      • 两种算法的主要区别在于:直接插入排序稳定但效率较低,希尔排序不稳定但效率较高。

      感谢各位观看!希望能多多支持!

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

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

      相关文章

      水面垃圾清扫船cad【6张】三维图+设计说明书

      海洋吸尘器结构设计 摘 要 近年来&#xff0c;随着经济的快速发展&#xff0c;海洋产业及海上活动的增加&#xff0c;导致海洋漂浮垃圾越来越多&#xff0c;对沿岸的居民和海洋的生物的生命安全造成了很大的威胁&#xff0c;严重破坏海洋生态平衡。针对海洋垃圾污染这一主要问…

      03-List列表数据类型

      1.特点&#xff1a; 原属是字符串类型 列表头尾增删块&#xff0c;中间慢&#xff0c;增删元素是常态 元素可重复 最多包含2^32-1个元素 索引通python列表2.常用命令 ------增------ 1.从列表头部压入数据LPUSH key value1 value22.从列表尾部压入数据RPUSH key value1 value23…

      防火墙认证用户部署

      文章目录1、配置vlan2、防火墙配置&#xff08;1&#xff09;配置安全区域&#xff08;2&#xff09;接口加入安全区域(3)fw配置DHCP(4)地址组&#xff08;5&#xff09;管理员(6)用户认证1、配置vlan vlan batch 10 20 [Huawei-GigabitEthernet0/0/2]port link-type access …

      Vue.js之监听器

      watch侦听器&#xff1a;作用:监视数据变化&#xff0c;执行一些 业务逻辑 或 异步操作。 语法:简单写法→简单类型数据&#xff0c;直接监视完整写法 → 添加额外配置项 (1)deep:true 对复杂类型深度监视(2)immediate:true 初始化立刻执行一次handler方法//1.简单写法 data: {…

      25电赛e题杂乱环境稳定识别矩形框(附源码)

      ​ 识别并跟踪矩形目标 识别视频中符合矩形轮廓的目标区域&#xff0c;并标记中心点位置。 实现思路 **图像预处理&#xff1a;灰度 二值化**闭运算消除孔洞二值化处理查找并筛选矩形轮廓解算中心点目标筛选结果绘制 环境 使用 OpenCV 和 python&#xff1a; 图像预处理…

      【前端安全】聊聊 HTML 闭合优先级和浏览器解析顺序

      【前端安全】聊聊浏览器解析顺序和 HTML 闭合优先级 最近在研究 XSS 的时候&#xff0c;发现一个特别容易被忽略的问题 —— 浏览器到底是怎么解析 HTML 的&#xff1f;为什么有些 payload 成功了&#xff0c;有些却怎么试都不行&#xff1f;其实这跟标签的闭合优先级还有解析顺…

      PHP-分支语句、while循环、for循环

      分支语句 无论在何种编程语言中&#xff0c;流程控制都是很重要的内容。由于 PHP 的大部分语法都继承了C语言的特点&#xff0c; 因此在流程控制方面&#xff0c;PHP 有着和C语言类似的流程控制。 if else 语句是流程控制中根据条件判断执行的一种。该语句执行时先对条件进行判…

      并发编程常用工具类(下):CyclicBarrier 与 Phaser 的协同应用

      在并发编程中&#xff0c;除了CountDownLatch和Semaphore&#xff0c;CyclicBarrier和Phaser也是实现多线程协作的重要工具。它们在处理多阶段任务同步、动态调整参与线程等场景中展现出独特价值。本文作为并发工具类系列的第二篇&#xff0c;将深入解析CyclicBarrier和Phaser的…

      机器人焊接节气装置

      在摩托车制造过程中&#xff0c;精密部件的焊接质量直接影响整车的安全性和操控性能。以发动机缸体焊接为例&#xff0c;传统手工焊接容易出现焊缝不均匀的问题&#xff0c;而采用六轴弧焊机器人后&#xff0c;焊接精度能控制在0.1毫米以内。日本川崎重工的生产数据显示&#x…

      使用yolo11训练食物浪费检测数据集VOC+YOLO格式6734张32类别步骤和流程

      【数据集介绍】数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数)&#xff1a;6734标注数量(xml文件个数)&#xff1a;6734标注数量(txt文件个数)&#xff1…

      掌握PowerPC架构与编程技巧:技术资料详解

      本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;PowerPC是一种高性能的RISC架构&#xff0c;最初由IBM、Motorola和Apple联合开发&#xff0c;被设计用于高端工作站和服务器&#xff0c;同时广泛应用于嵌入式系统、航空电子设备、游戏主机和超级计算机等领域。…

      VR 企业展厅:开启数字化展示新时代

      在当今数字化浪潮席卷各行各业的时代&#xff0c;企业的展示与宣传方式也在不断革新。VR&#xff08;虚拟现实&#xff09;技术的出现&#xff0c;为企业展厅带来了全新的变革&#xff0c;使其从传统的实体展示空间&#xff0c;转变为具有无限可能的数字化虚拟空间。一、VR 企业…

      测试用例颗粒度全解析

      引言&#xff1a;为什么颗粒度是测试团队的“隐形门槛”&#xff1f;在软件测试领域&#xff0c;测试用例颗粒度&#xff08;即测试用例的详细程度&#xff09;看似是一个基础问题&#xff0c;却常常成为团队协作的“隐形门槛”。某电商平台测试团队曾出现过这样的窘境&#xf…

      分布式锁的基本原理和基于lua脚本的实现(Redisson)

      为了确保分布式锁可用&#xff0c;我们要确保锁的实现同时满足以下四个条件&#xff1a;- 互斥性。在任意时刻&#xff0c;只有一个客户端能持有锁。- 不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁&#xff0c;也能保证后续其他客户端能加锁。- 解铃还须系…

      智慧园区数字孪生全生命周期交付体系:从虚拟建模到全域智联的快速交付新常态

      在数字经济与绿色低碳转型的双重驱动下&#xff0c;智慧园区建设正经历从“物理空间堆砌”到“数据智能驱动”的范式革命。数字孪生技术作为核心引擎&#xff0c;通过构建物理园区的虚拟镜像&#xff0c;实现虚实空间的毫秒级同步与智能协同&#xff0c;推动园区管理向全要素感…

      电脑忘记开机密码怎么办?【图文详解】5种方法重置/更改/取消/设置开机密码?

      一、问题背景谁都有马虎的时候&#xff0c;要是突然忘了电脑开机密码&#xff0c;就只能对着登录界面干着急&#xff0c;没法打开电脑处理工作、查看文件&#xff0c;太影响效率了。别慌&#xff0c;其实有不少简单实用的办法能解除或重置密码&#xff0c;下面就来一一介绍&…

      Go语言select

      select是什么select是Go语言层面提供的一种多路复用机制&#xff0c;用于检测当前goroutine连接的多个channel是否有数据准备完毕&#xff0c;可用于读或写。Go语言的select语句&#xff0c;是用来起一个goroutine监听多个Channel的读写事件&#xff0c;提高从多个Channel获取信…

      VUE+SPRINGBOOT从0-1打造前后端-前后台系统-整体示例

      一、注册、登录、密码找回二、VUE前台系统三、VUE后台系统

      深入解析SmolVLA:VLM与动作专家间的注意力机制交互

      在机器人学习领域&#xff0c;如何有效地将视觉语言模型&#xff08;VLM&#xff09;的强大感知能力与低级动作控制相结合&#xff0c;是实现通用机器人智能的关键挑战。SmolVLA&#xff08;Small Vision-Language-Action&#xff09;架构正是在这一背景下应运而生&#xff0c;…

      Spring Security 认证与授权实现机制

      Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架&#xff0c;其认证和授权实现机制如下&#xff1a;一、认证(Authentication)实现 1. 核心组件 AuthenticationManager&#xff1a;认证入口点&#xff0c;委托给AuthenticationProviderAuthenticationProv…