希尔排序——C语言

news2024/9/20 5:59:35

希尔排序是插入排序的一种更高效的改进版本。希尔排序通过比较相距一定间隔的元素来进行排序,随着算法的进行,这个间隔逐渐减少,直到最后变为1,此时的排序其实就是一次插入排序。

希尔排序和插入排序的区别是希尔排序是插入排序的分组进行,假设我们现在的步长是4,那么7和5一组,8和2一组,1和3一组,4和6一组,先在每一组中进行插入排序,如下:

接着缩短步长,步长变为4,扩大数组,然后继续进行插入排序

结果如下: 

最后在进行步长为1的插入排序。

那么该如何实现分组进行插入排序呢,首先我们先来看一下上篇文章直接插入排序是如何进行的:

void InsertSort(int *array,int size) {
	for (int i = 0; i < size - 1; i++) {
		int end = i;
		int tmp = array[end + 1];
		while (end >= 0)
		{	
			if (tmp < array[end]) {
				array[end + 1] = array[end];
				end--;
			}
			else {
				break;
			}
		}
		array[end + 1] = tmp;
	}
}

说是直接插入排序,我们也可以理解为是步长为1 的希尔排序,那么在哪里更改步长呢?
我们只需要把需要插入的节点改为 array[end+gap],end=end-gap;这意味着我们要以gap为步长进行插入操作,修改如下:

这里我们先把gap步长定义为4,i < size - gap 意味着在这之后不能满足一整个步长大小了,说明已经全部分好组。

void ShellSort(int* array, int size,int gap) {
		gap = 4 ;
		for (int i = 0; i < size - gap; i++) {
			int end = i;
			int tmp = array[end + gap];
			while (end >= 0)
			{
				if (tmp < array[end]) {
					array[end + gap] = array[end];
					end = end - gap;
				}
				else {
					break;
				}

			}
			array[end + gap] = tmp;
		}
}

运行之后的结果:

对比之前步长为4的数组,可以发现我们分组的数已经完成了插入排序。

那么我们如何让步长进行缩小呢? 我们可以将分组插入排序放进while循环中,每次gap除以2,假设我们传入的初始gap是4,这样就可以保证第一次是以4为步长,第二次以2为步长,最后跳出循环。

最终函数:

void ShellSort(int* array, int size,int gap) {
	while (gap > 0) {
		for (int i = 0; i < size - gap; i++) {
			int end = i;
			int tmp = array[end + gap];
			while (end >= 0)
			{
				if (tmp < array[end]) {
					array[end + gap] = array[end];
					end = end - gap;
				}
				else {
					break;
				}
			}
			array[end + gap] = tmp;
		}
		gap = gap / 2;
	}
}

这就是文章的全部内容了,希望对你有所帮助,如有错误欢迎指出。

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

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

相关文章

【C++】入门基础(命名空间、缺省参数、函数重载)

目录 一.命名空间&#xff1a;namespace 1.namespace的价值 2.namespace的定义 3.namespace的使用方法 3.1 域解析运算符:: 3.2 using展开 3.3 using域解析运算符 二.输入输出 三.缺省参数 四.函数重载 1.参数类型不同 2.参数个数不同 3.参数顺序不同 一.命名空间&…

员工的离职成本到底有多高?

员工的离职成本到底有多高? 少有公司意识到离职率这个问题,表面上是员工主动提辞的,所以企业常常将离职率归罪于员工。 可以用“铁打的营盘,流水的兵”来概括离职率。 90/00后高频离职原因,企业揣着明白装糊涂 知乎上常常看到关于抱怨90/00后任性离职的问题,我说这是…

【python数据结构精讲】双端队列

通过总结《流畅的Python》等书中的知识&#xff0c;总结Python中常用工具的方法。 deque&#xff0c;学名双端队列。 1. 常用方法 append()&#xff1a;队列尾部添加appendleft()&#xff1a;队首添加pop()&#xff1a;移除队列最后一个元素popleft()&#xff1a;移除队列第一…

聊聊接入Arbitrum的正确姿势

本文首发于公众号&#xff1a;Keegan小钢 前言 我们知道&#xff0c;目前最主流的 Ethereum Layer2 方案中&#xff0c;主要有 Optimistic Rollup 和 ZK Rollup 两大类。而 Optimistic Rollup 的实现方案中&#xff0c;则是 Optimism 和 Arbitrum 最受关注。而我们最近接入了 …

ONLYOFFICE最新8.1版本新功能解析

ONLYOFFICE最新8.1版本新功能解析 书接上文&#xff1a; 深度解析 ONLYOFFICE 协作空间 2.5 版本新功能https://blog.csdn.net/VincentYoung/article/details/139665603?spm1001.2014.3001.5502 讲解了ONLYOFFICE协作空间今年最新升级的2.5版本的新功能&#xff0c;这里继续…

《代理选择与反爬虫策略探究:如何优化网络爬虫效率与稳定性》

代理IP如何选以及常见反爬策略 为什么需要代理&#xff1f; 因为有的网站会封IP&#xff0c;用户如果没有登录&#xff0c;那IP就是身份标识&#xff0c;如果网站发现用户行为异常就非常可能封IP 什么是代理IP 就是让一个人帮你转交请求&#xff0c;帮你转交的人对面不熟&a…

简单的SQL字符型注入

目录 注入类型 判断字段数 确定回显点 查找数据库名 查找数据库表名 查询字段名 获取想要的数据 以sqli-labs靶场上的简单SQL注入为例 注入类型 判断是数字类型还是字符类型 常见的闭合方式 ?id1、?id1"、?id1)、?id1")等&#xff0c;大多都是单引号…

DEBUG:电脑突然无法联网

问题 mqtt启动时候开启了本地代理 解决 关闭本地的代理

生物素标记降钙素Biotin-α-CGRP, rat 中间体

生物素标记降钙素Biotin-α-CGRP, rat 中间体是一种特定的生物化学试剂&#xff0c;主要用于科学研究领域。以下是对该产品的详细介绍&#xff1a; 一、基本信息 产品名称&#xff1a;生物素标记降钙素Biotin-α-CGRP, rat 中间体 英文名称&#xff1a;Biotin-α-CGRP, rat 纯度…

对接企业微信API自建应用配置企业可信IP

前言 为了实现系统调用团队会议功能&#xff0c;组织发起企业微信会议&#xff0c;于是需要和企业微信做API对接。对接过程很难受&#xff0c;文档不清晰、没有SDK、没有技术支持甚至文档报文和实际接口报文都不匹配&#xff0c;只能说企业微信的API是从业以来见过的最难用的AP…

使用 Python OpenCV 创建图像到卡通转换器

https://pyseek.com/2022/07/image-to-cartoon-converter-in-python/ 一、说明 你有没有试过把自己的照片转换成卡通画&#xff1f;顺便说一句&#xff0c;这不是开玩笑。很多人喜欢把他们的照片变成卡通画并在社交媒体上分享。就连我自己也多次尝试过这种技术。有很多在线工具…

vue实现a-model弹窗拖拽移动

通过自定义拖拽指令实现 实现效果 拖动顶部&#xff0c;可对整个弹窗实施拖拽&#xff08;如果需要拖动底部、中间内容实现拖拽&#xff0c;把下面的ant-modal-header对应改掉就行&#xff09; 代码实现 编写自定义指令 新建一个ts / js文件&#xff0c;用ts举例 import V…

《财经日报》︱揭秘随身WiFi市场乱象与格行的破局之路 格行如何树立行业清流新标杆? 随身WiFi真的靠谱吗?

在移动互联网高速发展的今天&#xff0c;随身WiFi以其便捷性和高性价比迅速成为市场宠儿。然而&#xff0c;随着行业的迅速扩张&#xff0c;一系列乱象与套路也逐渐浮出水面&#xff1a;从虚假宣传到限速虚量&#xff0c;随身WiFi行业中的种种套路让消费者防不胜防。商家利用信…

Redis 的强大之处:为何它成为开发者的首选?

Redis 的强大之处&#xff1a;为何它成为开发者的首选&#xff1f; 1. 速度极快2. 数据类型多样3. 事务支持4. 特性丰富5、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; Redis&#xff0c;作为开源的内存数据结构存储系统&#xff0c…

AI办公自动化:相似照片批量智能删除

电脑中有大量手机照片&#xff0c;要批量删除其中相似度高的&#xff0c;首先得有一个分析照片相似度的算法和模型。CLIP&#xff08;Contrastive Language-Image Pre-Training&#xff09;模型是由OpenAI在2021年发布的一种多模态预训练神经网络&#xff0c;旨在通过对比学习方…

揭秘!MySQL索引背后的秘密武器:B+树为何力压跳表,独领风骚?

引出 想象一下&#xff0c;你正在一家巨大的图书馆工作&#xff0c;这里藏书百万册&#xff0c;读者络绎不绝&#xff0c;每个人都想尽快找到他们想要的书籍。图书馆的布局有两种设计方案摆在你面前&#xff1a; 方案A&#xff1a;使用传统的目录卡片系统&#xff0c;就像老式…

循环结构(一)——for语句【互三互三】

文章目录 &#x1f341; 引言 &#x1f341; 一、语句格式 &#x1f341; 二、语句执行过程 &#x1f341; 三、语句格式举例 &#x1f341;四、例题 &#x1f449;【例1】 &#x1f680;示例代码: &#x1f449;【例2】 【方法1】 &#x1f680;示例代码: 【方法2】…

无人机运营合格证及无人机服务资质认证详解

一、运营合格证 无人机运营合格证是无人机运营单位或个人在特定区域内从事无人机运营活动的法定凭证。该证书由相关部门根据无人机运营单位的资质、技术能力和管理水平等综合因素进行审批和颁发。获得运营合格证的单位或个人需严格遵守国家相关法规和规定&#xff0c;确保无人…

3-2 多层感知机的从零开始实现

import torch from torch import nn from d2l import torch as d2lbatch_size 256 # 批量大小为256 train_iter, test_iter d2l.load_data_fashion_mnist(batch_size) # load进来训练集和测试集初始化模型参数 回想一下&#xff0c;Fashion-MNIST中的每个图像由 28 28 784…

【考研408操作系统】最容易理解的知识体系-文件管理-面向计算机管理

苏泽 “弃工从研”的路上很孤独&#xff0c;于是我记下了些许笔记相伴&#xff0c;希望能够帮助到大家 本篇内容续写上一篇的【考研408&操作系统】最容易理解的知识体系-文件管理-面向人类管理 这一篇将站在计算机如何管理好文件的角度去梳理这一章节的知识点 目录 本…