排序算法之希尔排序

news2025/1/15 23:06:40

📝个人主页:爱吃炫迈
💌系列专栏:数据结构与算法
🧑‍💻座右铭:快给我点赞赞💗

文章目录

  • 1. 希尔排序
  • 2. 算法思路
  • 3. 算法实现
  • 4. 算法性能分析
  • 💞总结💞


1. 希尔排序

  • 希尔排序(Shell Sort)是插入排序的一种,它是针对插入排序算法的改进

  • 希尔排序又称缩小增量排序。把所有元素按下标的一定增量分组,对每组使用插入排序算法排序

  • 增量随着算法的进行而逐渐缩小,当增量减至 1 时,所有元素恰被分成一组,算法便终止

动图演示

在这里插入图片描述

2. 算法思路

步骤

一趟希尔排序的算法的步骤是:

  1. 算法先将要排序的一组数按某个增量gap=length/2分组,每组中记录的下标相差gap。对每组中全部元素进行插入排序。
  2. 然后缩小增量为gap=gap/2对它进行分组,在每组中再进行插入排序。
  3. 重复2步骤,每次缩小增量为gap=gap/2
  4. 当增量减到1时,整个要排序的数被分成一组,最后再进行一次插入排序,这组数排序完成。

注意:如果不熟悉插入排序的用法,请点这里:插入排序

案例演示

用快速排序算法实现5, 2, 4, 6, 1, 3的***升序排序***

第一趟:将这组数按增量gap = lenght/2 = 6/2 =3分成3组,对每组进行插入排序。

在这里插入图片描述

第二趟:将这组数按增量gap = gap/2 = 3/2 = 1分成1组,进行插入排序。

image-20230409085634377

🎉🎉🎉🎉🎉🎉🎉排序完成啦~~撒花~🎉🎉🎉🎉🎉🎉🎉🎉

3. 算法实现

function shellSort(arr) {
    const len = arr.length;
    // 增量为每次递减二分之一的数
    for (let gap = Math.floor(len / 2); gap > 0; gap = Math.floor(gap / 2)) {
        // 对以增量为间隔所形成的子序列进行插入排序
        // 为什么循环从 增量开始然后递增呢?
        // 从增量开始,减去增量本身,得到的就是与该元素相差增量个的前一个元素
        // 增量依次递增,每次减去增量本身,就依次得到了与该元素相差增量个的每一个元素
        for (let i = gap; i < len; i++) {
            // 得到与该元素相差增量个的前一个元素
            let j = i - gap;
            // 插入排序是要移动数组的,防止要插入的元素被覆盖掉
            let temp = arr[i];
            // 间隔增量个的前面的元素更大,就往后移动
            while (j >= 0 && temp < arr[j]) {
                arr[j + gap] = arr[j];
                j = j - gap;
            }
            // 循环结束,证明循环结束位置的元素比要插入的元素小
            // 所以循环结束位置的下一个位置就是要插入的位置
            arr[j + gap] = temp;
        }
    }
}
let arr = [5, 2, 4, 6, 1, 3];
let newArr = shellSort(list)
console.log(newArr);

4. 算法性能分析

时间复杂度

📗最优

最好情况:序列是正序排列,在这种情况下,需要进行的比较操作需(n-1)次。后移赋值操作为0次。即O(n)

📕最坏

最坏情况:O(nlog2n)。

📘平均时间复杂度

渐进时间复杂度(平均时间复杂度):O(nlog2n)

结论
1.不需要大量的辅助空间,和归并排序一样容易实现。
2. 希尔排序是基于插入排序的一种算法, 在此算法基础之上增加了一个新的特性,提高了效率。
3. 希尔排序的时间的时间复杂度为 O(n^3/2) ,希尔排序时间复杂度的下界是n*log2n。
4. 希尔排序没有快速排序算法快 O(n(logn)),但是比O(n^2)复杂度的算法快得多。因此中等大小规模表现良好,对规模非常大的数据希尔排序不是最优选择。
5. 并且希尔排序非常容易实现,算法代码短而简单。

💞总结💞

希望我的文章能对你学习希尔排序有所帮助!

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

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

相关文章

自己再造一个大规模预训练语言模型?可以的

1. 引言 自ChatGPT发布至今已近半年&#xff0c;一路走来&#xff0c;我们可以清楚地看到的一个趋势是&#xff0c;到了下半年&#xff0c;每位研究者都会拥有一个类似ChatGPT的模型。这种现象与当年BERT推出后&#xff0c;各种BERT变体层出不穷的情况颇为相似。实际上&#x…

Prophet学习(一) Python API实现

目录 Python API 详细介绍 完整代码&#xff1a; Python API 详细介绍 Prophet遵循sklearn模型API。我们创建Prophet类的实例&#xff0c;然后调用它的fit和predict方法。 Prophet的输入总是一个有两列的数据帧:ds和y。ds(日期戳)列应该是Pandas期望的格式&#xff0c;理想…

APIs --- DOM事件进阶

1. 事件流 事件流指的是事件完整执行过程中的流动路径 任意事件被触发时总会经历两个阶段&#xff1a;【捕获阶段】和【冒泡阶段】 事件捕获 概念&#xff1a;从DOM的根元素开始去执行对应的事件&#xff08;从外到里&#xff09; 捕获阶段是【从父到子】的传导过程 代码&…

基于SSM框架开发的小区物业管理系统JavaWeb项目源码

随着信息化时代的到来&#xff0c;小区的管理也日趋完善&#xff0c;开始逐步采用信息化系统对小区业主进行管理&#xff0c;对一些业务进行线上处理。小区物业管理系统正是为了满足这种需求而诞生的&#xff0c;也有不少同学会选择该课题作为毕业设计项目选题&#xff0c;下面…

【Unity入门】9.帧更新

【Unity入门】帧更新 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;获取挂载对象的属性信息 &#xff08;1&#xff09;获取名字信息 首先在C#代码中&#xff0c;this代表着脚本本身&#…

MySQL 事务和视图

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

Machine Learning-Ex3(吴恩达课后习题)Multi-class Classification and Neural Networks

目录 1. Multi-class Classification 1.1 Dataset 1.2 Visualizing the data 1.3 Vectorizing Logistic Regression 1.3.1 Vectorizing the cost function&#xff08;no regularization&#xff09; 1.3.2 Vectorizing the gradient&#xff08;no regularization&#…

【ESP-IDF】如何安装ESP-IDF?

【ESP-IDF】如何安装ESP-IDF&#xff1f;Windows命令行安装ESP-IDFVs Code 图形IDE首先参考这篇视频&#xff1a;https://www.bilibili.com/blackboard/webplayer/embed-whitelist-other.html?aid520120377&bvidBV1hM411k7zz&cid888070526&page1本篇教程以Windows…

vue2路由守卫

全局前置_路由守卫 以前古代有一个职称叫御前侍卫&#xff1a;保护君王的安全&#xff0c;而路由守卫就是保护路由的安全&#xff08;权限&#xff09; 就是在Home组件中&#xff0c;我们需要先校验内容中的school是否满足要求&#xff0c;才能展示组件&#xff0c;否则不展示…

SpringBoot项目中遇到的订单支付超时未支付关闭订单的解决方案

1、扫表轮循 定时任务 > 获取数据 > 数据层 > 筛选出过期的数据 > 批量关闭超时订单 优点&#xff1a;实现简单、适用于小项目、数据量比较少 缺点&#xff1a;订单量过大的时候查询和修改数据库压力大、服务器内存消耗大、IO瓶颈 2、Redis懒删除 用户获取订单信…

java SSM选房管理系统idea开发mysql数据库java编程计算机网页源码maven项目

一、源码特点 SSM选房管理系统是一套完善的完整医院类型系统&#xff0c;结合SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系…

Twitter的推荐系统开源了,Twitter的推荐系统是什么样的呢?Twitter推荐系统的架构说明

Twitter的推荐系统开源了&#xff0c;Twitter的推荐系统是什么样的呢&#xff1f;Twitter推荐系统的架构说明01. Twitter的推荐系统是什么样的&#xff1f;02. Candidate Sources2.1 In-Network Source2.2 Out-of-Network Sources03. Ranking04. Heuristics, Filters, and Prod…

VR虚拟核电设备拆除模拟培训降低风险

核电站设备拆除是一项高危、复杂的任务&#xff0c;因此进行安全、有效的培训至关重要。为此&#xff0c;将VR虚拟现实技术应用于核电厂中&#xff0c;通过100%模拟还原真实的拆除操作场景&#xff0c;广泛应用到核电厂展示、巡检和拆除等环节中&#xff0c;极大提高了生产效率…

单片机学习之中断与定时/计数器

记录学习中断的使用。 1. 使用工具 使用开发板&#xff1a; 普中科技开发板 编译软件&#xff1a; keil 2. 复习中断及相关概念 CPU在处理 事件A 时&#xff0c;中断源 发出中断请求&#xff0c;请求cpu处理事件B &#xff0c;cpu 中断 当前工作&#xff0c;转去处理事件B&a…

HTML5 视频 Video

文章目录HTML5 视频 VideoWeb站点上的视频浏览器支持HTML5 (视频)- 如何工作视频格式与浏览器的支持视频格式HTML5 \<video> - 使用 DOM 进行控制HTML5 Video 标签HTML5 视频 Video 很多站点都会使用到视频. HTML5 提供了展示视频的标准。 Web站点上的视频 直到现在&am…

详解数据恢复多少一个g以及如何恢复

整理电脑硬盘数据的时候不小心删除了重要的文件该如何么恢复呢?硬盘修复数据恢复价格都爱的贵不贵?今天小编就来给大家重点当前市场上硬盘数据恢复的价格相关内容&#xff0c;那么数据恢复多少钱一个g呢?下面就来给大家揭晓一下数据恢复多少钱一个g以及如何恢复。 工具/原料…

全国青少年电子信息智能创新大赛(决赛)python·模拟三卷,含答案解析

全国青少年电子信息智能创新大赛(决赛) python 模拟三卷 一、程序题 第一题:描述 现有 n 个人依次围成一圈玩游戏,从第 1 个人开始报数,数到第 m 个人出局,然 后从出局的下一个人开始报数,数到第 m 个人又出局,...,如此反复到只剩下 最后一个是胜利者。设 n 个人的编号…

常用 Composition API--工程文件及setup

官方文档: https://v3.cn.vuejs.org/guide/composition-api-introduction.html 分析工程结构 vue3新添加的东西或修改的内容 首先import { createApp } from vue引入的不再是Vue的构造函数了&#xff0c;而是一个createAPP的工厂函数&#xff0c;什么是工厂函数&#xff1f; …

【TimeSerias】Transformer

Sequence 1. rnn 和 cnn RNN 很难并行化CNN很难捕捉较远的信息 2. Self-attention 拿每个query q去对每个 key k做attention 计算输出 Self-attition 矩阵计算 qiWqaikiWkqiviWvaiQWqAKWkAVWvA(1.1)\begin{align*} q^i & W^q a^i \\ k^i & W^k q^i \\ v^i & W…

WordPress图片水印插件 Easy Watermark

1、概述 WordPress图片水印插件Easy Watermark 是一款实现上传图片自动添加水印LOGO功能的高效插件。当我们在WordPress网站后台上传图片文件到媒体库时&#xff0c;或者在发布文章上传图片时&#xff0c;Easy Watermark 都能为图片自动添加水印&#xff0c;同时&#xff0c;还…