希尔排序及其时间复杂度(图文详解)

news2024/11/16 7:55:29

😾 博客主页: 爱吃bug的猿
🚀博客专栏: 数据结构,C语言初阶进阶全流程讲解
😽😽😽如果喜欢博主的文章,可以给博主点波赞和关注加速博主更新

文章目录

    • 前言
    • 1. 代码思路
    • 代码实现法1
    • 代码实现法2(不想用tmp变量可以不用)
    • 代码实现法3(从三层循环变为两层循环)
    • 希尔排序的时间复杂度(O(n^1.3))

前言

  • 希尔排序里的一部分和插入排序极其相似,了解插入排序及其复杂度(动图讲解)可点击此处
  • 希尔排序分为两部分:预排序+插入排序

1. 代码思路

  1. 选定一个整数作为增量gap,假设gap为3,则间隔为3的元素为一组,总计gap组
    在这里插入图片描述
  2. 接着对第一组(黑色)进行插入排序,第一组排完排第二组(蓝色),最后排第三组(黑色)
  3. gap == 3 排序结果如下
    在这里插入图片描述
  4. gap要减小(因为gap最终要减小为1,即增量为1的插入排序,经过这次排序后,才能保证数组真正有序),重复1,2步骤(gap > 1 是预排序,目的是让数组接近有序,gap == 1 排序后即有序),假设gap减小为2

在这里插入图片描述
4. gap==2排序结果为
在这里插入图片描述
5. 最后gap == 1,插入排序即可
6. 目前gap的取法很多gap = gap/3 + 1(这里+1,是为了保证gap的最后的结果可以是1),gap = gap/2

代码实现法1

void ShellSort(int*a,int n)
{
	int gap = n;
	while (gap > 1)
	{
		gap = gap / 3 + 1;
		//间隔为gap的元素分为一组,总计gap组,gap每次减小,直至gap == 1
		for (int j = 0; j < gap; j++)
		{//选出gap组的其中一组
		for (int i = j; i < n - gap; i += gap)
		{//对gap组的其中一组进行排序
		int end = i;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				if (a[end] > tmp)
				{
					a[end + gap] = a[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;
		}

		}
		}
	}

代码实现法2(不想用tmp变量可以不用)

void ShellSort(int* a, int n)
{
	int gap = n;
	while (gap > 1)
	{
		gap = gap / 3 + 1;
		//间隔为gap的元素分为一组,总计gap组,gap每次减小,直至gap == 1
		for (int j = 0; j < gap; j++)
		{//选出gap组的其中一组
			int tmp = 0;
			for (int i = j; i < n - gap; i += gap)
			{//对gap组的其中一组进行排序
				int end = i;
				while (end >= 0)
				{
					if (a[end] > a[end + gap])
					{
						int tmp = a[end + gap];
						a[end + gap] = a[end];
						a[end] = tmp;
						end -= gap;
					}
					else
					{
						break;
					}
				}
			}

		}
	}
}

代码实现法3(从三层循环变为两层循环)

void ShellSort(int*a,int n)
{
	int gap = n;
	while (gap > 1)
	{
		gap = gap / 3 + 1;
		for (int i = 0; i < n - gap; i++)
		{
			int end = i;
			int tmp = a[end + gap];

			while (end >= 0)
			{
				if (a[end] > a[end + gap])
				{
					a[end + gap] = a[end];
					end -= gap;
				}
				else
				{
					break;
				}
				a[end + gap] = tmp;

			}


		}
	}
	}
  • 这样改的画其实是多组并排即多组一块排序
    在这里插入图片描述

希尔排序的时间复杂度(O(n^1.3))

  • 希尔排序的时间复杂度其实是算不出准确数值的,但我们能探讨一下到底是因为什么才算不出来
  • 当gap很大时,假设gap = n / 3,每组插入次数为 1+2,总计gap组,则为n,所以时间复杂度为O(n)
  • 当gap很小时,因为gap = gap /3,每次循环gap越来越小,最后gap很小时,数组已经接近有序,时间复杂度也为O(n)
  • 假设gap为n/3,总计n/gap组,那么每组3个数组
  • 在这里插入图片描述

每组插入(次数):1+2+3+…+( n / gap) - ( n / gap)
总的插入次数:gap(1+2+3+…+(n / gap) - ( n / gap))
假设gap = gap / 3(gap = gap /3 + 1,1忽略点)
则gap = n/3
gap = n /9
gap = n / 27
将gap带入也是可以算的,但是随着gap的减小,数组前面的数组逐渐有序,它不是总是最坏情况下的(上面算的最坏情况下的),当gap为1时,如果还是最坏情况下计算的话,那么总插入次数为1+2+3+…+n - n 约等于N^2 - N即 N方,结果显然不是这样的
所以最后估计结果O(n^1.3)

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

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

相关文章

【KingbaseES】数据库如何查询数据库,模式及表大小

新建数据kingbase及kingbase模式 CREATE DATABASE kingbase OWNER kingbase; CREATE SCHEMA kingbase AUTHORIZATION "kingbase";在数据库kingbase的kingbase模式下新建两张测试表test_size,test_size1并插入数据 CREATE TABLE "kingbase"."test_sz…

课时9:PKI证书基础知识

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:Secureboot从入门到精通-[目录] 👈👈👈目录 1、CA证书的一般用法2、x509证书3、openssl证书命令行4、X509v3证书格式

第十五章 原理篇:YOLOv8

找工作也太难了吧根本找不到工作我哭死。 参考教程&#xff1a; https://mmyolo.readthedocs.io/en/latest/recommended_topics/algorithm_descriptions/yolov8_description.html https://zhuanlan.zhihu.com/p/599761847【这个写的挺不错】 https://zhuanlan.zhihu.com/p/63…

Linux进程监控及控制【命令ps的使用】

ps命令详解 Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照&#xff0c;就是执行ps命令的那个时刻的那些进程&#xff0c;如果想要动态的显示进程信息&#xff0c;就可以使用top命令。 要对进程进行监测…

EcoVadis 2023年最新评分细则

【EcoVadis 2023年最新评分细则】 Ecovadis 的四大主题 EcoVadis 企业社会责任评级方法的目标是通过其方针政策、实施执行和绩效反馈来衡量一家公司的企业社会责任管理系统的质量。 EcoVadis企业社会责任&#xff08;CSR&#xff09;评估方法基于七项基本原则&#xff08;如图&…

Blazor前后端框架Known-V1.2.3

V1.2.3 Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 Gitee&#xff1a; https://gitee.com/known/KnownGithub&#xff1a;https://github.com/known/Known 概述 基于C#和Blazor…

1.SpringBoot编写第一个接口(保姆级)

1.下载SpringBoot框架 下载地址&#xff1a;https://start.spring.io/ 选择对应的springboot 版本&#xff0c;工具&#xff0c;依赖等。 2.用Idea打开项目 下载完后&#xff0c;解压文件后&#xff0c;用Idea打开,进行项目的JDK和Maven的相关配置。 将项目的JDK配置成自己…

数据结构与算法——最小生成树问题(什么是最小生成树、Prim算法、Kruskal算法)

目录 什么是最小生成树 贪心算法 Prim算法 思路 代码&#xff08;C语言&#xff09; Kruskal算法 思路 代码 什么是最小生成树 1.是一颗树 无回路个顶点一定有条边 2.是生成树 包含全部顶点条边都在图里 3.边的权重和最小 向生成树中任加一条边都一定构成回路 最…

前端vue入门(纯代码)25_路由vueRouter

如果耐不住寂寞&#xff0c;你就看不到繁华。 【23.Vue Router--路由】 [可以去官网看看Vue Router文档](入门 | Vue Router (vuejs.org)) 用 Vue Vue Router 创建单页应用非常简单&#xff1a;通过 Vue.js&#xff0c;我们已经用组件组成了我们的应用。当加入 Vue Router …

Linux基础服务9——lamt架构

文章目录 一、基本了解二、安装tomcat三、 常用文件3.1 bin目录文件3.2 conf目录文件3.2.1 server.xml文件3.2.2 tomcat-users.xml 文件 四、分离部署lamt架构4.1 安装httpd4.2 安装mysql4.3 部署tomcat4.4 配置apache 一、基本了解 前提背景&#xff1a; Tomcat是Apache 软件基…

Git开发项目完整流程使用(图文超详解)

前世今生 自2002年开始&#xff0c;林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;决定使用BitKeeper作为Linux内核主要的版本控制系统用以维护代码。因为BitKeeper为专有软件&#xff0c;这个决定在社群中长期遭受质疑。在Linux社群中&#xff0c;特别是理查德斯托曼与…

springboot电子招投标系统

开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven…

MySQL基础篇第5章(排序与分页)

文章目录 1、排序1.1 排序规则1.2 单列排序1.3 多列排序 2、分页2.1 背景2.2 实现规则2.3 拓展 1、排序 1.1 排序规则 使用 ORDER BY 子句排序 ASC&#xff08;ascend&#xff09;: 升序DESC&#xff08;descend&#xff09;:降序 ORDER BY 子句在SELECT语句的结尾。 1.2 …

lumpy_sv的安装

目前利用lumpy-SV进行鉴定SV是比较常用的软件&#xff0c;但是其依赖python2.7版本的环境 ## 创建python 2.7版本conda环境 conda create -n python27 python2.7 ## 进入py27环境 conda activate python27 ## 下载lumpy软件并安装 git clone --recursive https://github.com/a…

深度学习——搭建神经网络的两种方式

方法一&#xff1a;定义神经网络类&#xff0c;然后实例化 代码&#xff1a; import torch import torch.nn.functional as F"""方法一&#xff1a;定义神经网络类&#xff0c;然后再实例化 """ # 神经网络类 class Net(torch.nn.Module):def …

CRYPTO-36D-justShow

0x00 前言 CTF 加解密合集&#xff1a;CTF 加解密合集 0x01 题目 hlcgoyfsjqknyifnpd:bcdefghijklmnopqrstuvwxyza0x02 Write Up 这道题也是完全击中了我的软肋&#xff0c;用到了新的加密方式&#xff0c;并且感觉到自己对这种类型的题目并不是很敏感。 首先看到hlcgoyfs…

基于matlab自动检测图像中的圆形目标并可视化检测到的圆(附源码)

一、前言 此示例说明如何自动检测图像中的圆或圆形目标并可视化检测到的圆。 二、实现步骤 步骤 1&#xff1a;加载图像 读取并显示包含各种颜色的圆形塑料片的图像。除了有大量要检测的圆之外&#xff0c;从圆检测的角度来看&#xff0c;此图像还有一些有趣的特点&#xf…

Sping Security前后端分离两种方案

前言 本篇文章是基于Spring Security实现前后端分离登录认证及权限控制的实战&#xff0c;主要包括以下四方面内容: Spring Seciruty简单介绍&#xff1b; 通过Spring Seciruty实现的基于表单和Token认证的两种认证方式; 自定义实现RBAC的权限控制&#xff1b; 跨域问题处理…

Django_模板继承

模板继承先创建一个父模版&#xff0c;它包含大部页面共有元素&#xff0c;并且需要定义能够被子模板覆盖的blocks标签。 extends 模板继承 通过下面的例子&#xff0c;理解模板继承的概念。 创建base.html文件&#xff0c;写入下面代码&#xff1a; <!DOCTYPE html>…

Stable Diffusion - 墨幽人造人 模型与 Tag 配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131565068 墨幽人造人模型的版本介绍&#xff1a; v1010修剪&#xff1a;更小体积的4G修剪版&#xff0c;但是整体色彩及细节表现力、好手好脸概…