排序算法之希尔排序

news/2024/7/5 5:30:07

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

文章目录

  • 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://lihuaxi.xjx100.cn/news/1001957.html

相关文章

O2O、C2C、B2B、B2C是什么意思

一.O2O、C2C、B2B、B2C的区别在哪里&#xff1f; o2o 是 online to offline 分为四种运营模式 1.online to offline 是线上交易到线下消费体验 2.offline to online 是线下营销到线上交易 3.offline to online to offline 是线下营销到线上交易再到线下消费体验 4.online …

xinput1_3.dll缺失了如何去修复?xinput1_3.dll解决方法分享

缺失了xinput1_3.dll文件&#xff0c;对应用程序或游戏的正常运行造成了严重的影响。这个动态链接库文件&#xff08;DLL&#xff09;是由Microsoft Corporation开发的&#xff0c;它是一个重要的Windows系统文件&#xff0c;提供了针对Xbox 360控制器的输入支持。如果这个文件…

PHP面向对象编程基础(一)

PHP面向对象编程基础 在PHP中&#xff0c;面向对象编程是一种非常常见的编程范式。它允许我们将代码组织成可重用和可扩展的类和对象&#xff0c;并提供了许多强大的功能&#xff0c;例如封装、继承和多态性。 类和对象 在PHP中&#xff0c;类是一种定义对象的蓝图或模板。它…

配置提取到配置类中,并且注入到spring容器

Data ConfigurationProperties(prefix "solr.config") EnableConfigurationProperties({CustomSolrConfigPathProperties.class}) Component public class CustomSolrConfigPathProperties {/*** 上传的配置文件的路径*/private String path;/*** 删除文件的父路径*…

不要图片?CSS实现大屏常见不规则边框(系列二)

前言 &#x1f44f;不要图片&#xff1f;CSS实现大屏常见不规则边框&#xff08;系列二&#xff09;&#xff0c;速速来Get吧~ &#x1f947;文末分享源代码。记得点赞关注收藏&#xff01; 1.实现效果 2.实现原理 系列一已经陈述了相关原理&#xff0c;感兴趣的小伙伴直接参…

NLP | SentenceTransformer将句子进行编码并计算句子语义相似度

环境设置&#xff1a; SentenceTransformertransformers SentenceTransformers Documentation — Sentence-Transformers documentation (sbert.net) Sentence Transformer是一个Python框架&#xff0c;用于句子、文本和图像嵌入Embedding。 这个框架计算超过100种语言的句子…

兆芯最新X86 CPU曝光:性能与英特尔/AMD相比,没落后10年

众所周知&#xff0c;在PC领域&#xff0c;X86完全是处于垄断地全的&#xff0c;至少占了90%以上的份额。其它的像MIPS、ARM、RISC-V等等&#xff0c;都不是X86的对手。 这与X86是复杂指令集有关&#xff0c;更与X86绑定了windows操作系统&#xff0c;有坚固的intel联盟有关&am…

《iTOP-3568开发板快速测试手册》第6章 Ubuntu系统功能测试 (5)

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…