希尔排序的概念+实例

七大排序算法——希尔排序,通俗易懂的思路讲解与图解(完整Java代码) 本文介绍的是七大算法排序中的希尔排序,用大白话讲解,配有图解与完整代码(内含注释)。快进来轻松学会希尔排序。 阅读详情

一、基本概念

希尔排序:先追求表中部分有序,再逐渐逼近全局有序
具体步骤
先将待排序表分割成若干形如 L [ i , i + d , i + 2 d , . . . , i + k d ] L[i,i+d,i+2d,...,i+kd] L[i,i+d,i+2d,...,i+kd]的“特殊”子表,对各个子表分别进行直接插入排序。缩小增量d,重复上述过程,直到d=1为止。

二、算法图解

我们举一个例子方便理解:对如下Arr[]数组元素进行由小到大排序(运用希尔排序)
在这里插入图片描述
第一轮次: d 1 = n / 2 = 4 第一轮次:d_1=n/2=4 第一轮次:d1​=n/2=4
根据定义: L [ i , i + d , i + 2 d , . . . , i + k d ] L[i,i+d,i+2d,...,i+kd] L[i,i+d,i+2d,...,i+kd]的“特殊”子表
可以列出共有4个特殊子表

012345678
4938659776132749
子表14976
子表23813
子表36527
子表49749

在这里插入图片描述
76 > 49 ; 无需插入排序; i + + ; 76>49;\\无需插入排序;\\i++; 76>49;无需插入排序;i++;
在这里插入图片描述
13 < 38 ; 需插入排序; 将 13 暂存在 A r r [ 0 ] 13<38;\\需插入排序;\\将13暂存在Arr[0] 13<38;需插入排序;将13暂存在Arr[0]
对13进行插入排序,从后往前寻找Arr[x]<13且Arr[x+1]>13的临界点(即插入位置)
并将寻找过的元素向后顺延一位
在这里插入图片描述
j 指向 i − d j指向i-d j指向i−d
在这里插入图片描述
A r r [ j + d ] = A r r [ j ] Arr[j+d]=Arr[j] Arr[j+d]=Arr[j]
在这里插入图片描述
j < 0 ;退出循环; j<0;退出循环; j<0;退出循环;
在这里插入图片描述
令 A r r [ j + d ] = A r r [ 0 ] 令Arr[j+d]=Arr[0] 令Arr[j+d]=Arr[0]


第一轮排序完成后,得到如下

012345678
4913274976386597

第二轮次: d 2 = d 1 / 2 = 2 第二轮次:d_2=d_1/2=2 第二轮次:d2​=d1​/2=2
根据定义: L [ i , i + d , i + 2 d , . . . , i + k d ] L[i,i+d,i+2d,...,i+kd] L[i,i+d,i+2d,...,i+kd]的“特殊”子表
可以列出共有2个特殊子表

012345678
4913274976386597
子表149277665
子表213493897

在这里插入图片描述
27 < 49 ; 需插入排序; 将 27 暂存在 A r r [ 0 ] ; 27<49;\\需插入排序;\\将27暂存在Arr[0]; 27<49;需插入排序;将27暂存在Arr[0];
仅关于两个元素的交换,与第一轮类似,略。
在这里插入图片描述
无需插入排序; i + + ; 无需插入排序;i++; 无需插入排序;i++;
在这里插入图片描述
无需插入排序; i + + ; 无需插入排序;i++; 无需插入排序;i++;
在这里插入图片描述
A r r [ i ] < A r r [ i − d ] ; 需插入排序;将 38 暂存在 A r r [ 0 ] ; Arr[i]<Arr[i-d];\\需插入排序;将38暂存在Arr[0]; Arr[i]<Arr[i−d];需插入排序;将38暂存在Arr[0];
在这里插入图片描述
j指向i-d;从后往前寻找Arr[x]<38且Arr[x+1]>38的临界点(即插入位置);
并将寻找过的元素向后顺延一位
在这里插入图片描述
49 向后顺延; j − = d ; A r r [ j ] < A r r [ 0 ] ; 13 < 38 且 49 > 38 ;退出循环 49向后顺延;\\j-=d;\\ Arr[j]<Arr[0];\\13<38且49>38;退出循环 49向后顺延;j−=d;Arr[j]<Arr[0];13<38且49>38;退出循环
在这里插入图片描述
A r r [ j + d ] = A r r [ 0 ] Arr[j+d]=Arr[0] Arr[j+d]=Arr[0]
在这里插入图片描述
i + + j = i − d ; 65 < 76 ;将 65 暂存到 A r r [ 0 ] i++\\j=i-d;\\ 65<76;将65暂存到Arr[0]\\ i++j=i−d;65<76;将65暂存到Arr[0]
在这里插入图片描述
A r r [ j + d ] = A r r [ j ] Arr[j+d]=Arr[j] Arr[j+d]=Arr[j]
在这里插入图片描述
j − = 2 ; 49 < 65 且 76 > 65 ; 退出循环 j-=2;\\ 49<65且76>65;退出循环\\ j−=2;49<65且76>65;退出循环
在这里插入图片描述
A r r [ j + d ] = A r r [ 0 ] Arr[j+d]=Arr[0] Arr[j+d]=Arr[0]
i++,重复如上操作,直至i=8


第二轮排序完成后,得到如下

012345678
2713293865497697

d/=2,重复多个轮次,直至d=1

三、代码实现

void ShellSort(int Arr[], int length) {
	for (int d = length / 2; d >= 1; d /= 2) {
		for (int i = d + 1; i <= length; i++) {
			if (Arr[i] < Arr[i - d]) {
				Arr[0] = Arr[i];//Arr[0]暂存数据
				int j;
				//从后向前找临界点
				for (j = i - d; j > 0 && Arr[j] > Arr[0]; j -= d) {//Arr[j]>Arr[0]而不是Arr[i]。Arr[i]在变化
					Arr[j + d] = Arr[j];//向后顺延
				}
				//当Arr[j]<Arr[0]退出循环。Arr[j+d]=Arr[j+2d]>Arr[0]。在Arr[j]的下一个位置插入Arr[0]
				Arr[j + d] = Arr[0];
			}
		}
	}
}

四、实例

7-12 排序
分数 25
作者 陈越
单位 浙江大学
给定N个(长整型范围内的)整数,要求输出从小到大排序后的结果。

本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下:

数据1:只有1个元素;
数据2:11个不相同的整数,测试基本正确性;
数据3:103个随机整数;
数据4:104个随机整数;
数据5:105个随机整数;
数据6:105个顺序整数;
数据7:105个逆序整数;
数据8:105个基本有序的整数;
数据9:105个随机正整数,每个数字不超过1000。
输入格式:
输入第一行给出正整数N(≤10
5
),随后一行给出N个(长整型范围内的)整数,其间以空格分隔。

输出格式:
在一行中输出从小到大排序后的结果,数字间以1个空格分隔,行末不得有多余空格。

输入样例:

11
4 981 10 -17 0 -20 29 50 8 43 -5

输出样例:

-20 -17 -5 0 4 8 10 29 43 50 981

原题链接点这里

参考代码

#include<stdio.h>
void ShellSort(int Arr[], int length) {
	for (int d = length / 2; d >= 1; d /= 2) {
		for (int i = d + 1; i <= length; i++) {
			if (Arr[i] < Arr[i - d]) {
				Arr[0] = Arr[i];//Arr[0]暂存数据
				int j;
				//从后向前找临界点
				for (j = i - d; j > 0 && Arr[j] > Arr[0]; j -= d) {//Arr[j]>Arr[0]而不是Arr[i]。Arr[i]在变化
					Arr[j + d] = Arr[j];//向后顺延
				}
				//当Arr[j]<Arr[0]退出循环。Arr[j+d]=Arr[j+2d]>Arr[0]。在Arr[j]的下一个位置插入Arr[0]
				Arr[j + d] = Arr[0];
			}
		}
	}
}

int main() {
	int N;
	scanf("%d", &N);
	int Arr[N + 1];
	
	//输入数据
	for (int i = 1; i <= N; i++)
		scanf("%d", &Arr[i]);
		
	//希尔排序
	ShellSort(Arr, N);
	
	//打印排序后的数组
	for (int i = 1; i <= N; i++) {
		if (i != 1) {
			printf(" ");
		}
		printf("%d", Arr[i]);
	}
	return 0;
}

在这里插入图片描述

【数据结构】6个例题带你学会直接插入排序和希尔排序 6个例题带你学会直接插入排序和希尔排序 阅读详情

相关推荐

使用希尔排序法对一维数组进行排序

使用希尔排序法对一维数组进行排序,程序很好运行,帮助大家学习

数据结构与算法(14):希尔排序及其实例讲解

  在上一个关于算法的博客中我们谈到了插入排序,从时间复杂度来说确实会比冒泡好的太多,但是插入排序是会存在问题的,首先我们看下一个简单的插入排序,进行问题复现 举例:数组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}.我们最终会发现当需要插入的数

qq_42400763的博客 8161

博图HMI多语言文本列表一键生成攻略:从Excel模板到TIA Portal的完整流程

本文详细介绍了如何利用Excel模板和TIA Portal API实现博图HMI多语言文本列表的一键生成。通过标准化Excel模板设计、解析TIA Portal的XML结构,并结合C#代码实现自动化导入,大幅提升多语言项目的开发效率。特别适用于需要支持多语言版本的自动化设备HMI界面开发。

weixin_26934905的博客 218

希尔排序-示例

2、再将数组平分为(数组长度/2/2)组数据,每个组的每个数据分别与加上步长后的值进行比较,大的放后面,小的放前面。1、将一段数组,先平分为(数组长度/2)组数据,每个数组为两个,对比每组的数据,大的放后面,小的放前面。3、直到只有一组,再进行一次对比即可排序成功。

weixin_53568654的博客 318

(十)安卓开发中的Activity之间的通信使用详解

下面将结合代码和具体在 Android 开发中,Activity 之间的通信是非常常见且核心的功能之一使用场景,详细讲解这几种方式。

cuijiying的博客 1280

基于Android平台下的健康管理APP/基于android的健康管理系统

随着网络科技的发展,移动智能终端逐渐走进人们的视线,相关应用越来越广泛,并在人们的日常生活中扮演着越来越重要的角色。因此,关键应用程序的开发成为影响移动智能终端普及的重要因素,设计并开发实用、方便的应用程序具有重要的意义和良好的市场前景。Android技术作为当前最流行的操作平台,自然也存在着大量的应用服务需求。 本课题研究的是基于Android技术平台的健康管理APP,开发这款健康管理APP主要是为了帮助用户可以不用约束时间与地点进行所需信息。本文详细讲述了健康管理APP的界面设计及使用,主要包括界面的

m0_73706453的博客 1437

希尔排序原理

3、其实预排序的实现和直接插入排序的过程几乎是完全相似,前面也说了当希尔排序的缩小增量为1时,和插入排序没区别,也就是说,插入排序每次都对相邻的数据处理,而希尔排序是将分好的组看成新的数组,例如上面数据的6, 2, 3为一组,我们可以看成其他的数据不存在,只有这一组存在,那么对于这一组而言,希尔排序就是插入排序,将上图的三组都排完序,这一趟预排序就算完成了。2、已排序区数组元素加一,待排序区首元素变为3,end也变为3的下标,tmp记录此元素的值,将tmp与已排序区元素进行比较,首先与5比较,小于5。

欢迎来到阿熊的blog~~ 2271

WRF和WPS模型在Ubuntu系统上的安装与常见问题解决指南

本文详细介绍了在Ubuntu系统上安装WRF和WPS模型的完整教程,涵盖系统环境配置、依赖库安装、源代码编译以及常见问题的解决方案。重点解决了WPS编译中intmath.f文件的修改、环境变量设置和编译器兼容性等关键难点,帮助用户高效部署气象研究与预报模型。

weixin_29213525的博客 381

【数据结构】排序——希尔排序

前言本篇博客,我们继续介绍一种排序——希尔排序,上篇博客我们说了插入排序,了解了插入排序,那希尔排序又是什么那,我们一起来看看若有问题 评论区见📝。

m0_74091744的博客 793

美的集团-数据挖掘工程师面试分享

美的集团-数据挖掘工程师面试分享

510

Dify 本地插件安装失败?别慌,这篇教程手把手教你解决(解决 the plugin you want to install has a bad signature 报错的问题)

🤯dify安装本地插件报错 PluginDaemonBadRequestError: plugin verification has been enabled, and the plugin you want to install has a bad signature。的解决方案!

XiaoqiangClub的博客 3984

希尔排序详解

文章目录一、概念及说明二、使用说明1.时间复杂度2.空间复杂度3.算法特点4.动画演示三、代码演示 一、概念及说明 希尔排序-----插入排序的一种,属于优化后的插入排序 原理:把数组中的数据进行分组,在组内进行排序,没有排列好继续分组(注意改分组需要调整每个组元素的个数),每次排序都是在组内进行排序 例如数组中有15个元素为例,第一次分组为 15/2 =7-1=6 第二次分组为7/2=3-1=2 算出来的数为元素间隔数。 相比于插入排序的优点是:1.减少查找次数 2.减少元素移动的次数 二、.

weixin_51363326的博客 1413

深度剖析XY2-100与SL2-100协议:解锁激光打标核心技术密码

XY2-100和SL2-100是激光打标领域的两种核心控制协议。XY2-100协议采用串行通信,指令集简单,适合常规打标任务,具有成本优势;SL2-100协议支持更高速率(1Mbps以上),具备曲线插补等高级指令,在精密加工领域表现突出。两者的主要差异体现在数据传输(帧结构、速率)、指令集(功能、数量)、参数调节(范围、精度)和错误处理机制等方面。实际应用中,XY2-100适合简单图形的大批量生产,SL2-100更胜任复杂曲面的高精度加工。选择时需综合考虑打标需求、设备兼容性和成本因素,未来两种协议将持续优

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 957

希尔排序就这么简单

一、希尔排序介绍 来源百度百科: 希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。 从上面我们很容易看出来,它是插入排序的高级版 回顾一下插入排序: 将数据插入到已有序的数列中 排序前:将每个...

weixin_33815613的博客 253

Spark Sql 连接mysql

转载请务必注明原创地址为:http://dongkelun.com/2018/03/21/sparkMysql/ 1、基本概念和用法(摘自spark官方文档中文版) Spark SQL 还有一个能够使用 JDBC 从其他数据库读取数据的数据源。当使用 JDBC 访问其它数据库时,应该首选 JdbcRDD。这是因为结果是以数据框(DataFrame)返回的,且这样 Spark SQL操作轻松或便......

主要分享大数据相关的知识,如Spark、Hudi 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

希尔排序(C语言实现)

希尔排序(Shell Sort)又称缩小增量排序,因DL.Shell于1959年提出而得名。 假设有这样一个数组{5,8,9,2,6,3,5,1},要求按照从小到大排列,如果使用直接插入排序,要将数组最后的1移到最前面,对于一个小数组来说也许无关紧要,但是当数据多到一定程度时,这种方式显然是很耗费时间的。 由此引入希尔排序,基本思想是引入一个常量d来缩小增量。这里0 下面就一

_地才 2841

IEM模型,地表粗糙度模拟

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

排序算法之希尔排序

希尔排序又称缩小增量排序,因DL.Shell于1959年提出而得名。     希尔排序的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。 以n=10的一个数组    9, 3,  5, 7, 6, 1, 2, 4, 8, 10为例

GentlyCare的专栏 1267

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【数据结构与算法】【排序】希尔排序的代码实现

希尔排序是一种插入排序。 前提:数组元素a[0]用作哨兵或临时变量,a[1]~a[n]存放n个待排序的元素。 基本思想是:将待排序元素进行跳跃分割,对分割后的子序列分别进行简单插入排序;而后将跳跃分割的增量进行缩小,最后增量为1时完成排序。 代码实现: // Filename: shell_sort.c #include #include #include #inc

木名的专栏 903

算法给小码农插入排序洞天,希尔排序轮回

文章目录排序排序的概念及其运用排序的概念排序运用==来上京东====大学排名==常见的排序算法常见排序算法的实现插入排序基本思想==但是数组肯定不是有序的,所以我们得先让数组有序==先把打印数组给剥离出来插入排序希尔排序( 缩小增量排序 ) (反正希尔牛逼)希尔排序步骤==**单组多躺**====**多组插入**====**多组一锅炖(要是分组插麻烦我们也可以一锅炖)**====**多次预排序(gap > 1)+直接插入(gap == 1)**==测直接插入排序和希尔排序的性能(让你看看什么才叫希

diandengren的博客 5917

排序算法(四)- 希尔排序

一、希尔排序介绍 希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。 希尔排序实质上是一种分组插入方法。它的基本思想是:对于n个待排序的数列,取一个小于n的整数gap(gap被称为步长)将待排序元素分成若干个组子序列,所有距离为gap的倍数的记录放在同一个组中;然后,对各组内的元素进行直接插入排序

AnndyR的专栏 1393

排序_希尔排序

希尔排序类似插入排序,但是希尔排序是有间隔的,从代码中可以明显对比看出。希尔排序有三个标记值,一个是标记着临时数据,需要插入正确位置的数据,其每一次循环初始值都是outer指向的数值。另外两个是标记着需要比较的两个对象,outer和innner,outer的初始值是h,innner的初始值跟outer一样,跟插入不同的是innner的指针的移动是每隔h个往前移动,根据这个法则,只有当inner等于...

weixin_30635053的博客 123

插入排序-希尔排序

1、概念 希尔排序:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。 以n=10的一个数组49, 38, 65, 97, 26, 13, 27, 49, 55, 4为例 第一次 gap = 10 / 2 = 5 49 38 65 97 26 13 27 49 55 4 1

Flying snow 340

插入排序之希尔排序

希尔排序又称“缩小增量排序”。          它的基本思想是:先将整个待排记录序列分割成若干子序列分别进行直接插入排序,待整个序列中的记录”基本有序”时,(当增量为1时)再对记录进行一次直接插入排序。          可以看出希尔排序希尔排序是改进了的插入排序。 特点:          子序列的构成不是简单的”逐段分割”,而是将相隔某个”增量”的记录组成一个自序列。这使得希尔排序中

Woody891的专栏 1146

21天经典算法之希尔排序

在排序算法中,稳定性和效率是我们经常要考虑的问题。稳定性:稳定是指当两个相同的元素同时出现于某个序列之中,则经过一定的排序算法之后,两者在排序前后的相对位置不发生变化。复杂度分析:(1)时间复杂度:即从序列的初始状态到经过排序算法的变换移位等操作变到最终排序好的结果状态的过程所花费的时间度量。(2)空间复杂度:就是从序列的初始状态经过排序移位变换的过程一直到最终的状态所花费的空间开销。常见的排序算法。

2401_87112524的博客 453

算法学习之排序算法:希尔排序

希尔排序又称“缩小增量排序”,它的基本思想是:先将整个待排记录序列分割成若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对记录进行一次直接插入排序。       希尔排序的一个特点是:子序列的构成不是简单地“逐段分割”,而是将相隔某个“增量”的记录组成一个子序列。这就使得希尔排序中关键字较小的记录不是一步一步地往前挪动,而是一次按照“增量”的大小跳跃式地往前移,从而使

李冰-冰斌 1984
上一篇: PTA字符串关键字的散列映射【C++】
下一篇: PTA德才论【C++】
快苏排序OAO
博客等级 码龄5年 273粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

快苏排序OAO

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

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

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

打赏作者

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

抵扣说明:

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

余额充值