插入排序和希尔排序

目录

前言

一.插入排序

1.思想

2.实现

3.特点

二,希尔排序

1.思想

2,实现

3.特点


前言

        排序算法是计算机科学中的基础工具之一,对于数据处理和算法设计有着深远的影响。了解不同排序算法的特性和适用场景,能够帮助程序员在特定情况下选择最合适的算法,从而提高程序的效率和性能。本节我们讲述插入排序和希尔排序。

一.插入排序

1.思想

插入排序基本思想是将一个元素逐个插入到已经排好序的元素序列中,从而得到一个新的有序序列。插入排序的步骤如下:

  1. 初始状态: 假设第一个元素已经是有序序列,可以将其视为一个只包含一个元素的序列。

  2. 从第二个元素开始: 将当前元素与已经排好序的元素比较,找到合适的位置插入。

  3. 插入操作: 将当前元素插入到合适的位置,同时调整其他元素的位置,以保持已有序序列的有序性。

  4. 重复: 重复步骤2和步骤3,直到所有元素都被插入到有序序列中,整个序列变得有序。

2.实现

void InsertSort(int* a, int n)
{for (int i = 0; i < n - 1; i++){int end = i;int tmp=a[end+1];while (end >= 0){if (tmp < a[end]){a[end + 1] = a[end];end--;}else{break;}}a[end + 1] = tmp;}
}

时间复杂度:O(n^2)

空间复杂度O(1)

稳定性:稳定

3.特点

1.优势:

  1. 对小型数据集的适用性: 插入排序在对小型数据集或基本有序的数据集进行排序时表现良好。

  2. 适用于链表: 插入排序在对链表进行排序时也是一种有效的选择,因为它可以通过改变节点的链接来进行排序,而无需移动大量数据。

  3. 稳定性: 插入排序是一种稳定的排序算法,即相等元素的相对顺序在排序前后保持不变。

2,缺点:

  1. 时间复杂度: 插入排序的平均和最坏情况时间复杂度均为O(n^2),其中n是数组的长度。这使得插入排序在处理大规模数据时效率相对较低,

  2. 对逆序数据的性能较差: 当输入数据基本逆序排列时,插入排序的性能会显著下降。每次插入都需要移动大量的元素,导致算法效率低下。

二,希尔排序

1.思想

        插入排序在数组接近有序的时候效率较高,我们就先尝试让数组接近有序.再使用插入排序,这是希尔排序

        基本思想是通过将待排序的元素分组,对每组使用插入排序,然后逐步减小每组的元素数量,最终完成整个序列的排序。希尔排序的主要思想包括以下几个步骤:

  1. 分组数: 选择一个递减的序列(,这个序列的最后一个元素通常是1。常见的步长序列选择有希尔自己提出的 N/2(其中N是数组长度)或其他更复杂的序列。

  2. 分组: 将待排序的元素按照步长分成若干个子序列,每个子序列相互独立。

  3. 对每个子序列进行插入排序: 对每个子序列应用插入排序算法,将子序列内的元素进行排序。

  4. 减小组: 缩小步长,重复步骤2和步骤3,直到步长为1。

  5. 最终插入排序: 当步长为1时,整个序列基本有序,此时使用插入排序对整个序列进行一次排序。

2,实现

void ShellSort(int* a, int n)
{int gap=n;while (gap > 1){gap = gap / 3 + 1;for (int j = 0; j < gap; j++){for (int i = 0; i < n - gap; i += gap){int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end-=gap;}else{break;}}a[end + gap] = tmp;}}}
}

        第一个while循环控制每一组的元素个数,当每一组的元素个数为1是,相当于插入排序,第一个for循环和第二个for循环控制对每一组进行插入排序

时间复杂度:大约O(n^1.3)

空间复杂度O(1)

稳定性:不稳定

3.特点

1.优势:

  1. 相对简单: 希尔排序的实现相对简单,不需要使用递归,只涉及到循环和插入排序的基本思想。这使得它在理解和实现上相对容易。

  2. 原地排序: 希尔排序是一种原地排序算法,它只需要一个常数级别的额外空间用于存储临时变量,而不需要额外的数据结构。

  3. 相对高效: 对于中等规模的数据集,希尔排序通常比插入排序和冒泡排序等简单排序算法更高效。它通过逐步减小间隔,先对较远距离的元素进行排序,然后逐渐缩小间隔,最终完成整体排序。这样可以使得部分元素在更早的阶段就趋于有序,减少了插入排序的工作量。

2.缺点

  1. 不稳定性: 希尔排序不是稳定的排序算法。当存在相等元素时,它可能会改变它们的相对顺序。在某些应用场景中,需要保持相等元素的相对位置关系,这时候希尔排序可能不是最佳选择。

  2. 不适合小规模数据集: 尽管希尔排序对于中等规模的数据集表现较好,但对于小规模数据集,其性能可能不如一些简单的排序算法。例如,对于10个或更少的元素,插入排序可能更为高效。

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

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

相关文章

如何使用玻璃材质制作3D钻石模型

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时&#xff0c;有几种不同的风格&#xf…

Spark与PySpark(1.概述、框架、模块)

目录 1.Spark 概念 2. Hadoop和Spark的对比 3. Spark特点 3.1 运行速度快 3.2 简单易用 3.3 通用性强 3.4 可以允许运行在很多地方 4. Spark框架模块 4.1 Spark Core 4.2 SparkSQL 4.3 SparkStreaming 4.4 MLlib 4.5 GraphX 5. Spark的运行模式 5.1 本地模式(单机) Local运行模…

初识Vue 解决vue在启动时生成的提示

让我为大家简单介绍一下吧&#xff01; Vue是一套用于构建用户界面的渐进式javaScript框架 当我们引入vue.js后 <script src"../js/vue.js"></script>我们发现&#xff0c;当我们打开网页时&#xff0c;控制台会出现以下内容 那我们该怎么解决呢&…

【设计模式--结构型--组合模式】

设计模式--结构型--组合模式 组合模式定义结构案例组合模式的分类优点使用场景 组合模式 定义 又称部分整体模式&#xff0c;是用于把一组相似的对象当作一个单一的对象。组合模式依据树型结构来组合对象&#xff0c;用来表示部分以及整体层次&#xff0c;这种类型的设计模式…

新增模板中心和系统设置模块,支持飞书平台对接,DataEase开源数据可视化分析平台v2.1.0发布

这一版本的功能升级包括&#xff1a;新增模板中心&#xff0c;用户可以通过模板中心的模板快速创建仪表板和数据大屏&#xff1b;新增“系统设置”功能模块&#xff0c;该模块包含系统参数、认证设置、嵌入式管理、平台对接四个子模块。在“系统参数”子模块中&#xff0c;用户…

代码上传的gitee平台

1.首先我们访问工作台 - Gitee.com进行注册和登录 2.我们创建一个仓库&#xff1a; 3.在本地创建我们的项目 在这文件夹里面我们打开git bush,执行 一下操作&#xff1a; git init &#xff1a;初始化仓库 git status&#xff1a;检查状态 git add . &#xff1a;将当前文件…

ubuntu 命令行安装 conda

安装包地址&#xff1a; Index of / 找到对应的版本&#xff0c;右键点复制链接 wget https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.shbash Anaconda3-2023.09-0-Linux-x86_64.sh https://linzhji.blog.csdn.net/article/details/126530244

BERT大模型:英语NLP的里程碑

BERT的诞生与重要性 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;大模型标志着自然语言处理&#xff08;NLP&#xff09;领域的一个重要转折点。作为首个利用掩蔽语言模型&#xff08;MLM&#xff09;在英语语言上进行预训练的模型&…

Keepalived+Nginx实现高可用(上)

一、背景与简介 为了服务的高可用性&#xff0c;避免单点故障问题&#xff0c;通常我们使用"冗余设计思想"进行架构设计。冗余设计思想&#xff0c;本质就是将同一个应用或者服务放置在多台不同的服务器上[鸡蛋不放在同一个篮子里]&#xff0c;这样减少整体服务宕机的…

ACWing week 3(C语言) 725.完全数

一个整数&#xff0c;除了本身以外的其他所有约数的和如果等于该数&#xff0c;那么我们就称这个整数为完全数。 例如&#xff0c;66 就是一个完全数&#xff0c;因为它的除了本身以外的其他约数的和为 1236 现在&#xff0c;给定你 N 个整数&#xff0c;请你依次判断这些数是…

ESP32网络开发实例-搭建ESP32固件远程升级服务器

搭建ESP32固件远程升级服务器 文章目录 搭建ESP32固件远程升级服务器1、ESP32设备自动升级流程2、软件准备3、硬件准备4、代码实现4.1 固件升级服务器代码实现4.2 基础固件代码4.3 新固件代码实现我们在前面的文章中,已经实现了OTA方式升级固件的两种方式:在Arduino IDE 中升…

数据结构与算法-动态规划-机器人达到指定位置方法数

机器人达到指定位置方法数 来自左程云老师书中的一道题 【题目】 假设有排成一行的 N 个位置&#xff0c;记为 1~N&#xff0c;N 一定大于或等于 2。开始时机器人在其中的 M 位置上&#xff08;M 一定是 1&#xff5e;N 中的一个&#xff09;&#xff0c;机器人可以往左走或…

基于大语言模型的复杂任务认知推理算法CogTree

近日&#xff0c;阿里云人工智能平台PAI与华东师范大学张伟教授团队合作在自然语言处理顶级会议EMNLP2023上发表了基于认知理论所衍生的CogTree认知树生成式语言模型。通过两个系统&#xff1a;直觉系统和反思系统来模仿人类产生认知的过程。直觉系统负责产生原始问题的多个分解…

10 # 类:继承和成员修饰符

类的基本实现 类的成员属性都是实例属性&#xff0c;而不是原型属性&#xff0c;类的成员方法都是原型方法。 class Dog {constructor(name: string) {this.name name;}name: string;run() {} }console.log(Dog.prototype); let dog new Dog("wangwang"); consol…

知识笔记(五十四)———mysql比较varchar值大小_Mysql varchar大小长度问题

1、限制规则 字段的限制在字段定义的时候有以下规则&#xff1a; a) 存储限制 varchar 字段是将实际内容单独存储在聚簇索引之外&#xff0c;内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节)&#xff0c;因此最大长度不能超过65535。 b) 编码长度限制 字符类…

低功耗模式的通用 MCU ACM32F0X0 系列,具有高整合度、高抗干扰、 高可靠性的特点

ACM32F0X0 系列是一款支持多种低功耗模式的通用 MCU。集成 12 位 1.6 Msps 高精度 ADC 以及比 较器、运放、触控按键控制器、段式 LCD 控制器&#xff0c;内置高性能定时器、多路 UART、LPUART、SPI、I2C 等丰富的通讯外设&#xff0c;内建 AES、TRNG 等信息安全模块&#xff0…

kubeadm搭建单master多node的k8s集群--小白文,图文教程

参考文献 K8S基础知识与集群搭建 kubeadm搭建单master多node的k8s集群—主要参考这个博客&#xff0c;但是有坑&#xff0c;故贴出我自己的过程&#xff0c;坑会少很多 注意&#xff1a; 集群配置是&#xff1a;一台master&#xff1a;zabbixagent-k8smaster&#xff0c;两台…

C++类和对象——(10)综合示例

一、示例对象数组&#xff1a; #include<iostream> using namespace std;class Point{private:int x,y;public:Point(int px0,int py0){xpx;ypy;}void init(int px0,int py0){xpx;ypy;}void print(){cout<<"("<<x<<","<<y…

FFmpeg的AVInputFormat

文章目录 结构体定义操作函数支持的AVOutputFormat 通过上面的分析&#xff0c;基本可以看到ffmpeg的套路了&#xff0c;首先一个context上下文&#xff0c;上下文里面一个priv_data 指针&#xff0c;然后再插件结构体中有一个priv_data_size&#xff0c;然后回调函数。 结构体…

JVM-GC调优-字节码篇-01

笔记来源&#xff1a;JVM 注意&#xff1a;实在想学习可以看一下&#xff0c;让自己更加了解JVM&#xff0c;看起来可能会枯燥。 JVM-概述 1、你的问题 1.1你被JVM伤害过吗&#xff1f; 你是否也遇到过这些问题&#xff1f; 运行着的线上系统突然卡死&#xff0c;系统无法访…