【排序算法】—— 希尔排序

news2024/11/24 4:54:48

目录

一、希尔排序原理

二、希尔排序的思路

三、希尔排序为什么快

四、如何取增量

五、源码


        希尔排序是简单插入排序的一种升级版,它也是用了插入的思想,而插入排序相比冒泡排序和选择排序的效率要高的多,再将它优化为希尔排序后效率跟原来根本就不在一个级别。接下来我们就一起来学习一下希尔排序

一、希尔排序原理

        希尔排序的原理是插入排序,接下来先讲一下简单插入排序

简单插入排序原理:

        首先假设第一个元素就是一个小数组并且是有序的,然后把第二个元素当做新加入的元素,依次往前遍历把它放在合适的位置保持小数组有序,同理把第三个元素当做新加入的元素,依次往前遍历把它放在合适的位置保持前面的小数组有序,依次重复下去直到把大数组的最后一个元素给放置好,这有点像高等代数里的基底扩充定理,从一个小的空间覆盖到整个大的空间。

动态图:

//简单插入排序
void InsertSort(int* a, int sz)
{
	for (int i = 0; i < sz - 1; i++)
	{
		int j = i, tmp = a[i + 1];
		while (j >= 0 && tmp < a[j])
		{
			a[j + 1] = a[j--];
		}
		a[j + 1] = tmp;
	}
}

        如果一个数组储存数据是顺序有序的时候效率是最高的时间复杂度为O(n)

        有的时候该排序遇到一些极端的情况还是比较低效的,比如需要将一组数组进行升序排序,如果这组数据恰好是降序(即逆有序)的话就会很麻烦时间复杂度O(N^2),它需要将新元素前面的所有数据都遍历完。为了解决类似的问题就引入了希尔排序。

二、希尔排序的思路

        希尔排序的原理还是插入排序,就是在做简单插入排序之前做一下预处排序,

        先把数据分组,如上图分为(1),(2),(3)三组,然后分别对这三组进行简单插入排序,这是一次预排序。

        那么这三组是如何分出来的呢?主要是涉及到一个增量的问题,如上图的增量是3,在取第(1)组元素时每隔3个元素取一次,第(2)第(3)组同样,直到把每个元素都取到。

       拍完上面三组后继续减小增量分组进行简单插入排序,比如排完以3为增量的三组后,再把增量变为2分为二组,最后当增量为1的时候相当于对整个大组做了一个简单插入排序,排完这一趟后这个数组就有序了,希尔排序结束。

三、希尔排序为什么快

        简单插入排序的时间复杂度为O(N^2),而希尔排序的时间复杂度大概为O(N^1.3),当然这还与如何取增量有关。 

        希尔排序确实比之前的简单插入排序所排的组数要多,因为简单插入排序相当于只排了一组,那么它为什么还那么快呢? 

        因为它大大的减少了数据挪动次数,在做预排序的时候它是以增量的跨度去挪动的,这就使一个数据更快的接近它的准确位置(也就是排序后它该在的位置)。

四、如何取增量

        希尔排序的核心就在于通过设定不同的增量序列来优化插入排序的性能。增量序列的选择对排序速度有显著影响。一般来说,增量序列的选择涉及多种策略,而最佳的增量序列并没有一个固定的标准。比较常用效果比较好的增量设定为size/3+1。size为数组长度。

五、源码

#include<stdio.h>
//单组排
void ShellSort1(int* a, int sz)//(一组排完再排另一组)
{
	int gap = sz;//增量
	while (gap > 1)
	{
		gap = gap / 3 + 1;
		for (int i = 0; i < gap; i++)
		{
			for (int j = i; j < sz - gap; j += gap)
			{
				int m = j;
				int tmp = a[j + gap];
				while (m >= 0 && tmp < a[m])
				{
					a[m + gap] = a[m];
					m -= gap;
				}
				a[m + gap] = tmp;
			}
		}
	}
}
//多组一起排
void ShellSort2(int* a, int sz)
{
	int gap = sz;//增量
	while (gap > 1)
	{
		gap = gap / 3 + 1;
		for (int i = 0; i < sz - gap; i++)
		{
			int j = i;
			int tmp = a[i + gap];
			while (j >= 0 && tmp < a[j])
			{
				a[j + gap] = a[j];
				j -= gap;
			}
			a[j + gap] = tmp;
		}
	}
}
int main()
{
	int arr[] = { 8,3,4,9,2,6,5,7,1,10 };
	int size = sizeof(arr) / sizeof(int);
	ShellSort1(arr, size);
	for (int i = 0; i < size; i++)
		printf("%d ", arr[i]);
	return 0;
}

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

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

相关文章

有哪些好用的骨传导耳机是值得推荐的?五款非常好用的骨传导耳机推荐!

作为一个数码博主&#xff0c;我以前接触过很多种不同型号的骨传导耳机产品&#xff0c;骨传导耳机在传输声音时不直接经过内耳膜和外耳道&#xff0c;而是通过振动骨骼来传导声音&#xff0c;说明我们的耳朵是开放式的状态&#xff0c;时刻耳道保持清爽&#xff0c;可以避免耳…

前端基础——自学习梳理

超文本协议HTML <!DOCTYPE HTML> <html><head><meta charset"utf-8"> <style> /*Css*/.sty1{height:100px;width:100px;background-color: red;margin-top: 10px;float:left;margin-left: 10px;box-shadow: 10px 10px 10px #0000…

uni微信小程序使用lottie

在uni插件市场找到 lottie-uni https://ext.dcloud.net.cn/plugin?id1044按照文档要求安装 HBuilderX 引入 下载或导入示例获取插件 import lottie from /common/lottie-miniprogram.jsindex.vue <template><uni-popupref"popup"type"center"ba…

C++ | Leetcode C++题解之第172题阶乘后的零

题目&#xff1a; 题解&#xff1a; class Solution { public:int trailingZeroes(int n) {int ans 0;while (n) {n / 5;ans n;}return ans;} };

高考填报志愿策略 做好这几个步骤很重要

怎么填报合适的院校&#xff0c;怎么填报合适的专业&#xff0c;有时候比考试的分数还要重要&#xff0c;所谓“7分考&#xff0c;3分报”&#xff0c;要避免高分第就&#xff0c;那就得理清头绪&#xff0c;一起来了解一下高考填报志愿策略吧。 第1步从了解分数的基础上来了解…

MySQL锁、加锁机制(超详细)—— 锁分类、全局锁、共享锁、排他锁;表锁、元数据锁、意向锁;行锁、间隙锁、临键锁;乐观锁、悲观锁

文章目录 一、概述1.1 MySQL锁的由来1.2 锁定义1.3 锁分类 二、共享锁与排他锁2.1 共享锁&#xff08;S锁&#xff09;2.2 排他锁&#xff08;X锁&#xff09;2.3 MySQL锁的释放 三、全局锁3.1 介绍3.2 语法3.3 特点 四、表级锁4.1 介绍4.2 表锁4.3 元数据锁&#xff08;Meta D…

【资料集】软件全过程性资料整理(立项、标书、实施、研发、运维、结项、验收、合同、评审、测试、安全、方案)

资料获取&#xff1a;本文末个人名片直接获取。 在软件建设的过程中&#xff0c;会涉及多个阶段和相应的文档。以下是一个清晰的软件建设全文档列表&#xff0c;涵盖了从项目启动到交付维护的各个阶段&#xff1a; 1. 立项与可行性分析阶段 《项目建议书》&#xff1a;描述项…

【思科】IPv6 过渡技术 - MPLS(6PE)隧道

【思科】IPv6 过渡技术 - MPLS&#xff08;6PE&#xff09;隧道 实验要求实现思路注意点配置R1基础配置OSPFv3 局域网可达 R2基础配置局域网环境(OSPFv3)&#xff1a;IPv6 网络MP-BGPMPLS R3基础配置MPLS R4基础配置局域网环境(OSPFv3)&#xff1a;IPv6 网络MP-BGPMPLS R5基础配…

可视化大屏加上3D效果,那真是如虎添翼呀。

将可视化大屏与3D效果相结合可以进一步提升其视觉冲击力和信息展示效果&#xff0c;为用户带来更加生动、直观的体验。 以下是一些可以实现的3D效果&#xff1a; 1.3D建筑模型&#xff1a; 通过3D技术展示楼宇的立体建筑模型&#xff0c;可以让用户更加直观地了解楼宇的结构和…

小程序必看——强制安装https证书

微信小程序自2017年起强制要求所有网络请求必须通过HTTPS协议进行&#xff0c;这是为了提升网络安全性和用户数据保护的一项重要举措。 1、安全要求&#xff1a;为了提升网络安全性及保护用户数据&#xff0c;微信小程序要求所有服务端通信必须通过HTTPS协议进行。这意味着&…

比较LlamaIndex和LangChain,选择适合的大模型RAG框架

大家好&#xff0c;大型语言模型&#xff08;LLMs&#xff09;正引领人工智能技术的创新浪潮。自从OpenAI推出ChatGPT&#xff0c;企业、开发者纷纷寻求定制化的AI解决方案&#xff0c;从而催生了对开发和管理这些模型的工具和框架的巨大需求。 LlamaIndex和LangChain作为两大…

【Hadoop集群搭建】实验2:客户机操作系统CentOS的配置

1. 配置hadoop100 在finalshell中连接hadoop100 1.1 在CentOS7中配置静态ip vim /etc/sysconfig/network-scripts/ifcfg-ens33 将bootproto改成static&#xff0c;即ip地址改为静态&#xff0c;并添加刚才配置ip地址、网关和域名解析器。 1.2 将虚拟机名称改成hadoop100 编辑/…

「2024中国数据要素产业图谱1.0版」重磅发布,景联文科技凭借高质量数据采集服务入选!

近日&#xff0c;景联文科技入选数据猿和上海大数据联盟发布的《2024中国数据要素产业图谱1.0版》数据采集服务板块。 景联文科技是专业数据服务公司&#xff0c;提供从数据采集、清洗、标注的全流程数据解决方案&#xff0c;协助人工智能企业解决整个AI链条中数据采集和数据标…

IDEA 2024.01版本 git分支merge合并

使用idea工具来进行merge合并 1、拉取远端分支信息 2、我的分支是sprint-240627,我要将test分支合并到我这个分支上 找到test分支 3、选择【Merge origin/test into sprint-240627】 从test合并到我们要合并得分支上&#xff0c;结束 4、如果有冲突&#xff0c;就解决冲突即可…

【机器学习】ChatTTS:开源文本转语音(text-to-speech)大模型天花板

目录 一、引言 二、TTS&#xff08;text-to-speech&#xff09;模型原理 2.1 VITS 模型架构 2.2 VITS 模型训练 2.3 VITS 模型推理 三、ChatTTS 模型实战 3.1 ChatTTS 简介 3.2 ChatTTS 亮点 3.3 ChatTTS 数据集 3.4 ChatTTS 部署 3.4.1 创建conda环境 3.4.2 拉取源…

iptables(9)网络防火墙

简介 我们在第一篇介绍iptables的时候提到过,iptables是一个包过滤防火墙,那么防火墙是怎么分类的呢?都有哪些防火墙?下面我们先简单介绍下防火墙的分类: 按部署位置分类 网络层防火墙(网络边界防火墙):位于网络边界处,监控网络流量进出。主机防火墙:安装在单…

discuz迪恩cul!教育课程培训网站模板

Discuz x3.2模板 迪恩cul!教育课程培训 GBK&#xff0c;程序包中内附详细的安装教程&#xff0c;下载后按照教程安装即可 discuz迪恩cul!教育课程培训网站模板

区块链革命:Web3引领数字资产的全新篇章

随着区块链技术的发展和Web3的兴起&#xff0c;数字资产正迎来一场革命性的变革。本文将深入探讨区块链如何引领数字资产进入全新篇章&#xff0c;其背后的技术原理、应用场景以及对未来的深远影响。 ​1. 区块链技术的基础概念 区块链是一种去中心化的分布式账本技术&#xf…

【性能优化】Android冷启动优化

文章目录 常见现象APP的启动流程计算启动时间Displayed Timeadb dump 启动优化具体策略总结参考链接 常见现象 各种第三方工具初始化和大量业务逻辑初始化&#xff0c;影响启动时间&#xff0c;导致应用启动延迟、卡顿等现象 APP的启动流程 加载和启动应用程序&#xff1b; …

Pytorch之视频流猫狗识别

1. 导入资源包 // An highlighted block var foo bar;注&#xff1a; 1. import cv2: 导入OpenCV库&#xff0c;这是一个非常强大的计算机视觉库&#xff0c;用于处理图像和视频数据。 2. import tkinter as tk: 导入Tkinter库&#xff0c;这是Python的标准GUI库&#xff0c;…