算法:希尔排序

算法:排序算法之希尔排序 在前面已经对冒泡排序、直接插入排序做了说明分析,本篇将对希尔排序进行相关说明分析。 排序算法系列目录说明 冒泡排序(Bubble Sort) 插入排序(Insertion Sort) 希尔排序(Shell Sort) 选择排序(Selection Sort) 快速排序(Quick Sort) 归并排序(Merge Sort) 堆排序(Heap Sort) 计数排序(Counting ... 阅读详情
原理:

希尔排序是希尔在插入排序的基础上的改进。
大概是先将待排数组分为gap个数组,每组中的每个数在数组中的间隔为gap,分在在每组中进行插入排序,然后每次gap=gap/2,直到最后gap=1,还原为一个组的数据,这时候数组里面的值就变为大致有序,最后进行一次插入排序,就得到了有序数组。

图示:

在这里插入图片描述

代码实现:
public class ShellSort {
    public void sort(int[] arr,int n){
        int i,j,gap,k;
        //依次设置gap步长,同时也是分组数量
        for(gap=n/2;gap>0;gap/=2 ){
            //每一个I代表一个组
            for(i=0;i<gap;i++){
                //开始每组的插入排序,从无序的第一个数开始
                for(j=i+gap;j<n;j+=gap){
                    //只有前面那个数大于这个数的时候才有必要查找位置,因为前面的是有序的
                    if(arr[j]<arr[j-gap]){
                        int temp = arr[j];
                        //开始将前面的大于temp数向后移动
                        for(k=j-gap;k>=0;k-=gap){
                            if(arr[k]>temp){
                                arr[k+gap]=arr[k];
                            }//遇到比temp小的数就可以退出循环了
                            else break;

                        }
                        arr[k+gap]= temp;

                    }
                }
            }
        }
    }

    public static void main(String[] args) {
        int[] a = {80,35,210,40,20,0,50,29};
        new SelectSort().sort(a,a.length);
        System.out.println(Arrays.toString(a));
    }
}
时间复杂度

希尔排序的时间复杂度与增量(即,步长gap)的选取有关。例如,当增量为1时,希尔排序退化成了直接插入排序,此时的时间复杂度为O(N²),而Hibbard增量的希尔排序的时间复杂度为O(N3/2)。

希尔排序不是稳定算法。

学习链接
一文学懂经典算法系列之:希尔排序 本文关键字:经典算法、排序算法、插入排序、希尔排序、算法实践。希尔排序可以看做是分组插入的排序方法,把全部元素分成几组(等距元素分到一组),在每一组内进行直接插入排序。然后继续减少间距,形成新的分组,进行排序,直到间距为1时停止。... 阅读详情

相关推荐

AWD线下攻防赛总结

在本地组策略编辑器里面,依次展开计算机配置—>管理模板—>Windows组件—>远程桌面服务—>远程桌面会话主机—>连接—>限制连接的数量。8.Web目录环境查找相关可疑文件:jpg/png/rar,属性、解压。进程线程:netstat / ps -aux/netstat -apt。4.查看/etc/init.d/rc.local中启动服务有无异常。1.不使用默认口令,修改成复杂的,并确保和web环境连接。5.使用脚本开启进程监控、目录监控、流量监控。文件操作监控.exe/御剑文件监控.exe。

XuJL89的博客 630

(转) 白话经典算法系列之三 希尔排序的实现(附源代码实现)

链接:http://blog.youkuaiyun.com/morewindows/article/details/6668714 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本...

weixin_30597269的博客 109

开源实战 | 基于SolidWorks与Matlab的并联索驱机器人轨迹规划全流程

本文详细介绍了基于SolidWorks与Matlab的并联索驱机器人轨迹规划全流程,涵盖从基础概念到实战技巧的各个环节。通过SolidWorks建模、Matlab运动学实现及轨迹优化策略,展示了如何实现高精度轨迹规划,适用于摄影、医疗等领域的机器人应用。

weixin_28331555的博客 403

排序算法汇总(三)希尔排序和堆排序(修改版)

一.希尔排序 1.算法原理 希尔排序法是D.L.Shell在1959年发明的一种排序法,可以减少插入排序法中数据搬移的次数,以加速排序的进行.排序的原则是将数据区分成特定间隔的几个小区块,以插入排序法排完区块内的数据后再渐渐减小间隔的距离. 其实希尔排序是我觉得最难写的排序算法.虽然能够感觉到通过这样划分子序列可以减小数据搬移的次数,但究竟是一种怎样的划分,不同的划分对算法的效率能提高到一个怎样的...

weixin_43712228的博客 614

STM32与SD卡SPI接口硬件设计:从原理图到调试的完整指南

SPI(串行外设接口)作为一种广泛应用的同步串行通信协议,以其接线简单、驱动成熟的特点,成为连接微控制器与各类外设的经典方案。其工作原理基于主从架构,通过时钟、数据线和片选信号实现全双工通信,在嵌入式系统中具有极高的技术价值,常用于连接传感器、存储设备和显示模块等。在数据存储场景中,SD卡凭借其大容量和便携性成为首选,而通过SPI模式驱动SD卡,则平衡了性能与设计复杂度。本文聚焦于使用Altium Designer进行硬件设计的工程实践,详细解析了STM32微控制器与SD卡通过SPI通信时,电源管理、上拉电

weixin_34101784的博客 554

RAID 0/1/5/10 性能实测:4块 SATA SSD 组阵列,顺序读写速度对比

本文通过实测对比了RAID 0/1/5/10在4块SATA SSD上的顺序读写性能,详细展示了不同RAID级别的配置方法、理论性能与实际测试数据。测试结果显示,RAID 0在顺序读写速度上表现最佳,而RAID 10则在性能与数据安全之间取得了平衡,适合数据库服务器等关键应用场景。

weixin_33462167的博客 424

常见的八种排序算法(动图理解 + Python代码实现)

https://www.cnblogs.com/onepixel/articles/7674659.html

Kanny 1788

西门子1500 PLC与巴鲁夫RFID实战:从硬件接线到数据读写的完整流程

本文详细介绍了西门子S7-1500 PLC与巴鲁夫RFID系统集成的完整实战流程。内容涵盖从硬件选型、接线、PROFINET网络配置,到在TIA Portal中安装GSD文件、组态设备、分配地址,再到使用标准功能块(如FB31)进行程序架构设计、实现数据读写以及错误诊断。文章重点分享了硬件连接要点、软件配置步骤、数据块管理技巧以及调试中常见问题的解决方案,为工业自动化工程师实施RFID项目提供了清晰的指导。

weixin_29161785的博客 385

数据结构-——排序

#include <stdlib.h> #include <stdio.h> #define MAX 50 int slist[MAX]; /*待排序序列*/ void XierSort(int list[], int n); void insertSort(int list[], int n); void createList(i...

weixin_30273931的博客 557

MongoDB分布式事务实现:两阶段提交、日志复制与冲突解决

MongoDB分布式事务机制解析 本文深入剖析了MongoDB 4.0+版本的分布式事务实现原理,重点分析了其在跨文档/跨集合/跨分片场景下的数据一致性解决方案。核心内容包括: 底层机制:采用改进的两阶段提交协议,通过oplog日志复制实现无中心协调器的事务管理,结合WiredTiger存储引擎和锁机制保障ACID特性。 创新设计:将传统2PC的中心协调功能分散到Primary节点,利用oplog作为事务状态记录,实现自动故障恢复和60秒超时回滚机制。 性能优化:针对大事务、写冲突等常见问题,提出拆分微事务

数据知道的博客 1261

JavaFX 表视图

我们可以使用来自 JavaFX API 的 TableView,TableColumn 和 TableCell 类以表格形式表示数据。通过实现数据模型和应用单元工厂来填充表中的数据。表类可以按列排序数据,并在必要时调整列大小。

2012年开始工作,全栈开发老兵,目前已是一个老师,分享这么多年的心得体会 404

八大排序算法及代码

1.插入排序 (1)直接插入排序 从第一个元素开始,该元素可以认为已经被排序; 取出下一个元素,在已经排序的元素序列中从后向前扫描; 如果该元素(已排序)大于新元素,将该元素移到下一位置; 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置; 将新元素插入到该位置后; 重复步骤2~5。 原始序列:49 38 65 97 13 27 49 第1次: 38 49 65 97 13 27 ...

莉莉莉的博客 424

HCIP - Al Solution 华为认证—— 3、大模型基础

00:20核心目标: 与GPT类似,旨在学习一个通用的预训练模型,以便在大量不同任务上通过微调快速适配。与GPT的对比: BERT的效果在实验数据上优于GPT-1。模型特点: 采用双向的Transformer编码器结构,能够实现不同位置信息之间的互通,这与GPT的单向结构不同。06:3735:45核心思想: 尝试将标准的Transformer结构直接应用于图像,并对图像分类流程进行最少的修改。具体操作流程:图像分块: 将整幅图像拆分成多个小的图像块(Patch)。

qq837993702的博客 158

排序算法基础:希尔排序

希尔排序法基本思想   希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止 希尔排序示意图: 希尔排序的动态示意图: 代码实现 1.交换式(效率低,较好理解) import java.util.Arrays; public class ShellSort { public static void main(String[] args) { int [] arr =

我不想学习但是必须学习 158

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java编程:排序算法——希尔排序

Java编程:希尔排序

KaiSarH 517

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

swust.oj 1099: 希尔排序算法实现

1099: 希尔排序算法实现 题目描述 编程实现希尔排序算法,按照非递减排序,测试数据为整数。 输入 第一行是待排序数据元素的个数n; 第二行是待排序的数据元素。 输出 一趟希尔排序后的结果。 样例输入 10 50 36 41 19 23 4 20 18 12 22 样例输出 4 20 18 12 22 50 36 41 19 23 #include<iostream> using namespace std; void shellsort(int a[],int n,int d[],int

xiaodaitongxue的博客 1150

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

算法基础四:希尔排序

前面给大家介绍了算法,通过将待排序序列中的元素逐个插入到有序的子序列中,最终使整个序列变得有序。下图所示的动画演示了插入排序的整个过程:图1:插入排序算法观察动画不难发现,插入排序算法是通过比较元素大小和交换元素存储位置实现排序的,比较大小和移动元素的次数越多,算法的效率就越差。

weixin_72011965的博客 882

排序算法第一谈:希尔排序

希尔排序是插入排序的一种,又称“缩小增量排序”,是插入排序算法的一种更高效的改进版本。 思想: 将待排序数组按照步长gap进行分组,然后将每组的元素利用直接插入排序的方法进行排序;每次将gap折半减小,循环上述操作;当 gap=1时,利用直接插入,完成排序。同样的:从上面的描述中我们可以发现:希尔排序的总体实现应该由三个循环完成:第一层循环:将gap依次折半,对序列进行分组,直到gap=1第二、三层循环:也即直接插入排序所需要的两次循环。 移位法 public static void shel.

小游子YKY的博客 2077

基础算法:希尔排序

希尔排序,也称递减增量排序算法,1959年Shell发明。是插入排序的一种高速而稳定的改进版本。 希尔排序是先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。 1、基本思想 (1)设待排序元素序列有n个元素,首先取一个整数increment(小于n)作为间隔将全部元素分为increment个子序列,所有距离为i...

天才小站 489

排序算法:希尔排序

希尔排序在面试或是实际应用中都很少遇到,读者仅需了解即可。

智者千虑,必有一失;愚者千虑,必有一得。 536

另外一些排序算法:希尔排序、基数排序、桶排序

一、希尔排序希尔排序,其实属于一种特殊的插入排序,是简单排序算法里面的直接插入排序的改进版。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。希尔排序是基于插入排序的以下两点性质而提出改进方法的:插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;插入排序一般来说...

Gensoukyo 790

希尔排序的增量怎么取_第三篇,插入排序算法:直接插入排序、希尔排序

此为第三篇,插入排序算法:直接插入排序、希尔排序。简介插入排序是一种简单直观的排序方法,其基本思想是:每次将一个待排序的记录按其关键字大小插入到前面己排好序的子序列中,直到全部记录插入完成。基于插入的排序算法主要介绍直接插入排序和希尔排序。一.直接插入排序假设在排序过程中,待排序表 L[1....n]在某次排序过程中的某一时刻状态如下:要将元素L(i)插入到已有序的子序列 L[...

weixin_42312392的博客 1460
上一篇: 算法:插入排序
下一篇: 算法:快速排序
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝多芬也爱敲代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值