排序算法-----希尔排序

2023-11-14

目录

前言

希尔排序(shell)

排序原理

大致思路

示例

 代码实现(C语言)

算法分析

时间复杂度

空间复杂度

稳定性


前言

        前面我有一篇插入排序的详细的文章讲解(链接:排序算法-----插入排序(图文详解)_灰勒塔德的博客-CSDN博客)今天我们接着学习排序算法中的希尔排序(shell_sort),希尔排序跟插入排序是有一定关联的,可以这么说,希尔排序是对插入排序的再进一步优化,下面我们就开始学习吧!

希尔排序(shell)

        希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。

        希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。

排序原理

大致思路

        希尔排序是去通过设置一个分组区间gap,把一个初始的数组进行分组,然后对每一个小组里面的数组通过插入排序算法来去排序,这就是完成了一轮排序;然后再把区间gap缩小,再次以新的gap区间进行分组,然后按照以上的做法再次进行新的一轮排序;最后直到gap=1时候,这时候的数组就是一个整体了,就对这个整体的数组进行排序,最终结果就是排序完成后的数组了。(初始化的gap可以设置为任意数值,不会影响到最终结果的)

示例

给定一个初始数组[9,1,2,5,7,4,8,6,3,5],下面怎么去通过希尔排序来完成这个排序呢?

 第一步,先进行分组,此时设置区间gap为5,分组完成后进行初步排序,结果如下所示:

第一组:9        4   ——>4        9

第二组:1        8   ——>1        8

第三组:2        6   ——>2        6

第四组:5        3   ——>3        5

第五组:7        5   ——>5        7

此时新的数组为  [4,1,2,3,5,9,8,6,5,7]

 第二步,缩小gap,可以去通过整除去缩小,此时gap为2,再次分组排序,结果如下:

第一组:4        2        5        8        5——>2        4        5        5        8

第二组:1        3        9        6        7——>1        3        6        7        9

此时新的数组为  [2,1,4,3,5,6,5,7,8,9]

 第三步,此时gap再次缩小,为1,那么就只有一组了,也就是整个数组为一个整体去排序:

2 1 4 3 5 6 5 7 8 9——>1 2 3 4 5 5 6 7 8 9

此时排序完成。

图解如下: 

 代码实现(C语言)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
//希尔shell排序
void shell_sort(int* n,int length) {
	int i, j, gap;
	for (gap = length / 2; gap > 0;  gap /= 2) {
		for (i = 0; i < gap; i++) {
			for (j = i+gap; j < length; j += gap) {
				//以下对每一组进行插入排序
				int temp = n[j];
				int k = j - gap;
				if (n[j] < n[j - gap]) {
					while (k >= 0 && n[k] > temp) {
						n[k + gap]= n[k];
						k -= gap;
					}
					n[k + gap] = temp;
				}
			}
		}
	}
}

int main() {
	int array[10];
	srand((unsigned)time(0));
	for (int i = 0; i < 10; i++) {
		array[i] = rand() % 20;
	}
	for (int i = 0; i < sizeof(array) / sizeof(int); i++) {
		printf("%d ", array[i]);
	}
	printf("\n排序后:");
	shell_sort(array, sizeof(array) / sizeof(int));//希尔排序
	for (int i = 0; i < sizeof(array) / sizeof(int); i++) {
		printf("%d ", array[i]);
	}
}
//输出结果:
//3 9 17 4 5 18 13 14 12 15
//排序后:3 4 5 9 12 13 14 15 17 18

算法分析

时间复杂度

        增量序列的选择会极大地影响希尔排序的效率。 希尔排序时间复杂度非常难以分析,它的平均复杂度界于 O(n) 到 O(n^2) 之间,普遍认为它最好的时间复杂度为 O(n^1.3),相较于插入排序,时间复杂度降低了很多,尤其是当数组数量非常大的时候效果最明显,当然如果数组是完全逆序的话,那么时间复杂度就是O(n^2)。

空间复杂度

希尔排序没有涉及到空间的开辟等等,使用的空间是原数组的空间,所以空间复杂度是O(1) 

稳定性

 前面我们学习了插入排序知道,一次性的插入排序是稳定的,但是希尔排序是先分组然后再去插入排序,所以出现相同的元素的时候,元素的相对位置会发生改变,所以希尔排序是不稳定的

 好了,以上就是本期的全部内容了,我们下一期再见!!!

分享一张壁纸:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

排序算法-----希尔排序 的相关文章

随机推荐

  • 05智慧杆塔

    一张图读懂一个产业之智慧杆塔 智慧杆塔是综合承载多种设备和传感器并具备智慧能力的杆 塔等设施的总称 包括但不限于通信杆 塔 路灯杆和监控杆 智慧杆塔具备的功能由其挂载的设备和传感器决定 这些设备和传感器可通过各种通信技术接入网络和平台 并在
  • R语言实用教程薛毅清华出版社课后题答案

    有R语言实用教程薛毅课后题答案习题1 5 详情请到我的页面资源查看
  • NVMe Cli 使用教程 -- NVMe Read / Write 使用实践

    1 NVMe Write Write命令的官方说明 nvme write
  • C Primer Plus 第五章 编程练习

    第五章 编程练习 5 1 题 目 编写一个程序 把用分钟的时间转换用小时和分钟表示的时间 使用 define或者const创建一个表示60的符号常量或const变量 通过while循环让用户重复输入值 直到用户输入小于或者等于0 的值才停止
  • 网络安全工程师

    岗位职责 1 分析网络现状 对网络系统进行安全评估和安全加固 设计安全的网络解决方案 2 在出现网络攻击或安全事件时 提高服务 帮助用户恢复系统及调查取证 3 针对客户网络架构 建议合理 的网络安全解决方案 4 负责协调解决方案的客户化实施
  • CISSP-安全和风险管理

    俗话说什么是网络安全 那网络安全的基本原则有哪些呢 主要是有可用性 保密性 完整性 1 那什么是可用性 可用性的话 那就是在我们的数据和资源需要随时保持能够授权用户进行访问 用户想要访问想要用的时候 你就应该能用 而不是不能用 2 那什么是
  • Vijava 学习笔记之 DataStore(基础配置信息)

    vijava 代码 实体类 package com vmware pojo import java util ArrayList import java util Calendar 存储信息 author zhb public class
  • R语言实战笔记 基本统计分析-相关

    相关 相关系数可以用来描述定量变量之间的关系 将使用R基础安装中的state x77数据集 提供了美国50个州在1977年的人口 收入 文盲率 预期寿命 谋杀率和高中毕业率数据等 数据如下 相关的类型 Pearson Spearman和Ke
  • Markdown语法详解

    Markdown语法 标题 一级标题 一级标题 二级标题 二级标题 三级标题 三级标题 四级标题 四级标题 五级标题 五级标题 段落 前后空行超过一行 即为一个段落 标题 副标题 正文 表格 ID 用户名 昵称 1 root ROOT 2
  • Node 调试利器,前端、Node 开发必备 - VSCode JS Debug Terminal

    经常看到有同学抱怨 Node 调试麻烦或者是搞不清怎么调试各种脚本 Jest Webpack 等等 而偶尔看到的调试相关的文章又全都是在写 inspect launch json 这些方案 其实有一定学习成本 而其实在 VSCode 中早已
  • [OCCT] Open CASCADE Technology的编译(包含示例的编译)

    QQ交流群 604668232 OCCT知识库 yuque com softdev occt 持续更新 相关文档 官方文档 构建 调试和升级 官方文档 OCCT的构建 文章目录 源代码目录 编译源代码 方法一 使用官方提供的VS工程 方法二
  • 【AAAI-2019】论文整理(清单)

    AAAI 19 Accepted Papers Main Technical Track 整理自 AAAI官网 分类整理持续更新 详细文章可从arXiz org下载 CircConv A Structured Convolution wit
  • VSCode远程配置流程(详细图解)

    基本情况 基本需求 本地 Win10 系统下安装 VSCode 连接远程的服务器 Ubuntu 进行代码编写和调试 下载地址 vscode 图文安装流程 Remote SSH 远程插件 按照下图安装即可 安装完成后 弹出如下图中红色框内的控
  • VoTT使用教程

    VoTT是微软发布的用于图像目标检测的标注工具 它是基于javascript开发的 因此可以跨Windows Linux和Mac平台运行 并且支持从图片和视频读取标注 此外 其还提供了基于CNTK训练的faster rcnn模型进行自动标注
  • 如何查看本机 MySQL(DB)安装位置

    首先按住 win R 键 输入 services msc 找到正在运行的 MySQL 打开属性 之后就可以找到 文件路径了
  • 【八股】2023秋招八股复习笔记2(C++基础 & 操作系统)

    文章目录 1 内存深拷贝 代码 2 C 基础知识 虚函数了解吗 说一下static 关键字的作用 说一下C 和C 的区别 c 中四种强制 cast 转换 请说一下C C 中指针和引用的区别 请你说一下你理解的c 中的smart pointe
  • ESP32/ESP8266使用MicroPython控制DHT11/DHT22

    本教程介绍了如何使用MicroPython固件将DHT11或DHT22温度和湿度传感器与ESP32和ESP8266开发板一起使用 DHT模块 刷新MicroPython固件 要遵循本教程 您需要在ESP32或ESP8266板上安装Micro
  • 微信小程序开发入门——uni-app框架

    uni app Union Application 是一个基于Vue js的前端框架 开发规范借鉴了微信小程序 前端技能点 前后端分离 后端给接口和API文档 注重前端 用uni app框架 作用 创业团队可以更快的开发上线一个app 更容
  • 参数估计(Parameter Estimation):频率学派(最大似然估计MLE、最大后验估计MAP)与贝叶斯学派(贝叶斯估计BPE)

    基础 频率学派与贝叶斯学派 http www douban com group topic 16719644 http www zhihu com question 20587681 最大似然估计 Maximum likelihood es
  • 排序算法-----希尔排序

    目录 前言 希尔排序 shell 排序原理 大致思路 示例 代码实现 C语言 算法分析 时间复杂度 空间复杂度 稳定性 前言 前面我有一篇插入排序的详细的文章讲解 链接 排序算法 插入排序 图文详解 灰勒塔德的博客 CSDN博客 今天我们接