当前位置: 首页 > news >正文

插入排序和希尔排序

插入排序

插入排序就是从第一个数开始,将前面的数都想成有序序列,将后一个数与前面的所有数比较排序。就好像我们玩扑克牌,先将手里的牌排好序,然后抽到的新牌再和前面的牌排序,这就是插入排序,下面有一个动图,能够帮助大家更好的理解。

是不是已经理解了呢。

但是我们要用代码实现,应该怎么做呢?

代码实现 

我们先实现单趟的插入排序,定义一个end,从这个end开始,我们将他后面的数字依次与前面的

比较,但是我们不能直接拿a[end+1]与a[end]比,我们就定义一个tmp,将a[end+1]赋值给tmp,依次与前面的每个数比较,如果有比tmp大的,那就将a[end+1]覆盖掉,覆盖之后将end--,然后再与前面的比较,直到碰到了比tmp小的,就可以跳出循环,然后将end后面所在的位置被tmp覆盖掉。这样就实现了排序,但是呢,这只是单趟的,我们就还要设计一个循环,但是这个就很简单了,所以我就不做过多解释了,我们看代码。

实现过程还是很简单的,主要就是看思路,学会这种思想是最重要的。

希尔排序 

希尔排序其实是插入排序的改良版,我们来详细了解一下,这个希尔排序呢,分为两步,第一步:预排序,第二步:插入排序。简单点说就是先将数组排序成接近有序的数组,再进行插入排序,大家听着是不是很麻烦感觉消耗的很多,其实这个速度很快,比我们上面将的插入排序快得多,也比我们之前学的冒泡排序要快的多,只能说希尔也是个神人,哈哈哈。

具体操作

具体的操作呢,就是如下图所示

 

 

 

 

分别排序之后就是这样的 

是不是大的数字就往后面跑,小的数字就往前面跑。这样进行插入排序就会变得快很多。

gap的选取 

其实gap == 1就是我们的插入排序,我们可以看代码对比

里面的单趟就是一样的,只有一个gap的区别,而gap我们就取gap= gap/3+1.其实也没有特别的规定必须取3,而是有人研究过/3是最好的,就像malloc空间一样,一般malloc2倍,我们gap就取/3,+1是为了防止gap变为0.

好了,整体的思路讲完了,我们看看代码就能理解这个希尔排序了。

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【后端开发】身份和访问管理IAM(MFA,OTP,JWT,OAuth,SSO)
  • python—爬虫的初步了解
  • 核函数支持向量机(Kernel SVM)
  • IDEA中常用的快捷键
  • 【医学影像】RK3588+FPGA:满足远程诊疗系统8K音视频编解码及高效传输需求
  • SpreadsheetLLM:微软对Excel编码的“摊膀伏”
  • LVS+Nginx高可用集群---搭建高可用集群负载均衡
  • 【论文阅读笔记】Hierarchical Neural Coding for Controllable CAD Model Generation
  • .net6 core Worker Service项目,使用Exchange Web Services (EWS) 分页获取电子邮件收件箱列表,邮件信息字段
  • LeetCode 每日一题 2024/7/15-2024/7/21
  • 6 回归集成:xgb、lgb、cat
  • Air780E/Air780EP/Air780EQ/Air201模块遇到死机问题如何分析
  • 最新!CSSCI(2023-2024)期刊目录公布!
  • AndroidStudio与手机进行无线调试
  • SRv6 BE 配置过程(VRF ping通场景)
  • 2019年如何成为全栈工程师?
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • HTTP--网络协议分层,http历史(二)
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JS数组方法汇总
  • Mysql优化
  • Node + FFmpeg 实现Canvas动画导出视频
  • Python打包系统简单入门
  • spark本地环境的搭建到运行第一个spark程序
  • vue-loader 源码解析系列之 selector
  • 订阅Forge Viewer所有的事件
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 开源地图数据可视化库——mapnik
  • 前端面试之CSS3新特性
  • 双管齐下,VMware的容器新战略
  • 原生Ajax
  • No resource identifier found for attribute,RxJava之zip操作符
  • ​VRRP 虚拟路由冗余协议(华为)
  • #define用法
  • #etcd#安装时出错
  • #laravel 通过手动安装依赖PHPExcel#
  • $refs 、$nextTic、动态组件、name的使用
  • (1)Android开发优化---------UI优化
  • (Git) gitignore基础使用
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (十六)一篇文章学会Java的常用API
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (一)Docker基本介绍
  • (转) 深度模型优化性能 调参
  • (转)iOS字体
  • (转)ORM
  • (转)Scala的“=”符号简介
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • ****三次握手和四次挥手
  • ***检测工具之RKHunter AIDE
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET 命令行参数包含应用程序路径吗?
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .net下简单快捷的数值高低位切换
  • @NoArgsConstructor和@AllArgsConstructor,@Builder