Java学习手册:(数据结构与算法-排序)希尔排序

数据结构之排序:希尔排序 直接插入排序算法简单,在n值较小时,效率比较高;当n值比较大师,如果待排序序列是按关键字值基本有序,效率依然很高,骑士剑效率可以提高到O(n)O(n)。希尔排序正式从这两点出发对直接插入排序的改进方法。希尔排序(Shell Sort)又称为“缩小增量排序”,有D. L. Shell在1959年首先提出来。基本思想先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录 阅读详情

算法思想:

①先将待排序记录序列分割成若干个“较稀疏的”子序列,分别进行直接插入排序。

②经过上述粗略调整,整个序列的记录已基本有序,最后再对全部序列进行一次直接插入排序。

分析:

希尔排序的特点是,子序列的构成不是简单的逐段分割,而是将某个相隔某个增量的记录组成一个子序列。如上面的例子,第一堂排序时的增量为5,第二趟排序的增量为3。由于前两趟的插入排序中记录的关键字是和同一子序列中的前一个记录的关键字进行比较,因此关键字较小的记录就不是一步一步地向前挪动,而是跳跃式地往前移,从而使得进行最后一趟排序时,整个序列已经做到基本有序,只要作记录的少量比较和移动即可。因此希尔排序的效率要比直接插入排序高。


希尔排序的分析是复杂的,时间复杂度是所取增量的函数,这涉及一些数学上的难题。但是在大量实验的基础上推出当n在某个范围内时,时间复杂度可以达到O(n^1.3)。

具体实现:

首先选定两个记录间的距离d1,在整个待排序记录序列中将所有间隔为d1的记录分为一组,进行组内直接插入排序,然后再取两个记录间的距离d2<d1,在整个待排序序列中,将所有间隔为d2的记录分为一组,进行组内直接插入排序,直至选定两个记录间的距离dt=1为止,此时只有一个序列,即整个待排序记录序列。(一般情况下d1=n/2,di+1=di/2(向下取整),并且最后一个增量等于1)

package com.haobi;
/*
 * 希尔排序
 */
public class ShellSort {
	public static void shellSort(int[] array) {
		int length = array.length;//数组长度
		int j;
		int d;//定义记录间的距离d
		int temp;
		for(d=length/2;d>0;d=d/2) {//不断缩小两个记录间的距离d,直至d=1
			for(int i=d;i<length;i++) {
				temp = array[i];//存放待插入数据
				for(j=i-d;j>=0;j-=d) {//以间隔d遍历整个数组,进行组内直接插入排序
					if(temp<array[j]) {
						array[j+d] = array[j];//从子集中进行数据交换并寻找插入位置
					}else {
						break;
					}
				}
				array[j+d] = temp;//将待插入的数据插入
			}
		}
	}
	public static void main(String[] args) {
		int[] array = {16,25,12,30,47,11,23,36,9,18,31};
		shellSort(array);
		for(int i=0;i<array.length;i++) {
			System.out.print(array[i]+" ");
		}
	}
}

程序输出结果如下:

9 11 12 16 18 23 25 30 31 36 47 

 

Java数据结构与排序算法动态演示 在软件开发领域,数据结构和排序算法是构建高效程序的基础。Java作为一种广泛使用的编程语言,提供了丰富的数据结构和成熟的排序算法实现。为了深入理解这些概念,本章将介绍数据结构和排序算法的定义、分类及其在Java中的应用。排序算法是一类重要的基础算法,用于将一组无序的数据按照特定的顺序重新排列。其定义包括比较两个元素的大小并按照特定规则交换位置,直到整个数据序列变得有序。排序算法在计算机科学和工程中扮演着至关重要的角色,从数据库索引优化、数据查询,到图形渲染和科学计算等多个领域都有广泛应用。 阅读详情

相关推荐

UE4项目迁移指南:如何无缝导入外部.uasset文件并保持材质关联

本文详细解析了将外部.uasset文件无缝导入UE4项目的专业方法。针对手动复制文件时常见的材质关联丢失问题,提供了使用引用查看器进行诊断和修复的实用技巧,并推荐使用引擎内置的“迁移”功能确保资源依赖关系的完整性,帮助开发者高效整合项目资源。

t8u9v0的博客 1046

希尔排序

希尔(Shell)排序的基本思想:   先取一个小于n的整数d1作为第一个增量,把文件的全部记 录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即 所有记录放在同一组中进行直接插入排序为止。该方法实质上是一种分组插入方法。 ...

qq_41910413的博客 1391

用matlab编程求矩阵的极大无关组,向量组极大无关组表示问题

已知向量组T:Eqn11.gif (3.16 KB, 下载次数: 1)2013-10-21 19:19 上传.(1) 求向量组T的秩,并判断向量组T的相关性;(2) 求T的极大线性无关组;(3) 将其余的向量用所求的极大线性无关组线性表示。程序:>> A=[1 1 3 2;-1 1 -1 3;5-2 8 9;-1 3 1 7]>> r=rank(A)>> A1=...

weixin_35094083的博客 7388

插入排序和希尔排序(Java实现)

插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。 希尔排序算法是插入排序的一种更高效的改进版本。它的作法不是每次一个元素挨一个元素的比较。而是初期选用大跨步(增量较大)间隔比较,使记录跳跃式接近它的排序位置;然后增量缩小;最后增量为 1 ,这样记录移动次数大大减少,提高了排序效率。希尔排序对增量序列的选择没有严格规定。

Ron.Zheng 1643

西门子S7-1200控制伺服/步进电机方法与接线(全)

西门子S7-1200控制伺服/步进电机方法与接线(全) 伺服/步进电机在非标自动化控制中十分常用,但作者发现在各类开源网站上很少有人做西门子1200PLC控制伺服/步进电机的教程,于是今天想着跟大家分享一下。 本文共分为一下几个四个内容。 文章目录西门子S7-1200控制伺服/步进电机方法与接线(全)前言一、准备二、接线1.PLC接线:2.伺服接线:3. 步进电机的接线:三、代码组态代码四、可能出现的问题 前言 工程控制常用到三项异步电机、直流电机等,但他们都无法准确的控制电机角度;于是有了步进电机、

weixin_46060068的博客 7万+

html python mysql交互_干货!Python与MySQL数据库的交互实战

安装PyMySQL库如果你想要使用python操作MySQL数据库,就必须先要安装pymysql库,这个库的安装很简单,直接使用pip install pymysql;假如这种方式还是安装不上,就用如下链接找一个合适的安装包,进行安装,这个就不细说了。https://www.lfd.uci.edu/~gohlke/pythonlibs/使用Python连接MySQL数据库1)六个常用的连接参数参数...

weixin_31043555的博客 1561

数据结构-算法: 插入排序(希尔排序法)

希尔排序法基本思想 希尔排序(Shell Sort)又称为“缩小增量排序”。是1959年由D.L.Shell提出来的。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),...

weixin_34268310的博客 277

手把手教你用u-center配置ublox GPS模块:从波特率到报文频率全流程

本文提供了一份详细的u-center软件配置ublox GPS模块的完整指南。从硬件连接到软件设置,逐步讲解了如何探测并设置正确的波特率、选择与启用关键的NMEA和UBX报文,以及配置输出频率。文章特别强调了配置固化的重要性,并分享了使用UBX协议进行高效数据解析等高级技巧,帮助开发者快速上手并优化GPS模块性能。

weixin_28285943的博客 897

算法——希尔排序(ShellSort)

希尔排序,又称缩小增量排序,也是一种插入排序方法。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序的核心在于间隔序列的设定。既可以提前设定好间隔序列,也可以动态地定义间隔序列。希尔排序的基本思想是,将整个待排序记录序列分割成若干个子序列,然后对每一个子序列进行直接插入排序。具体如下:(1)先取一个正整数分成d1,把全部记录d1个组,所有距离为d1的倍数的记录看成一组,然后在各组内进...

u012194956的博客 456

【数据集介绍】MVTec 3D AD数据集介绍

MVTec AD(MVTec Anomaly Detection)数据集是用于异常检测的计算机视觉数据集。该数据集包含来自工业生产中不同材料和产品的图像,包括玻璃、塑料、纺织品等。每个类别都包含正常样本和异常样本。这些异常样本包括各种常见的生产缺陷,如划痕、裂纹、凹陷等。MVTec AD数据集旨在帮助研究人员和从业者开发和评估用于检测工业制造中物体缺陷的算法和系统。

原来也有北瓜 7753

强化学习(Q-learning、DQN) —— 理论、案例与交互式 GUI 实现

本文详细介绍了强化学习中基于值函数的 Q-learning 算法及深度强化学习的 DQN 方法,从基本理论、数学模型到算法流程均进行了全面阐述。通过迷宫导航、股票交易策略和机器人控制等典型案例,展示了强化学习在处理高维、非线性和时变问题中的强大适应性。为了帮助工程师和研究者更直观地理解强化学习的训练过程,本文还提供了一份基于 Python 与 PyQt6 实现的交互式 GUI 演示系统代码示例,用户可以在线调整参数,实时观察累计奖励和 Q 值的变化,从而更深入地理解算法收敛和策略演化的过程。

闲人编程的博客 1475

数据结构与算法之希尔排序

希尔排序概念 代码实现 时间复杂度

努力让自己发光,对的人才能迎着光而来 2万+

Horn-Schunck光流算法的Python实现

光流是计算机视觉领域中的一个重要概念,它描述了图像中物体在时间上的运动。Horn-Schunck光流算法是一种经典的光流估计方法,通过对图像的亮度变化进行建模,来估计像素的运动速度。在本文中,我们将使用Python实现Horn-Schunck光流算法,并提供相应的源代码。请注意,该算法假设图像上的亮度变化主要由物体的运动引起,并且假设光流在整个图像上是稠密的。在上面的示例中,我们首先读取了两个输入图像,然后使用我们实现的Horn-Schunck光流算法估计了它们之间的光流。首先,我们需要导入一些必要的库。

持续更新 495

【JavaSE与数据结构】排序算法之冒泡排序,选择排序,插入排序与希尔排序

本篇文章带大家认识排序算法——冒泡排序,选择排序,插入排序与希尔排序,其中冒泡排序,选择排序,插入排序是基础的排序算法,希尔排序是插入排序的优化,四种排序算法全部都是基于比较的排序算法,本文将以图解动图的方式描述算法实现过程,实现代码为java。

未见花闻的博客 1524

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【算法学习】 七 希尔排序

希尔排序,插入排序的plus版本,图文并茂,方便理解

程序猿学社的博客 4592

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

希尔排序算法

本章介绍排序算法中的希尔排序。内容包括: 1. 希尔排序介绍 2. 希尔排序图文说明 3. 希尔排序的时间复杂度和稳定性 4. 希尔排序实现 4.1 希尔排序C实现 4.2 希尔排序C++实现 4.3 希尔排序Java实现转载请注明出处:希尔排序 - 如果天空不死 - 博客园更多内容:数据结构与算法系列 目录希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。希尔排序实质上是一种分组插入方法。它的基本思想是:对于

生活需要深度 3202

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java学习手册:数据结构与算法汇总

数据结构与算法程序题汇总如下:(不断更新中) 1、PAT(Basic Level)Practise-----1001 2、Java学习手册:(数据结构与算法-链表)如何实现单链表的增删操作? 3、Java学习手册:(数据结构与算法-链表)如何实现单链表排序? 4、Java学习手册:(数据结构与算法-链表)如何从链表中删除重复元素? 5、Java学习手册:(数据结构与算法-链表)如何找出单链表中的倒...

浩比的专栏 3248

JAVA数据结构与算法之————希尔排序

JAVA数据结构与算法之————希尔排序 个人理解:希尔排序其实是增量不为1的冒泡排序。 代码: import java.util.Arrays; /* * 希尔排序算法的时间复杂度为O(n^1.5), 空间复杂度为O(1) * */ public class ShellSort<E extends Comparable> { private Swap<E> s ...

qq_36007633的博客 595

JAVA排序算法之希尔排序

基本介绍 希尔排序是希尔(Donald Shell)于 1959 年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。 希尔排序法基本思想 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止 希尔排序法的示意图 代码实...

imust的博客 1728

【Java数据结构与算法】希尔排序

希尔排序介绍及其实现

lolly1023的博客 728

Java数据结构与算法-插入排序与希尔排序详解及代码

插入排序与希尔排序 一,插入排序 插入排序的原理‘ 插入排序的特点 插入排序的代码实现 (1),插入排序的原理 插入排序(InsertionSorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之...

大美妞的博客 4549

【数据结构与算法】希尔排序

摘要: 希尔排序是插入排序的优化版本,通过引入增量(Gap)实现元素跳跃式移动,解决插入排序中尾部小数需逐步前移的效率问题。其核心思想是分组插入排序:先将数组按间隔Gap分组并排序,逐步缩小Gap至1,最终完成整体排序。相比插入排序,希尔排序将相邻比较的步长1替换为动态Gap,显著提升效率。时间复杂度取决于Gap序列,最优可达O(n^1.3),空间复杂度O(1),但稳定性较差。适用于中等规模数据或内存敏感场景,典型实现通过三层循环控制Gap递减和分组排序。

lihaoweiwudi_的博客 930

java实现希尔排序算法

希尔排序 1、算法思想 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。 简单插入排序很循规蹈矩,不管数组分布是怎么样的,依然一步一步的对元素进行比较,移动,插入,比如[5,4,3,2,1,0]这种倒序序列,数组末端的0要回到首位置很是费劲,比较和移动元素均需n-1次。而希尔排序在数组中采用跳跃式分组的策略,通过某个增量将数组元素划分为若干组,然后分组进行插入排序,随后逐步缩小增量,继续按

EatingSoilLang 1131

Java 与排序算法(4):希尔排序

希尔排序(Shell Sort)是插入排序的改进版,由 Donald Shell 在 1959 年提出。希尔排序通过将待排序序列分成多个子序列,分别进行插入排序,最后再进行一次整体的插入排序,从而提高了排序效率。希尔排序的基本思想是将待排序序列分成若干个子序列,对每个子序列进行插入排序,使得整个序列在插入排序的基础上更加有序。具体来说,希尔排序的实现过程如下:选择一个增量序列,通常为 n/2、n/4、n/8 等,其中 n 为待排序序列的长度。

暗星涌动 1762
上一篇: Java学习手册:(数据结构与算法-排序)插入排序
下一篇: Java学习手册:(数据结构与算法-排序)冒泡排序
浩比浩比
博客等级 码龄12年 395粉丝 202原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值