数据结构初阶之插入排序与希尔排序详解

个人主页:点我进入主页

专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶

C语言刷题       数据结构初阶    Linux

欢迎大家点赞,评论,收藏。

一起努力,共赴大厂。

目录

一.前言

二.插入排序

2.1插入排序的思想

2.2代码实现

三.希尔排序 

3.1希尔排序的思想

3.2代码实现

四.总结


一.前言

        时隔一个多月,我终于回来了。这段时间里,由于一些不可避免的原因,我没有能够抽出时间来撰写文章。但是今天,我非常激动地给大家带来了一些全新的内容,其中包含了插入排序和希尔排序的相关主题。在这一个月的沉淀中,我对排序算法进行了深入的学习和实践,通过对插入排序和希尔排序的研究,我深刻领悟到它们在算法设计中的重要性。这两种排序算法不仅在理论上有着独特之处,而且在实际应用中也展现出强大的性能。对于插入排序而言,它的简单直观的思想使得它成为初学者入门的良好选择。通过逐步地将元素插入已排序的序列中,我们可以在每一步保持部分有序性,从而最终得到完全有序的结果。这种排序算法的易懂性使得它在教学和基础应用中广受欢迎。而希尔排序则是一种更为高级的排序算法,它通过引入间隔序列的概念,能够在一开始就以较大的步长对数据进行排序,然后逐步减小步长,最终实现全局有序。这种分阶段的排序思想使得希尔排序在大规模数据上表现出色,相对于简单的插入排序,它更具有高效性。

二.插入排序

2.1插入排序的思想

’        我们先针对插入排序的某一次循环,我们让前end个元素有序,我们针对第end+1的元素进行插入排序,如果前面的元素大于这个元素我们就让它往后移动,直到出现小于它的元素,这样第一层循环就好了,我们接下来写所有的排序,我们直到前end个元素有序,所以我们针对前end个元素进行,让end先为0,然后让end加加,直到end小于n-1,但是我们不能直接把end方在循环条件,我们可以看下面的图片,来感受一线插入排序。

在这张图片中我们可以深刻感受到插入排序的过程,更详细的感受到插入排序的方法。

2.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 (a[end] > tmp){a[end + 1] = a[end];end--;}else{break;}}a[end + 1] = tmp;}
}

我们任意选择一趟排序,例如针对这一趟排序,我们的tmp存储了3,end指向9,

首先我们先让9和3进行比较,9大于3,我们让9向后进行移动,然后end--;

 我们继续进行比较最后我们可以得到

三.希尔排序 

3.1希尔排序的思想

        希尔排序的关键在于确定初始的 gap 值,然后在每一轮迭代中逐步减小 gap。一般来说,初始的 gap 可以选择数组长度的一半,然后每轮迭代将 gap 除以 3+1,直到 gap 缩小为 1。 希尔排序的性能相对于简单的插入排序有较大的提升,尤其是对于中等大小的数组。这是因为希尔排序在每一轮迭代中都会对距离较远的元素进行比较和交换,从而减少了插入排序中需要移动的元素的数量。 然而,希尔排序并不是稳定的排序算法,即相同元素的相对位置在排序前后可能会发生变。这是因为希尔排序的排序过程是基于比较和交换的,而不是简单的元素移动。我们可以展示一下gap为5的动图。

3.2代码实现

         

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

我们针对gap=4时进行讲解,我们进行分组, 

 进行循环,end为0,tmp为4,进入第一次交换,可以得到

 我们的思想和插入排序一样,希尔排序就是插入排序的进阶。对于希尔排序的时间复杂度为nlogn;

四.总结

        希尔排序的主要思想是通过比较和交换不相邻的元素,从而使得数据项能够更快地移动到正确的位置。这种分段的插入排序策略可以有效地减小序列的无序程度,提高整体的排序效率。希尔排序的性能与所选取的间隔序列有关。一些常见的间隔序列包括希尔增量和序列9、5、3、2、1等。不同的间隔序列可能导致不同的性能表现,因此在实际应用中,选择适合特定情况的间隔序列是重要的。希尔排序的优点包括:相对于简单的插入排序,希尔排序对于中等大小的数据集表现更好。相对于一些其他复杂的排序算法,希尔排序的实现相对简单。然而,需要注意的是,希尔排序并不稳定,即相等元素的相对顺序在排序后可能发生改变。总体而言,希尔排序是一种在实际应用中被广泛使用的排序算法,尤其在需要对中等大小数据集进行排序时,它的性能表现相对较好,最后希望大家可以一件三连。

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

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

相关文章

深入浅出Pytorch宝典1.0

文章目录 前言1. 张量操作2. 自动微分3. 数据加载和处理4. 模型构建和训练5. 预训练模型和迁移学习6. 调试和性能7. 高级特性总结 torch中主要的数据对象主要特点和功能张量的创建 数据处理和转换1.torch.tensor() 创建一个新的张量&#xff08;Tensor&#xff09;2.torch.zero…

YOLOv8训练自己的数据集

文章目录 1. 创建数据集文件结构数据集标注脚本分割数据集转换数据格式 2. 配置文件2.1 数据集配置2.2 选择需要的模型 3. 模型训练4. 测试 1. 创建数据集 环境&#xff1a; Ultralytics YOLOv8.0.230 &#x1f680; Python-3.8.18 torch-2.3.0.dev20231226cu118 CUDA:0 (NVIDI…

嵌入式linux_C应用学习之API函数

1.文件IO 1.1 open打开文件 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode);pathname&#xff1a;字符串类型&#xff0c;用于标…

代码随想录算法训练营第六天| 哈希表理论基础、242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

常见的三种哈希结构&#xff1a;vector数组、set &#xff08;集合&#xff09;、map(映射) 哈希表理论基础 常见的三种哈希结构&#xff1a;vector数组、set &#xff08;集合&#xff09;、map(映射) 242.有效的字母异位词 固定类别的存储内查找用固定大小的vector&#xff1…

Pandas实战100例 | 案例 49: 数值运算

案例 49: 数值运算 知识点讲解 Pandas 提供了进行基本数学运算的简便方法&#xff0c;允许你在 DataFrame 的列之间执行加法、减法、乘法和除法等操作。 数值运算: 直接对 DataFrame 的列应用算术运算符&#xff08;, -, *, /&#xff09;可以执行相应的数值运算。 示例代码…

【DDR】基于Verilog的DDR控制器的简单实现(三)——读操作

上一节 【DDR】基于Verilog的DDR控制器的简单实现&#xff08;二&#xff09;——写操作 本文继续以美光(Micron&#xff09;公司生产的DDR3芯片MT41J512M8RH-093&#xff08;芯片手册&#xff09;为例&#xff0c;说明DDR芯片的读操作过程。下图为读操作指令格式&#xff08;…

市场复盘总结 20240115

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 昨日主题投资 连板进级率 0% 失效 二进三&#xff1a; 进级率 中位数50% 最常用的二种方法&#xff1a; 方…

C语言代码 计算1!+2!+3!+4!+5!+6!+7!+8!+9!+10!

计算1!2!3!4!5!6!7!8!9!10! 代码示例&#xff1a; #include <stdio.h> int main() {int i 0;int n 0;int ret 1;int sum 0;for (n 1; n < 10; n){ret 1;for (i 1; i < n; i){ret ret * i;}sum sum ret;}printf("%d\n", sum);return 0; } 运…

记录centos7.9 离线安装fastllm 编译遇到的问题

centos7.9 安装fastllm 编译步骤 Step1安装cmake: 参考: https://bitsanddragons.wordpress.com/2022/09/19/error-cmake-3-1-or-higher-is-required-you-are-running-version-on-centos-7-x/ ​ 问题1&#xff1a;/lib64/libstdc.so.6: version GLIBCXX_3.4.20‘ not found …

解决Qt的release构建下无法进入断点调试的问题

在工作的时候遇到了第三方库只提供release版本的库的情况&#xff0c;我需要在这基础上封装一层自家库&#xff0c;在调试的时候遇到如下问题&#xff0c;但是在Qt环境下&#xff0c;release的库只能在进行release构建和调试。 卡在了一直进不了断点的情况。提示内容如下&#…

数据库知识汇总之MySQL

目录 MySQL数据库特点MySQL下载MySQL配置文件初始化MySQL配置安装MySQL服务 启动MySQL服务登录数据库修改数据库登录密码MySQL错误代码1130 MySQL数据库特点 MySQL是一个开源关系型数据库管理系统(RDBMS)&#xff0c;由Oracle公司维护和开发。它使用SQL语言进行数据库管理和操…

Flink常见异常解决办法

Flink启动报错 Caused by: java.lang.NoSuchMethodError: org.apache.flink.api.common.functions.RuntimeContext.getMetricGroup()Lorg/apache/flink/metrics/groups/OperatorMetricGroup;...at org.apache.flink.api.common.functions.util.FunctionUtils.openFunction(Fun…

DA14531-外设驱动篇-I2C通信应用

文章目录 1.I2C通信应用相关文件2.宏定义列表3.主要函数接口4.应用代码实例1.I2C通信应用相关文件 1)i2c.c和i2c.h(SDK文件) 2)app_I2cProtocol.c和app_I2cProtocol.h(用户应用文件) 2.宏定义列表 宏定义注解I2C_ADDRESSING_7B7-bit 地址I2C_ADDRESSING_10B10-bit 地址…

【LeetCode题目详解】59. 螺旋矩阵 II 54. 螺旋矩阵 LCR 146. 螺旋遍历二维数组(c++)

这篇文章的题目稍微难一点 题目建议&#xff1a; 本题关键还是在转圈的逻辑&#xff0c;在二分搜索中提到的区间定义&#xff0c;在这里又用上了。 一、59. 螺旋矩阵 II 题目&#xff1a; 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按…

Compose中使用paging3进行列表分页加载Room中的数据

文章目录 一、前言二、相关依赖二、具体代码三、参考链接 一、前言 本文简要记录下流程&#xff0c;代码需要修改后才可以运行 二、相关依赖 <project>/build.gradle buildscript {ext {compose_version 1.5.4} }// Top-level build file where you can add configu…

DataX的安装使用

DataX概述&#xff1a; DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台&#xff0c;实现包括 MySQL、Oracle、HDFS、Hive、OceanBase、HBase、OTS、ODPS 等各种异构数据源之间高效的数据同步功能。DataX采用了框架 插件 的模式&#xff0c;目前已开源&#xff0c;代…

如何用GPT制作PPT和写代码?

详情点击链接&#xff1a;如何用GPT制作PPT和写模型代码&#xff1f; 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析&#xff0c;AI画图&#xff0c;图像识别&#xff0c;文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Claude2二定…

【Docker】快速入门之Docker的安装及使用

一、引言 1、什么是Docker Docker是一个开源的应用容器引擎&#xff0c;它让开发者可以将他们的应用及其依赖打包到一个可移植的镜像中&#xff0c;然后发布到任何流行的Linux或Windows操作系统的机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之…

软件测试|使用pillow给图片添加水印

简介 水印是一种在图片上添加文字或图像的技术&#xff0c;用于标识图片的来源、版权信息或其他附加信息。Pillow 是一个强大的 Python 图像处理库&#xff0c;它提供了许多功能&#xff0c;包括给图片添加水印。本文将详细介绍如何使用 Pillow 给图片添加水印。 创建水印 在…

SpringBoot中整合ElasticSearch快速入门以及踩坑记录

场景 若依前后端分离版手把手教你本地搭建环境并运行项目&#xff1a; 若依前后端分离版手把手教你本地搭建环境并运行项目_本地运行若依前后端分离-CSDN博客 参考上面搭建项目。 ElaticSearch Elasticsearch 是java开发的&#xff0c;基于 Lucene 的搜索引擎。它提供了一…