排序算法入门——希尔(shell)排序

排序算法之希尔排序详解 前言 在我写的插入排序详解中,有可能出现下面的问题。 数组 arr = {2,3,4,5,6,1} 这时需要插入的数 1(最小), 这样的过程是: {2,3,4,5,6,6} {2,3,4,5,5,6} {2,3,4,4,5,6} {2,3,3,4,5,6} {2,2,3,4,5,6} {1,2,3,4,5,6} 结论: 当需要插入的数是较小的数时,后移的次数明显增多,对效率有影... 阅读详情

涵义

·        希尔排序是直接插入排序的改进版,其排序过程中采用的排序依然是插入排序,但是也做了一定优化,使插入排序效率更高。

时间复杂度

·        直接插入排序最好的时间复杂度为O(n)

·        直接插入排序的最坏时间复杂度为O(n^2)

·        因此直接插入排序总的平均时间复杂度为O(n^1.3)

注:不稳定

排序原理

相对于插入排序的一遍排好的方式,希尔排序则是把要排序的元素按一种特定的算法先分组,然后在组内进行直接插入的排序,由于计算中每次取数的间距不同,分组自然不同,组内间距不同,随着组个数减小,组内元素增多,排序越来越接近成功,最后一次,就直接全部排序。

测试截图

要排序的数字为2,5,3,6,1,7,9,8,4,11

 

截图是程序运行过程中每次根据间距分组的的情况,以及每遍,排序的结果,下面的程序就是测试实例

c++

整个代码是我根据之前写的直接插入排序改的,如果不好理解,可以看看我直接插入排序的博客,可以帮助理解shell排序。

#include<iostream>
using namespace std;
void shell(int a[6],int n){
	int temp;
	for(int step=n/2; step>0;step=step/2){//计算每次循环间距
	/*	代码注释部分是上面为了上面截图展示运行过程而写的,不是必要代码
                cout<<"间距为"<<step<<endl; 
		for(int g=0;g<n;g++){
		cout<<a[g]<<" ";
		}
		cout<<endl;*/
		for(int k=0;k<step;k++){//间距大小决定分组个数
			//cout<<"第"<<k<<"组   "<<a[k]<<" "; 
            //下面的循环,代码取自我写的直接插入的博客,只是添加了遍历间距
			for(int i=k+step;i<n;i=i+step){
				//cout<<a[i]<<" ";
				if(a[i]<a[i-step]){
					temp=a[i];
					for(int j=i-step;j>=0&&a[j]>temp;j=j-step){
						a[j+step]=a[j];
					}
					a[j+step]=temp;
				}
			}
			//cout<<endl;
		}
	}
}
void print(int a[10],int n){
	for(int i=0;i<n;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
}
int main(){
	int a[10]={2,5,3,6,1,7,9,8,4,11};
	shell(a,10);//排序
	print(a,10);//输出
}

删去注释内容运行截图

排序算法——希尔排序 Shell Sort(C++ Java) 希尔排序(ShellSort)也称递减增量排序算法,其实它是插入排序的优化版本。希尔排序是非稳定排序算法。 希尔排序对插入排序的以下两点进行改进: (1)插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率; (2)一般来说插入排序是低效的,因为插入排序每次只能将数据移动一位。 原始的算法实现在最坏的情况下需要进行O(n^2)的比较和交换。V. Pratt的书对算法进行了少量修改,可以使得性能提升至O(n(logn)^2)。这比最好的比较算法的O(nlogn)要差一些。 希.. 阅读详情

相关推荐

安时积分法和开路电压法结合估算锂电池SOC

基于安时积分法和开路电压法结合的锂电池SOC估计Simulink仿真建模,利用安时积分法计算放电过程中的SOC,在搁置状态利用开路电压法进行SOC修正。

qq_39304296的博客 2552

常见排序算法的最好、最坏、平均时间复杂度、稳定性、是否基于比较

先看表格 分类 算法 时间复杂度 空间复杂度       稳定性           关联性        最好          最差        平均       插入排序        直接插入排序   &nbsp

weixin_39104847的博客 1万+

13个GNS3 3.0.5 appliances设备模板镜像合集:IOSv/L2,IOU L2/L3,以及IOS-XE

13个GNS3 appliances设备模板:IOSv/L2,IOU L2/L3,以及IOS-XE合集

haierccc的博客 1069

数据结构算法--排序--希尔排序(shell sort)

希尔排序 时间复杂度:平均O(n^1.3),最好为O(n),最坏为0(n ^ 2) 空间复杂度:O(1) 稳定性:不稳定 算法解析: 希尔排序是直接插入排序的一种改进,又称做缩小增量排序 希尔排序是把待排序集合计算出一个增量集合Tn 把待排序集合分成若干个子集,然后每个子集进行直接插入排序,知道Ti=1为止,排序结束 实现原理: 有一个集合如下图所示: 计算增量:gap ...

Galbraith_的博客 345

大数据应用技术实验报告一 Hadoop三种模式安装配置

JDK+Hadoop安装配置、单机模式配置 以下操作在SecureCRT里面完成 1.关闭防火墙 firewall-cmd --state 显示防火墙状态running/not running systemctl stop firewalld 临时关闭防火墙,每次开机重新开启防火墙 systemctl disable firewalld 禁止防火墙服务。 2.传输JDK和HADOOP压缩包 Sec...

Ruthless_Childe的博客 3089

从“要啥”到“咋测”:手把手拆解Aspice SWE.1需求分析,为你的车载/嵌入式项目避坑

本文深入解析Aspice SWE.1需求分析在车载/嵌入式项目中的关键作用,帮助开发者将模糊的系统需求转化为可执行、可验证的软件需求。通过实战案例和结构化方法,详细拆解功能需求原子化、非功能需求工程化表达等核心技巧,为项目避坑提供实用指南。

weixin_31682031的博客 257

shell数组排序和插入数字并排序

文章目录一:shell数组排序1.1:升序1.2:降序(同升序,将if判断中"-gt" 改为 "-lt")二:shell数组插入数字并排序 一:shell数组排序 1.1:升序 #!/bin/bash for ((i=1;i<=5;i++));do read -p "请输入第$i个数字:" num abc[$i-1]=$num done for ((a=0;a<${#abc[...

CN_TangZheng的博客 946

SAP 销售订单BOM使用场景简介

通常在MTO的生产场景中,我们会根据已创建的SO去展开BOM去驱动生产,如果我们生产地产品BOM是通用性的通常我们用标准BOM的方式就可以实现,但是实际在生产过程中往往不会这样,不同的客户对某些物料的规格就不相同,就会涉及产生不同的BOM,但是该客户的产品又不存在通用性,这个时候就会引入概念就是销售订单BOM,先有销售订单然后根据销售订单+行项目创建BOM。销售BOM:根据销售订单号+行项目号创建的BOM,是根据特定的销售订单或者可以理解为特定的客户创建的BOM。

我小时候很黑的博客 4216

shell排序算法

排序

博客 892

物联网设备数据是如何流转的:基于EMQX与TDengine的前后端分离项目实践

背景 在我写了TDengine极简实战:从采集到入库,从前端到后端,体验物联网设备数据流转这篇文章后,不少读者朋友评论、私信说可不可以提供代码参考学习下,那必须是可以的。那篇文章主要介绍了数据采集、数据传输、数据转发、数据解析、数据存储、数据查询、数据呈现、数据导出、消息推送的物联网设备数据流程过程,作为体验 TDengine 的极简实战项目,没引入过多的业务设计(复杂功能)以及异步解耦设计(消息中间件)。 在整理代码的过程中,我发现虽然整个项目并不复杂,但是涉及到的技术点较多,有必要对关键的组件进行说明

Heartsuit的博客 9411

cursor AI代码编辑器IDE对接deepseek模型api;字节ai编辑器trae

参考: https://www.cursor.com/ https://platform.deepseek.com/https://www.cursor.com/下载安装后,注册账号登录即可 再高级里选择设置 再模型这注册模型: 模型名称一定要填正确,url地址填好,最后填上秘钥验证

weixin_42357472的博客 1万+

排序算法研究之希尔排序(shell sort)

前面几个小节,我们分别介绍了冒泡排序,插入排序,快速排序 选择排序本节,我们介绍插入排序的改进版的希尔排序。 希尔排序是1959年,Shell发明的,这是第一个突破O(n2)的排序算法,他与直接插入排序不同的是,他会优先比较距离较近的元素。因此,希尔排序又叫做缩小增量排序。 1、算法思想 首先,将待排序的序表分割成若干个形如L[i,i+d,i+2d,…… i+kd]的“特殊”子表,然后分别的进行直...

爱喝舒化奶的博客 2万+

【用unity实现100个游戏之7】实现一个类《杀戮尖塔》的卡牌回合制游戏(附项目源码)

【用unity实现100个游戏之7】实现一个类《杀戮尖塔》的卡牌回合制游戏(附项目源码)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1万+

排序算法-希尔排序(Shell Sort)

文章目录希尔排序法介绍希尔排序法算法时间复杂度其他排序法的比较 希尔排序法介绍 希尔排序法(Shell Sort)是D.L.Shell于1959年提出的一种排序算法,在这之前的排序算法如冒泡排序、简单选择排序、直接插入排序等算法的的时间复杂度都为O(n2)O(n^{2})O(n2),而希尔排序突破了这一时间复杂度。 【原理】 直接插入排序算法比冒泡排序和简单选择排序性能都要高,尤其在序列基本有序并...

白杨 2641

SAP B1中文培訓教材_SDK

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

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

排序算法—希尔排序

希尔排序 是插入排序的一种,它是针对直接插入排序算法的改进,由D.L.Shell于1959年提出而得名。 希尔排序基本思想把待排序的数列分为多个组,而后再对每个组进行插入排序,先让数列整体大致有序,然后多次调整分组方式,是数列更加有序,最后再舒勇一次插入排序,使整个数列将全部有序。 实例: 待排序的序列为 25,5, 14 ,39,6,31,23,18,9,1,11 。 共计11个数, 希尔排序是 首先将 11/2 取整为 5 -1 =4 。 就是每隔 4个元素 ,组成的...

初听不知曲中意,再听已是曲中人。 5281

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

排序算法(4)希尔排序(Shell Sort)

插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 4、希尔排序(Shell Sort) 1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。 4.1 算法描述 先将整...

cowbin2012的专栏 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

希尔排序(Shell Sort)是一种基于插入排序的高效排序算法,由Donald Shell于1959年提出

希尔排序(Shell Sort)是一种基于插入排序的高效排序算法,由Donald Shell于1959年提出。它通过将数组分成若干子序列,并对每个子序列进行插入排序,逐步缩小子序列的间隔,最终完成整个数组的排序。

[Blog][Domain] programb.blog.youkuaiyun.com 1134

shell中的排序算法

shell中的排序算法 冒泡排序法 类似旗袍上涌的动作,会将数据在数组中从小大大或者从大到小不断的向前移动。 基本思想: 冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部。 算法思路 冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中

weixin_44938203的博客 1950

排序算法java实现——Shell(希尔)排序

希尔排序一、基本思路二、算法分析三、代码实现 希尔排序是希尔(Donald Shell)1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的版本,也称为缩小增量排序。 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 1.插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。 2.但插入排序一般来说是低效的,因为插入排序每次只能将数据移...

猪奥奥的Blog 1050

排序算法——希尔排序(Shell排序)

前面我们学习了冒泡排序、选择排序、插入排序,不知道大家清楚没这三种算法原理没?如果还不太明白,可要抓紧时间理清楚咯!从这次我们将要学习新的算法啦!所以宝宝们要加油哦!!!(我们都是爱学习的小宝宝) ============================================================= Shell 排序算法严格来说基于插入排序的思想,其又称为希尔排序或者缩小增量排...

哈哈的博客 271

排序算法——希尔排序(shell排序)

一 希尔排序的原理 1.基本思想 基本思想希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。希尔排序是记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,这一遍恰好是直接插入排序,完成后算法便终止。 2.希尔排序的优劣 逆序有序的数组排序时,时间复杂度为O ( n 2 ) O(n^

2202_75617953的博客 883

详解初级排序算法(选择、插入、希尔shell)、归并、快速、堆

公共代码 (比较元素大小、将元素在数组中的位置进行交换、判断数组是否已经有序、打印数组) public static boolean less(Comparable v, Comparable w) { return v.compareTo(w) < 0; } public static void exch(Comparable[] a, int i, int j) { Comparable t = a[i]; a[i]

flow 1123

简单易懂排序算法(四)【希尔排序】

希尔排序是D.L.Shell于1959年提出来的一种排序算法,在这之前排序算法的时间复杂度基本都是O(n^2)的,希尔排序算法是突破这个时间复杂度的第一批算法之一。 希尔排序:是对直接插入排序进行的一种改进排序算法,采用跳跃分割的方法,将整个待排序列分割成若干个子序列,对这些子序列进行直接插入排序,使其得到的结果基本有序,然后再不断缩减分割的区间,使其完全有序 基本有序:就是小的关键字基本在前面...

小二笙的博客 1005

希尔排序(Shell Sort)-- 高级排序算法

1 希尔排序(Shell Sort) 1959年Shell发明,第一个突破O(n2)O(n^2)O(n2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。 算法描述 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,具体算法描述: 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1; 按增量序列个数k,对序列进行k 趟排序; 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子

OuDiShenmiss的博客 330

排序算法之四 希尔排序(Shell Sort)

概述 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。 希尔排序中包含了分而治之的思想,首先将一个输入序列根据增量分成若干个子序列,然后对每个子序列分别进...

Markus 566
上一篇: 1.2.2 hidehandkerchief(附翻译)
下一篇: 事务(transation)的知识点
zhen921
博客等级 码龄9年 58粉丝 51原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值