插入排序与希尔排序(C语言实现)

news2024/10/6 12:21:53

1.插入排序

由上面的动图可以知道插入排序的逻辑就是从第一个元素开始往后遍历,如果找到比前一个元素小的(或者大的)就往前排,所以插入排序的每一次遍历都会保证前面的数据是有序的,接下类用代码进行讲解。

我们这里传两个参数,一个是数组,一个是数组元素的个数。

排序接口我们采用大事化小的想法来进行讲解, 我们先来思考单趟遍历要达成的目标。我们每次遍历的主角其实就是我们要操纵的那一个元素,比如我们要排第四个元素,按照插入排序的逻辑,前三个元素我们是已经有序了,所以我们接下来的操作就是将我们的主角元素跟前面的元素进行比较,如果元素比前面的小我们就跟前面的交换(我们这里实现升序排序),以此循环往复,直到遇到比它还小的元素我们就终止循环,所以我们就可以理解里面这层while循环的意思了,循环结束的时候不要忘记把元素放到停止循环的end下标位置上,有的同学可能一时间没有理解到为什么最后下标的位置是end+1,其实这是因为在结束while循环之前我们的end是减一过的,所以才要给他加回去。

然后我们的for循环就是控制我们的主角啦,就是控制后面的每一个元素跟前面已经排序好的元素进行比较。

插入排序最坏的时间复杂度O(n^2)

最好的情况就是这个数组已经有序的时候时间复杂度为O(n)

2.希尔排序

 上诉动态演示就是希尔排序,大家看到这个演示的时候肯定会两眼一黑,看不懂它是如何进行排序的,希尔排序的逻辑是有点复杂,但是我相信在我讲了它的实现思路之后对希尔排序也会有一个比较清晰的理解。

希尔排序可以相当于插入排序的pro版本,这是因为它的逻辑虽然比插入排序复杂,但是却是建立在插入排序之上,插入排序的核心思想是遍历每一个元素去跟前面已经排好序的元素进行比较,希尔排序有一个预排序的过程,就是说通过给定一个gap(变量名)来控制一个间距,使下标为end的元素跟end+gap来比较,这个预排序就是使一个无序数组接近有序数组,在预排序完成之后再用插入排序使数组有序。其实到这里大家就会发现,如果用这里的思想去理解插入排序的话,插入排序实际上就是gap为1的情况嘛。

我们用代码来加深理解。

这是希尔排序的代码,我们可以看到gap的初始值设置的是数组的长度,那下面的while循环时什么意思呢?我们先来理解最里层的while循环,最里层的while循环是不是有一种很眼熟的感觉?它就是我们的插入排序的思想,只不过插入排序是间隔为一进行比较,希尔排序是间隔为gap进行比较,我们再看外面这层for循环,这层for循环控制的就是end的下标,跟插入排序也非常的相似,只不过这里的for循环结束的条件是n-gap,因为既让我们当前下标的元素要跟后一个相比,那总不能让end+gap的下标超出界限吧。

最后再来看最外层的while循环,它的作用就是控制gap的值。我们这里得要知道gap越大,这一趟预排序就越不能做到很有序的程度,但好处就是耗时短,gap的值越小就是相反的情况,但是不要忘记了,一个数组越有序,插入排序处理得就越快,希尔排序也是一样的,所以为了达到理想的时间复杂度,我们的做法就是将gap的值由大到小。

接下来来说说gap的值如何来设置,gap的值该如何来设置是没有一个统一的说法的,但是有一个大佬想出的一个比较好的方法是用数组长度来充当第一次的gap值,每一次循环完就将gap的值/3+1这是为了避免上一个gap为二的时候下一次gap直接变为0了。

所以我们的希尔排序最后一趟就是我们的插入排序,只不过这个时候数组已经非常接近有序了。

我们的希尔排序最坏的情况下时间复杂度是O(n^2),平均是O(n^1.3)。

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

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

相关文章

高效便捷的淘宝商品详情关键词搜索API接口

联讯数据可以介绍一些高效便捷的淘宝商品详情关键词搜索API接口。 以下是一些可以考虑使用的API接口: 阿里云搜索引擎API:阿里云搜索引擎API是一个基于云计算技术的搜索引擎,提供商品详情关键词搜索功能。它支持中文搜索,并且具…

【漏洞复现】FLIR AX8红外线热成像仪命令执行漏洞

漏洞描述 eledyne FLIR 设计、开发、制造以及强大的传感和意识技术。自透射热图像、可见光图像、可见频率分析、来自测量和诊断的先进威胁测量系统以及日常生活的创新解决方案。 Teledyne FLIR 提供多种产品用于政府、国防、工业和商业市场。我们的产品,紧急救援人员,军事人…

Billu_b0x

信息收集 #正常进行信息收集就好Starting Nmap 7.94 ( https://nmap.org ) at 2023-11-18 22:07 CST Nmap scan report for 192.168.182.142 (192.168.182.142) Host is up (0.00073s latency).PORT STATE SERVICE 22/tcp open ssh 80/tcp open http | http-cookie-flags:…

mybatis的理解(下)(注解开发)

http://t.csdnimg.cn/kcPCy log4j(日志的配置) http://t.csdnimg.cn/IWa9H mybatis的理解(上)(包括xml配置信息进行CRUD) http://t.csdnimg.cn/weXLx mybatis的理解(中)(Mapper代理开发) 首先我们看一下项目结构 注解进行CRUD,其实和xml文件配置一样,只不过…

ChatGPT新媒体运营神器:轻松驾驭内容创作与传播

文章目录 1. 内容创作2. 社交媒体管理3. 用户互动与客户服务 《巧用ChatGPT轻松玩转新媒体运营》内容简介作者简介目录前言/序言本书内容本书特色本书读者对象获取方式 随着互联网的高速发展,新媒体已经成为了人们获取信息、交流思想的重要渠道。在这个信息爆炸的时…

KNN朴素贝叶斯(根据已知推测未知)

KNN(哲学思想:物以类聚,人以群分) KNN算法原理及示例1: 向量化 画点,计算欧式距离: 朴素贝叶斯(数学工具:贝叶斯公式) 1.数学原理: 2.一道大题&…

HTML如何使用图片链接

文章目录 图片链接的使用常见图片类型PNGJPGGIFBMP 图片链接的使用 在 HTML 中&#xff0c;图像由 标签定义。 是空标签&#xff0c;意思是说&#xff0c;它只包含属性&#xff0c;并且没有闭合标签。 语法&#xff1a; <img src图片路径">title“鼠标悬浮在图片上…

五月天“假唱”争议持续升温,歌迷期待真实音符背后的真实交代

在12月3日的夜晚&#xff0c;“五迷”们心中的星辰仿佛黯淡了几分。在社交媒体上&#xff0c;关于五月天演唱会假唱的争论愈演愈烈&#xff0c;歌迷们的心情变得异常复杂。他们愤怒&#xff0c;是因为自己的偶像受到了质疑&#xff1b;他们伤心&#xff0c;是因为可能的假唱让他…

云LIS实验室信息管理系统源码——实验室信息管理解决方案

云LIS&#xff08;Cloud Laboratory Information System&#xff09;是一种为区域医疗提供临床实验室信息服务的计算机应用程序&#xff0c;其主要功能是协助区域内所有临床实验室相互协调并完成日常检验工作&#xff0c;对区域内的检验数据进行集中管理和共享&#xff0c;通过…

基于Springboot+mybatis+mysql+jsp招聘网站

基于Springbootmybatismysqljsp招聘网站 一、系统介绍二、功能展示四、其他系统实现五、获取源码 一、系统介绍 项目类型&#xff1a;Java EE项目 项目名称&#xff1a;基于SPringBoot的照片网站 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 前端技术&…

react Hooks(useEffect)实现原理 - 简单理解

useEffect 语法&#xff1a; useEffect(setup, dependencies?) 含义: useEffect 是一个 React Hook&#xff0c;它允许你 将组件与外部系统同步。 useEffect 源码简单理解 一、mountEffect 和 upadateEffect useEffect 与其它 hooks 一样分为 mountEffect 和 upadateEffec…

面试题之Docker篇

1、Docker 是什么&#xff1f; Docker一个开源的应用容器引擎&#xff0c;是实现容器技术的一种工具&#xff0c;让开发者可以打包他们的应用以及环境到一个镜像中&#xff0c;可以快速的发布到任何流行的操作系统上。 2、Docker的三大核心是什么? 镜像&#xff1a;Docker的镜…

Plantuml之类图语法介绍(十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

如何给Linux硬盘分区?

在Windows操作系统中&#xff0c;磁盘分区是将物理地址分开&#xff0c;再在分区上建立目录。Linux正好相反&#xff0c;是先有目录&#xff0c;再将物理地址映射到目录中。在Linux操作系统中&#xff0c;所有路径都是从根目录开始的。那么如何给Linux硬盘分区呢&#xff1f; L…

JavaScript 条件语句之switch

if..else虽然有多条路选择&#xff0c;但是代码读起来会很累人&#xff0c;说白了就是使用switch来简化if else表达式。 语法会有switch关键字&#xff0c;case关键字&#xff0c;以及break关键字。需要注意的是&#xff0c;每个case代码块内部的break语句不能少&#xff0c;否…

1.查看表的基本结构,表的详细结构和修改表名

查看表的基本结构,表的详细结构和修改表名 1.查看数据表基本结构 有强迫症或健忘症的小伙伴们在建好数据库和表以后&#xff0c;通常会怀疑自己刚才是不是敲错了&#xff0c;怎么办&#xff1f;如果不是使用图形界面是不是就没法查看啦&#xff1f; 不存在的&#xff0c;这就…

面向对象中的单例模式

1、什么是设计模式 设计模式就是前人根据实际的问题提出的问题解决方案&#xff0c;我们把这种就称之为设计模式。 2、单例模式 单例模式是一种常见的设计模式&#xff01; 所谓的设计模式&#xff0c;不是一种新的语法&#xff0c;而是人们在实际的应用中&#xff0c;面对…

JVM简单了解内存溢出

JVM oracle官网文档&#xff1a;https://docs.oracle.com/en/java/javase/index.html 什么是JVM JVM(Java Virtual Machine)原名Java虚拟机&#xff0c;是一个可以执行Java字节码的虚拟计算机。它的作用是在不同平台上实现Java程序的跨平台运行&#xff0c;即使在不同的硬件…

基于ssm的彩妆小样售卖商城的设计与实现论文

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于彩妆小样售卖商城当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了彩妆小样售卖商城&#xff0c;它彻底改变了过…

《ReactJS实践入门》:引领JavaScript前端开发的革新之旅

在当今的软件开发世界中&#xff0c;ReactJS无疑是最为引人注目的JavaScript库之一。对于初学者来说&#xff0c;如何深入理解并掌握这一强大的前端工具&#xff0c;进而应用到实际开发中&#xff0c;一直是他们所面临的问题。而《ReactJS实践入门》一书&#xff0c;正是为了解…