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

个人主页:点我进入主页

专栏分类: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等。不同的间隔序列可能导致不同的性能表现,因此在实际应用中,选择适合特定情况的间隔序列是重要的。希尔排序的优点包括:相对于简单的插入排序,希尔排序对于中等大小的数据集表现更好。相对于一些其他复杂的排序算法,希尔排序的实现相对简单。然而,需要注意的是,希尔排序并不稳定,即相等元素的相对顺序在排序后可能发生改变。总体而言,希尔排序是一种在实际应用中被广泛使用的排序算法,尤其在需要对中等大小数据集进行排序时,它的性能表现相对较好,最后希望大家可以一件三连。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录 Leetcode203. 移除链表元素

题目&#xff1a; 代码(首刷看解析 2024年1月11日&#xff09;&#xff1a; class Solution { public:ListNode* removeElements(ListNode* head, int val) {if(headnullptr) return nullptr;ListNode* BeforeHead new ListNode(0,head);ListNode* temp BeforeHead;while(te…

iOS 调试工具CocoaDebug

1、使用pod工具在项目里面添加CocoaDebug的SDK。 platform :ios, 11.0target ShopService doproject ShopServiceuse_frameworks!pod CocoaDebug, :configurations > [Debug]end2、之后就可以在项目里面看到效果了 APP上显示的是一个黑色背景的小圆圈。 上面39表示调用了39…

跨平台的文件传输协议@windows端服务器的配置@smb协议共享方案@ftp服务器设置

文章目录 abstractrefs ftp server下面是核心步骤FAQ smb server设置方法右键设置共享文件夹查看所有已经共享的文件夹停止某个文件的共享 共享文件夹的访问控制补充匿名访问问题协议相关信息参考android客户端推荐FAQ不同用户文件无法访问 比较和总结其他用户访问smb服务器共享…

[蓝桥杯学习] ST表

RMQ问题 ST 表 用状态 s[i][j] 记录区间长度为 2^j 的长度的区间的最大值 所以状态转移方程就是 st[i][j] max( st[i][j-1] , st[i(1 << (j-1))][j-1] ) 注意状态转移的方向&#xff0c;保证区间合法性&#xff08;i2^j 不能超过数组大小&#xff09; 写完这些后&am…

知道IP怎么反查域名?这几个方法一查一个准!

知道网络IP怎么反查出真实域名来&#xff1f;给大家分享几个我常用的方法&#xff0c;就算你不懂技术你都能查得出来&#xff01; 一、fofa 这是一个白帽黑客非常喜欢用的社工平台&#xff0c;只要你输入IP就能查到很多背后的信息。 传送门&#xff1a;https://fofa.info 二…

ELAU MC-4/11/22/400伺服驱动器

在一帧中每一行的选择时间是均等的。假设一帧的扫描行数为N&#xff0c;扫描时间为1&#xff0c;那一行所占有的选择时间为一帧时间的1/N。在液晶显示的驱动方法中把这个值&#xff0c;即一帧行扫描数的倒数称为液晶显示驱动的占空比(duty)&#xff0c;用d表示。在同等电压下&a…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例3-1 CSS3过渡

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>CSS3 过渡</title> <style> /*显示*/ .box {width: 100px;height: 100px;background-color: #eee;/*透明度*/opacity: 1;/*过渡*/transition: 3s; } /…

高性能mysql 第三版 读书笔记

MySQL中的tmp_table_size和max_heap_table_size|极客笔记 mysql占用内存过高调优方法_tmp_table_size过大阻塞-CSDN博客 查看mysql分配的内存 mysql查看内存利用状态_mob6454cc6d81c9的技术博客_51CTO博客 https://www.cnblogs.com/stronger-xsw/p/13632505.html

刚买的助听器就弄丢了,不想白配,快来看看这8大助听器防丢小技巧

我们知道助听器可以让听损人士重新听到美妙的声音和享受沟通的乐趣。但是&#xff0c;助听器也是一种很贵的物品&#xff0c;如果不小心弄丢了&#xff0c;就会让人心痛不已。 更有甚者&#xff0c;有些人因为害怕丢失助听器&#xff0c;而不敢佩戴助听器&#xff0c;错过了听力…

气象能见度监测站的应用介绍

【TH-NJD10】能见度是反映大气透明度的一个重要指标&#xff0c;对于航空、航海、道路交通等领域具有重要意义。 一、气象能见度监测站的应用 交通气象服务 气象能见度监测站在交通气象服务中发挥着重要作用。在高速公路、机场、港口等交通枢纽&#xff0c;能见度监测数据对于交…

【算法与数据结构】70、LeetCode爬楼梯

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;因为每次可以爬1阶或者2阶台阶&#xff0c;若想到达第i阶&#xff0c;则有两种情况&#xff1a;在第i-…

【Golang】IEEE754标准二进制字符串转为浮点类型

IEEE754介绍 IEEE 754是一种标准&#xff0c;用于表示和执行浮点数运算的方法。在这个标准中&#xff0c;单精度浮点数使用32位二进制表示&#xff0c;分为三个部分&#xff1a;符号位、指数位和尾数位。 符号位(s)用一个位来表示数的正负&#xff0c;0表示正数&#xff0c;1表…

CentOS查看修改时间

经常玩docker的朋友应该都知道&#xff0c;有很多的镜像运行起来后&#xff0c;发现容器里的系统时间不对&#xff0c;一般是晚被北京时间8个小时&#xff08;不一定&#xff09;。 这里合理怀疑是镜像给的初始时区是世界标准时间&#xff08;也叫协调世界时间&#xff09;。 有…

Kafka配置Kerberos安全认证及与Java程序集成

Background 本文主要介绍在 Kafka 中如何配置 Kerberos 认证&#xff0c;以及 java 使用 JAAS 来进行 Kerberos 认证连接。本文演示为单机版。 所用软件版本 查看 Kerberos 版本命令&#xff1a;klist -V 软件名称版本jdk1.8.0_202kafka2.12-2.2.1kerberos1.15.1 1、Kerberos …

el-tree定义左边箭头,包括下级出现连线

效果图&#xff1a; 代码&#xff1a; <template><div class"agency-wrap"><el-treeclass"filter-tree":data"detailList":props"defaultProps"default-expand-allnode-click"onClickNode":filter-node-me…

基础知识篇(二)Activity之生命周期变化

Activity作为四大组件之一,App切换、新的Activity启动与关闭以及配置发生变化等等都会引起Activity生命周期发生变化 一、常规模式下 场景1 A 启动 B 页面 //A启动B页面后 A:onPause B:onCreate B:onStart B:onResume A:onStop//然后关闭B页面后 B:onPause A:onRestart A:o…

IDEA中明明代码没有报错,运行也不报错,但是代码却爆红了,重启idea,重启电脑,重新加载Maven都没有用

报错示图&#xff1a; 报错类是存在的 我的解决办法是修改类名&#xff0c;修改类名时会有提示&#xff0c;如下图&#xff1a; 然后点击报错的地方可以看到是哪些位置引用了 改回正确的类名 正常显示

electron+vue网页直接播放RTSP视频流?

目前大部分摄像头都支持RTSP协议&#xff0c;但是在浏览器限制&#xff0c;最新版的浏览器都不能直接播放RTSP协议&#xff0c;Electron 桌面应用是基于 Chromium 内核的&#xff0c;所以也不能直接播放RTSP&#xff0c;但是我们又有这个需求怎么办呢&#xff1f; 市场上的方案…

【iOS】数据持久化(四)之FMDB

正如我们前面所看到的&#xff0c;原生SQLite API在使用时还是比较麻烦的&#xff0c;于是&#xff0c;开源社区就出现了一系列将SQLite API进行封装的库&#xff0c;其中FMDB的被大多数人所使用 FMDB和SQLite相比较&#xff0c;SQLite比较原始&#xff0c;操作比较复杂&#…

css 背景是个图片并且含有透明度的渐变色.超级简单。background相关属性就行了

底纹是个背景图片。 然后上面有个渐变色。渐变色含有透明度这样才能把底纹显示出来 不用麻烦的把图片放进去各种定位修改层级来写啦。 直接一个background相关属性就行了。 背景色怎么增加透明度呢 使用rgba的方式rgba(127,47,255,0.7)。 //0.7是透明度 background-image:li…