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

news2025/1/21 0:49:42

目录

前言

希尔排序(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) 

稳定性

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

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

分享一张壁纸:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1007414.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

⑧ 嵌套路由配置

这种就是路由嵌套 在index.js中加上三级页面 引入到二级导航里面 增加重定向配置 三级页面默认显示第一个页面信息 在这里插入图片描述

GNN动态顺序推荐Dynamic Graph Neural Networks for Sequential Recommendation

Dynamic Graph Neural Networks for Sequential Recommendation 文章目录 1. 背景2. 模型2.1 动态图构造2.2 子图采样2.3 动态图推荐网络2.3.1 消息传播机制2.3.2 Node updating 2.4 推荐和优化 1. 背景 协同过滤没有考虑用户商品交互的序列演变&#xff1b; 已经有一些RNN…

vue3项目中关于二进制导出(下载)txt ,适应于其他格式

<el-button type"info" click"exportClick" size"default">导出</el-button> 接口方法&#xff1a;getExportList import { tmUseDictApi } from //api/dict; const getExportList tmUseDictApi().getExportList //初始化数据 …

React 全栈体系(五)

第三章&#xff1a;React 应用(基于 React 脚手架) 一、使用 create-react-app 创建 react 应用 1. react 脚手架 xxx 脚手架: 用来帮助程序员快速创建一个基于 xxx 库的模板项目 包含了所有需要的配置&#xff08;语法检查、jsx 编译、devServer…&#xff09;下载好了所有…

【笔试强训选择题】Day42.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&#xff…

深入理解JVM虚拟机第四篇:一些常用的JVM虚拟机(一)

一&#xff1a;Sun Classic VM虚拟机 早在1996年Java1.0版本的时候&#xff0c;Sun公司发布了一款名为Sun classic VM的Java虚拟机&#xff0c;它同时也是世界上第一款商用Java虚拟机&#xff0c;JDK1.4时完全被淘汰。 现在hotspot内置了此虚拟机。 这款虚拟机内部只提供解释器…

深入了解接口测试:Postman 接口测试指南

在现代软件开发生命周期中&#xff0c;接口测试是一个至关重要的部分。使用 Postman 这一工具&#xff0c;可以轻松地进行 接口测试。以下是一份简单的使用教程&#xff0c;帮助你快速上手。 安装 Postman 首先&#xff0c;你需要在电脑上安装 Postman。你可以从官网上下载并…

玩转堆排序以及Topk问题——【数据结构】

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 目录 堆排序 建堆 建堆的时间复杂度 Topk问题 学习了二叉树以及堆&#xff0c;今天我们来学习一下什么是堆排序以及经典二叉树问题——topk问题。 在学习开始我们先来回顾一下上篇博客中我们提到的堆&#xff0c;…

TypeScript函数详解

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 函数声明 函数表达式 可选参数和默认参数 剩余参数&#xff08;Rest Parameters&#xff09; this和箭头函数 …

chato.cn: 定制专属AI聊天助理机器人工具网站

【 产品介绍】 • 名称 chato.cn • 具体描述 chato.cn的核心功能是让用户能够输入一些知识或信息&#xff0c;让机器人学习和理解&#xff0c;然后与之进行对话&#xff0c;查看其回答的质量和逻辑性。还提供了多种语言、主题、风格和规则的选项&#xff0c;让用户能够根据自己…

天地图WMTS地图瓦片下载

最近在开发个人项目中遇到了这样一个问题&#xff0c;即&#xff1a;本地开发使用天地图在线地图服务&#xff0c;部署到线上时&#xff0c;突然想到——天地图提供的开放地图服务是需要申请秘钥key才能够使用的&#xff0c;而且需要连接外网&#xff0c;同时也是有访问次数限制…

八、MySql表的复合查询

文章目录 一、基本查询回顾二、多表查询&#xff08;一&#xff09;笛卡尔积的初步过滤&#xff08;二&#xff09;例子1.显示部门号为10的部门名&#xff0c;员工名和工资2.显示各个员工的姓名&#xff0c;工资&#xff0c;及工资级别 三、自连接&#xff08;一&#xff09;定…

基于SSM的校园快递一站式服务系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Consensus-AI论文搜索引擎 直接从论文中找答案

Consensus介绍 Consensus是一个人工智能AI论文搜索引擎&#xff0c;一个可以在科学论文中找到答案的搜索引擎&#xff0c;使用人工智能从数亿篇科学论文数据库中即时提取和聚合易于使用&#xff0c;搜索结果在几秒内即可完成&#xff0c;而且100%无广告。 截图 提示&#xf…

朋友圈大佬都去读研了,这份备考书单我码住了

作者简介&#xff1a; 辭七七&#xff0c;目前大二&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

Golang 单元测试合集整理,(我最常用 gomonkey)欢迎收藏

无论写什么样的语言&#xff0c;单元测试都是必不可少的&#xff0c;它可以极大的提高我们的代码质量&#xff0c;减少各种低级错误和 bug 无论你是一个靠谱合格的码农&#xff0c;还是一个优秀的程序员&#xff0c;单元测试都是咱们必须落实的一环 单元测试比较容易&#xf…

python:使用RESTful API(flask)调用python程序传递参数,实现Web端调用python程序

问题描述 现有一个用python写的程序&#xff08;或者是一个或几个的函数接口&#xff09;&#xff0c;需要在Web前端调用python写的函数。如果直接用前端java来调用会很不方便&#xff0c;而且会出现各种麻烦的问题&#xff0c;下面给出如何在web前端调用python的接口。 解决…

STM32WB55开发(2)----修改蓝牙地址

STM32WB55开发----2.修改蓝牙地址 概述硬件准备视频教学样品申请完整代码下载选择芯片型号配置时钟源配置时钟树RTC时钟配置查看开启STM32_WPAN条件配置HSEM配置IPCC配置RTC启动RF开启蓝牙设置工程信息工程文件设置修改置BLE设备公共地址Ble_Hci_Gap_Gatt_Init结果演示 概述 在…

更多场景、更多选择,Milvus 新消息队列 NATS 了解一下

在 Milvus 的云原生架构中&#xff0c;消息队列&#xff08;Log Broker&#xff09;可谓任重道远&#xff0c;它不仅要具备流式数据持久性、支持 TT 同步、事件通知等能力&#xff0c;还要确保工作节点从系统崩溃中恢复时增量数据的完整性。 在 Milvus 的架构中&#xff0c;一切…

【计算机视觉 | 语义分割】干货:语义分割常见算法介绍合集(一)

文章目录 一、U-Net二、Fully Convolutional Network三、SegNet四、DeepLab五、DeepLabv3六、UNet七、PSPNet八、EfficientDet九、SegFormer十、ENet 一、U-Net U-Net 是一种语义分割架构。 它由收缩路径和扩张路径组成。 收缩路径遵循卷积网络的典型架构。 它由两个 3x3 卷积…