算法基础篇-07-排序-希尔排序(Shell Sort)

news2024/11/15 15:59:05

1. 希尔排序简介

  • 希尔排序(Shell Sort) 是一种分组插入排序算法,是基于插入排序算法演进而来;
  • 首先取一个整数d1=n/2, 将元素分为d1个组,每组相邻元素之间距离d1,在各组内进行直接插入排序;
  • 取第二个整数d2=d1/2,重复上述分组排序过程,直到di=1,即所有元素在同一组内进行直接插入排序;
  • 希尔排序每趟并不使某些元素有序,而是使整体数据越来越接近有序;最后一趟排序使得所有数据有序;

2. 原理图如下

  • 初始列表如下:
    在这里插入图片描述
  • 初始列表如图,n=9,n/2整除是4,所以d=4,所以列表会拆成四组,第一组是538,第二组是71,第三组是42,第四组是68,每一组进行排序
    在这里插入图片描述
  • 上面四组排完序之后如下所示,然后重组
    在这里插入图片描述
  • 接下来是d2=d1/2, 也就是4/2=2,将它分为2组
    在这里插入图片描述
  • 然后每组进行依次插入排序,然后重组
    在这里插入图片描述
  • 接下来是d=1,直接进行插入排序
    在这里插入图片描述
    排序就完成了;

3. 代码演示

由于 希尔排序是基于插入排序演进而来,因此只需要在插入排序的基础上,稍作修改;

回滚一下,这个是插入排序代码:
在这里插入图片描述
基于插入排序,调整代码如下

public class ShellSort {

    public static void main(String[] args) {
        int[] arr = {5, 7, 4, 6, 3, 1, 2, 9, 8};
        System.out.println("arr = " + Arrays.toString(arr));
        handShellSort(arr);
        System.out.println("arr = " + Arrays.toString(arr));
    }

    /**
     * 希尔排序
     *
     * @param arr 列表
     */
    public static void handShellSort(int[] arr) {
        int d = arr.length / 2;
        while (d >= 1) {
            shellSortGrep(arr, d);
            d = d / 2;
        }
    }

     /**
     * 希尔排序 间隔排序
     * <p>
     * 其实就是将插入排序里面初始默认值1改成grep
     *
     * @param arr  列表
     * @param gap 时间间隔Grep
     */
    public static void shellSortGrep(int[] arr, int gap) {
        //i 表示 摸到的牌的下标
        for (int i = gap; i < arr.length; i++) {
            //将摸到的牌暂存
            int tmp = arr[i];
            //j 表示手里的牌的下标
            int j = i - gap;
            //如果牌的下标小于0或者 手机的牌小于摸到的牌,就暂停循环
            while (j >= 0 && arr[j] > tmp) {
                //如果手里的牌大于摸到的牌,手里的牌往右边移动
                int temp = arr[j + gap];
                arr[j + gap] = arr[j];
                arr[j] = temp;
                j -= gap;
            }
        }
    }
}

4. 希尔排序时间复杂度

  • 希尔排序的时间复杂度讨论比较复杂,并且和选取的gap序列有关,当gap除以2的时候,他的速度还是比nb三人组里面最慢的堆排序,还要更慢;

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

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

相关文章

微信小程序框架(二)-全面详解(学习总结---从入门到深化)

目录 组件_基础视图 容器 view 文本 text 图片 image 组件_滑块视图容器 基本实现 Swiper常用属性说明 组件_滚动视图区域 水平滚动 垂直滚动 常用属性 组件_icon 图标使用 字体图标属性 组件_progress 基本进度条 属性说明 组件_表单 登录页面 组件_button 按钮属…

这个队列的思路是真的好,现在它是我简历上的亮点了。

前几天在一个开源项目的 github 里面看到这样的一个 pr&#xff1a; 光是看这个名字&#xff0c;里面有个 MemorySafe&#xff0c;我就有点陷进去了。 我先给你看看这个东西&#xff1a; 这个肯定很眼熟吧&#xff1f;我是从阿里巴巴开发规范中截的图。 为什么不建议使用 Fix…

k8s-使用kube-install一键部署(亲测超详细)

文章目录测试环境操作系统环境配置升级操作系统内核基础配置k8s前置配置docker 安装kube-install1.获取kube-install软件包kube-install提供两种安装方式通过Web平台安装kubernetes集群通过命令行快速安装kubernetes集群扩容与销毁Node|修复Master|卸载集群Kubernetes Dashboar…

“特耐苏“牌传递窗——洁净区与洁净之间的辅助设备

传递窗安于高洁净要求的洁净区与洁净之间; 传递窗是一种洁净室的辅助设备&#xff0c;主要用于洁净区与洁净区之间、洁净区与非洁净区之间小件物品的传递&#xff0c;以减少洁净室的开门次数&#xff0c;把对洁净室的污染降低到zui低程度。传递窗采用不锈钢板制作&#xff0c;…

【期末过过过90+】【数据库系统概述】亲笔备考笔记+知识点整理+备考建议

文章目录&#xff1a;故事的开头总是极尽温柔&#xff0c;故事会一直温柔……&#x1f49c;一、前言二、考试题型三、必考重点四、知识点梳理及笔记第1章&#xff1a;绪论第2章&#xff1a;关系数据库第3章&#xff1a;关系数据库标准语言SQL第4章&#xff1a;数据库安全性第5章…

动物静态HTML网页作业作品 大学生野生动物保护网页设计制作成品 简单DIV CSS布局网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

网络基础------IP协议

文章目录IP协议的主要功能网段划分IP数量限制WAN口的IP 和 LAN口的IP路由IP协议的主要功能 网络层&#xff08;IP协议&#xff09;的主要功能&#xff1a; 地址转换和路由选择 传输层&#xff08;TCP协议&#xff09;的主要功能&#xff1a; 传输数据的控制。 有什么区别吗&am…

小程序不在以下request合法域名,http协议添加不了

每个微信小程序需要事先设置通讯域名&#xff0c;小程序只可以跟指定的域名进行网络通信 问题描述 出现http://xxx.不在以下request合法域名列表中&#xff0c;请参考文档 解决方法 在开发中可以勾上不校验合法域名 在发版中就需要把域名放在通讯域名中 [外链图片转存失败,…

ADI Blackfin DSP处理器-BF533的开发详解26:电子书的应用(含源代码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 代码实现了读取 SD 卡中“/txt/test.txt”路径下的 TXT 文件&#xff0c;将 TXT 文件内容显示到液晶屏上&#xff0c;通过按键“Lift-&…

java计算机毕业设计ssm疫苗接种预约系统小程序24tfm(附源码、数据库)

java计算机毕业设计ssm疫苗接种预约系统小程序24tfm&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&…

【数据结构】TopK问题

TopK 在N个数中 找出最大或最小的前k个数&#xff0c;就是TopK算法。比如有一组数字&#xff0c;[1,2,3,4,5,6,7,8,9]&#xff0c;这组数中最大的前 3(k)个数是 9,8,7。最小的 前3个数是 1&#xff0c;2&#xff0c;3。而TopK算法就是找出最大或者最小的前K个数。我们就用堆来实…

【mmdetection系列】mmdetection之backbone讲解

如果是自己来写这部分代码的话&#xff0c;真的是很容易&#xff0c;如果这个框架中有自带的backbone结构的话&#xff0c;那可以从其他地方找到对应的pytorch版本实现&#xff0c;或者自己写。 配置部分在configs/_base_/models目录下&#xff0c;具体实现在mmdet/models/bac…

微信小程序——云音乐界面

文章目录第一章 开发前的准备一、项目展示二、项目分析三、项目初始化第二章 标签页切换一、任务分析二、常用组件介绍三、编写页面结构和样式第三章 音乐推荐一、任务分析二、组件介绍三、编写音乐推荐页面结构和样式第一章 开发前的准备 一、项目展示 音乐小程序项目效果展…

.net开发安卓入门 - Notification(通知)

.net开发安卓入门 - Notification&#xff08;通知&#xff09;通知的布局创建通知通道创建和发布通知我的样例效果图代码资源文件常见问题一切代码都准备就绪了&#xff0c;为什么就是不提示消息内容呢&#xff1f;为什么我的通知不是弹出式的同系列文章推荐通知的布局 创建通…

yolov7运行自己的VOC格式数据集

yolov7运行VOC格式数据集测试开发环境使用自己的VOC格式数据集训练修改配置文件yolov7.yaml修改配置文件voc.yamlVOC格式数据集转换COCO格式开始训练重头开始fine-trainBUG常见报错1常见报错2成功训练网络评价指标可视化测试开发环境 去官网下载yolov7的权重文件&#xff0c;放…

async/await

理解async函数就要先理解generator (生成器)函数,因为async是generator函数的语法糖。 Generator函数 Generator 函数是 ES6 提供的一种异步编程解决方案&#xff0c;可以先理解为一个状态机&#xff0c;封装了多个内部状态&#xff0c;执行Generator函数返回一个遍历器对象&…

【ChatGPT 中文版插件】无需注册体验 ChatGPT 的攻略

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

假设检验介绍

数据科学是一个不断发展的领域&#xff0c;近年来越来越受欢迎。数据科学的一个重要组成部分是假设检验的使用&#xff0c;它可用于从数据中得出结论并做出明智的决策。 什么是假设检验&#xff1f; 假设检验是数据科学中常用的方法&#xff0c;用于评估关于总体参数的假设的有…

前端超级实用的Visual Studio Code插件

前端超级实用的Visual Studio Code插件1、Bracket Pair Colorizer&#xff1a;可以把不同嵌套层级的各种类型的括号&#xff0c;用不同的颜色标注出来2、Auto Close Tag:自动闭合HTML标签3、Auto Rename Tag:自动关闭标签&#xff0c;在开始标记的结束括号中键入后&#xff0c;…

2022年浙大城市学院新生程序设计竞赛(同步赛)D. Cutting with Lines Ⅰ(线段分割 离散化+并查集 补写法)

题目 二维平面&#xff0c;左下角(0,0)右上角(n,m)(1<n,m<1e6)的一块矩形&#xff0c; q(q<2e3)次线段切割操作&#xff0c;操作分四种&#xff1a; ai 1 x&#xff0c;表示切割(x,m)到(x,m-ai)这条竖直线段(0<x<n,1<ai<1e6) ai 2 x&#xff0c;表示切…