【算法】希尔排序
目录
- 1. 说明
- 2. 举个例子
- 3. java代码示例
- 4. java示例截图
1. 说明
- 1.希尔排序是直接插入排序的一种改进,其本质是一种分组插入排序
- 2.希尔排序采取了分组排序的方式
- 3.把待排序的数据元素序列按一定间隔进行分组,然后对每个分组进行直接插入排序
- 4.随着间隔的减小,一直到1,从而使整个序列变得有序
- 5.希尔排序适用于大多数数据元素有序的序列,由于排序期间,同一元素的顺序会经常移动,所以希尔排序不是稳定的排序方法
2. 举个例子
- 示例: [6, 2, 4, 3, 5, 1]
- 1.获取数组的长度6
- 2.计算间隔gap=6/2=3 (将数组分为3组,6和3比较,2和5比较,4和1比较)
- 3.【6和3比较】拿到索引为0的数6(array[j-gap])与索引为3的数3(temp)进行比较,6>3即array[j-gap] > temp, 6 > 3,将索引为3的数改为6,得到数组[6, 2, 4, 6, 5, 1],j=j-gap=3-3=0,0小于gap跳出while循环
- 4.将索引为0的数改为3,得到数组[3, 2, 4, 6, 5, 1]
- 5.【2和5比较】拿到索引为1的数2(array[j-gap])与索引为4的数5(temp)进行比较,2<5则不进行while循环,将索引为4的数改为5(本身就是5,改了不影响), 数组不做改变
- 6.【4和1比较】拿到索引为2的数4(array[j-gap])与索引为5的数1(temp)进行比较,4>1即array[j-gap] > temp, 4 > 1,将索引为5的数改为4,得到数组[3, 2, 4, 6, 5, 4],j=j-gap=5-3=2,2小于gap跳出while循环
- 7.将索引为2的数改为1,得到数组[3, 2, 1, 6, 5, 4]
- 8.计算间隔gap=3/2=1,当间隔为1时,数组中的数字基本有序,再进行插入排序
- 9.取索引为1的数2,比较索引为0的数3,2小于3,则将索引为1的数改为3,索引为0之前没有数了,得到数组[2, 3, 1, 6, 5, 4]
- 10.取索引为2的数1,比较索引为1的数3,1小于3,则将索引为2的数改为3,索引为1之前有索引为0的数2,1小于2,则将索引为1的数改为2,索引为0的数改为1 (大数往后挪),得到数组[1, 2, 3, 6, 5, 4]
- 11.取索引为3的数6,比较索引为2的数3,6大于3,继续
- 12.取索引为4的数5,比较索引为3的数6,5小于6,则将索引为4的数改为6,索引为3之前有索引为2的数3,5大于3,则将索引为3的数改为5,得到数组[1, 2, 3, 5, 6, 4]
- 13.取索引为5的数4,比较索引为4的数6,4小于6,则将索引为5的数改为6,索引为4之前有索引为3的数5,4小于5,则将索引为4的数改为5,得到数组[1, 2, 3, 5, 5, 6];索引为3之前有索引为2的数3,4大于3,则将所因为3的数改为4,得到数组[1, 2, 3, 4, 5, 6]
3. java代码示例
package com.learning.algorithm.sort;/*** 希尔排序* 示例: 6, 2, 4, 3, 5, 1* 1.获取数组的长度6* 2.计算间隔gap=6/2=3 (将数组分为3组,6和3比较,2和5比较,4和1比较)* 3.【6和3比较】拿到索引为0的数6(array[j-gap])与索引为3的数3(temp)进行比较,6>3即array[j-gap] > temp, 6 > 3,将索引为3的数改为6,得到数组[6, 2, 4, 6, 5, 1],j=j-gap=3-3=0,0小于gap跳出while循环* 4.将索引为0的数改为3,得到数组[3, 2, 4, 6, 5, 1]* 5.【2和5比较】拿到索引为1的数2(array[j-gap])与索引为4的数5(temp)进行比较,2<5则不进行while循环,将索引为4的数改为5(本身就是5,改了不影响), 数组不做改变* 6.【4和1比较】拿到索引为2的数4(array[j-gap])与索引为5的数1(temp)进行比较,4>1即array[j-gap] > temp, 4 > 1,将索引为5的数改为4,得到数组[3, 2, 4, 6, 5, 4],j=j-gap=5-3=2,2小于gap跳出while循环* 7.将索引为2的数改为1,得到数组[3, 2, 1, 6, 5, 4]* 8.计算间隔gap=3/2=1,当间隔为1时,数组中的数字基本有序,再进行插入排序* 9.取索引为1的数2,比较索引为0的数3,2小于3,则将索引为1的数改为3,索引为0之前没有数了,得到数组[2, 3, 1, 6, 5, 4]* 10.取索引为2的数1,比较索引为1的数3,1小于3,则将索引为2的数改为3,索引为1之前有索引为0的数2,1小于2,则将索引为1的数改为2,索引为0的数改为1 (大数往后挪),得到数组[1, 2, 3, 6, 5, 4]* 11.取索引为3的数6,比较索引为2的数3,6大于3,继续* 12.取索引为4的数5,比较索引为3的数6,5小于6,则将索引为4的数改为6,索引为3之前有索引为2的数3,5大于3,则将索引为3的数改为5,得到数组[1, 2, 3, 5, 6, 4]* 13.取索引为5的数4,比较索引为4的数6,4小于6,则将索引为5的数改为6,索引为4之前有索引为3的数5,4小于5,则将索引为4的数改为5,得到数组[1, 2, 3, 5, 5, 6];索引为3之前有索引为2的数3,4大于3,则将所因为3的数改为4,得到数组[1, 2, 3, 4, 5, 6]*/
public class ShellSort {public static void sort(int[] array) { int len = array.length; for (int gap = len / 2; gap > 0; gap /= 2) { for (int i = gap; i < len; i++) { int temp = array[i]; int j = i;int index = j - gap;while (j >= gap && array[index] > temp) {array[j] = array[j - gap];j -= gap;index = j - gap;} array[j] = temp; } } }public static void print(int[] array) {for (int i : array) {System.out.print(i + " ");}}public static void main(String[] args) {int array[] = {6, 2, 4, 3, 5, 1};sort(array); print(array);}
}
4. java示例截图
相关文章:

【算法】希尔排序
目录 1. 说明2. 举个例子3. java代码示例4. java示例截图 1. 说明 1.希尔排序是直接插入排序的一种改进,其本质是一种分组插入排序 2.希尔排序采取了分组排序的方式 3.把待排序的数据元素序列按一定间隔进行分组,然后对每个分组进行直接插入排序 4.随着间…...

四、Zookeeper节点类型
目录 1、临时节点 2、永久节点 Znode有两种,分别为临时节点和永久节点。 节点的类型在创建时即被确定,并且不能改变。 1、临时节点 临时节点的生命周期依赖于创建它们的会话。一旦会话结束,临时节点将被自动删除,...

arcgis导出某个属性的栅格
选中栅格特定属性想要导出时,无法选中“所选图形” 【方法】spatial analyst 工具——提取分析——按属性提取...
计算机网络——传输层
传输层的基本单位是报文; 一、传输层的基本概念 传输层提供端到端的服务; 从通信和信息处理的角度看,传输层向上层应用层提供通信服务; (一)端口号 协议作用端口号FTP文件传输协议21连接;2…...

策略设计模式
package com.jmj.pattern.strategy;public interface Strategy {void show(); }package com.jmj.pattern.strategy;public class StrategyA implements Strategy{Overridepublic void show() {System.out.println("买一送一");} }package com.jmj.pattern.strategy;p…...

Golang中rune和Byte,字符和字符串有什么不一样
Rune和Byte,字符和字符串有什么不一样 String Go语言中, string 就是只读的采用 utf8 编码的字节切片(slice) 因此用 len 函数获取到的长度并不是字符个数,而是字节个数。 for循环遍历输出的也是各个字节。 Rune rune 是 int32 …...

实施工程师运维工程师面试题
Linux 1.请使用命令行拉取SFTP服务器/data/20221108/123.csv 文件,到本机一/data/20221108目录中。 使用命令行拉取SFTP服务器文件到本机指定目录,可以使用sftp命令。假设SFTP服务器的IP地址为192.168.1.100,用户名为username,密…...

6-13连接两个字符串
#include<stdio.h> int main(){int i0,j0;char s1[222],s2[333];printf("请输入第一个字符串:\n");gets(s1);//scanf("%s",s1);printf("请输入第二个字符串:\n");gets(s2);while(s1[i]!\0)i;while(s2[j]!\0)s1[i]s2…...

Linux中的文件IO
文章目录 C语言文件操作系统文件I/O接口介绍 open函数返回值文件描述符fd0 & 1 & 2文件描述符的分配规则 重定向使用 dup2 系统调用 FILE理解文件系统理解硬链接软链接acm 动态库和静态库静态库与动态库生成静态库生成动态库: C语言文件操作 先来段代码回顾…...

深度学习记录--初识向量化
什么是向量化? 之前计算logistic回归损失函数时,在代码实现时,讨论了for循环:过多的for循环会拖慢计算的速度(尤其当数据量很大时) 因此,为了加快计算,向量化是一种手段 运用python的numpy库,…...

树与二叉树堆:经典OJ题集(2)
目录 二叉树的性质及其问题: 二叉树的性质 问题: 一、对称的二叉树: 题目: 解题思路: 二、另一棵树: 题目: 解题思路: 三、翻转二叉树: 题目:…...
Java面试题(每天10题)-------连载(40)
目录 Mysql篇 1、表中有大字段X(例如:text类型),且字段X不会经常更新,将该字段拆成子表好处是什么? 2、Mysql中InnoDB引擎的行锁是通过加载什么上完成的? 3、Mysql中控制内存分配的全局参数…...

2023年【起重机司机(限桥式起重机)】报名考试及起重机司机(限桥式起重机)考试资料
题库来源:安全生产模拟考试一点通公众号小程序 2023年【起重机司机(限桥式起重机)】报名考试及起重机司机(限桥式起重机)考试资料,包含起重机司机(限桥式起重机)报名考试答案和解析及起重机司机(限桥式起重机)考试资料练习。安全生产模拟考试一点通结合…...

Linux的基本指令(3)
目录 制作小文件&查看 nano指令 cat指令 tac指令 制作大文件&查看 一切皆文件 echo指令 > 输出重定向 以写"w"的形式打开文件 以追加"a"的形式打开文件 cat指令 < 输入重定向 创建big.txt more指令 less指令(推…...
C语言memcpy,memmove的介绍及模拟实现
文章目录 每日一言memcpy介绍模拟实现 memmove介绍模拟实现思路代码 结语 每日一言 If you want to lift yourself up, lift up someone else. 如果你想振奋自己, 先振奋周遭的人。 memcpy 介绍 函数原型: void *memcpy(void *dest, const void *sr…...

克服.360勒索病毒:.360勒索病毒的解密和预防
导言: 在数字化的今天,数据安全问题变得愈发棘手。.360勒索病毒是当前网络空间的一场潜在灾难,对于这个威胁,了解应对之道和采取切实的预防措施至关重要。如果您正在经历勒索病毒的困境,欢迎联系我们的vx技术服务号(s…...
21、Resnet50 中包含哪些算法?
(本文已加入“计算机视觉入门与调优”专栏,点击专栏查看更多文章信息) 这一节汇总一下resnet50 中包含的算法,并且简单介绍。 总共卷积算法、激活算法(relu)、最大池化算法、加法(主要是为了实现残差结构)、全局平均池化、全连接和 softmax 算法这几种算法。 卷积 卷…...

pybind11教程
pybind11教程 文章目录 pybind11教程1. pybind11简介2. cmake使用pybind11教程3. pybind11的历史 1. pybind11简介 项目的GitHub地址为: pybind11 pybind11 是一个轻量级的头文件库,用于在 Python 和 C 之间进行互操作。它允许 C 代码被 Python 调用&am…...
Java基础- 自定义类加载器
自定义类加载器 在 Java 中实现自定义类加载器通常涉及继承 ClassLoader 类并重写其 findClass 方法。自定义类加载器允许我们从非标准来源(如网络、加密文件或其他媒体)加载类。下面是实现自定义类加载器的基本步骤: 1. 继承 ClassLoader …...

2022年高校大数据挑战赛A题工业机械设备故障预测求解全过程论文及程序
2022年高校大数据挑战赛 A题 工业机械设备故障预测 原题再现: 制造业是国民经济的主体,近十年来,嫦娥探月、祝融探火、北斗组网,一大批重大标志性创新成果引领中国制造业不断攀上新高度。作为制造业的核心,机械设备在…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...