八大排序算法-希尔排序

2023-10-29

希尔的定义:希尔排序是插入算法的一种,也叫缩小增量排序。是直接插入排序算法的一种改良版。

希尔算法是把数据序列按下标的一定增量分组,对每组使用直接插入排序算法进行排序;然后依次缩减增量再进行排序,待整个序列中的元素基本(注:没有全部完成排序)有序时,再对全体元素进行一次直接插入排序。

基本思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所以距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后取第二个增量d2<d1重复上述的分组和排序,直至所取的

 增量  
=1(
   
<
   
…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

时间复杂度为:最大O(n^2),最小O(n*log2n)。

实例:

int arr[] = { 35, 28, 58, 10, 61, 58, 97, 17 };
int k = sizeof(arr) / sizeof(arr[0]);

//根据当前增量进行插入排序
void shellInsert(int array[], int n, int dk)
{
	int i, j, temp;
	for (i = dk; i<n; i++)//分别向每组的有序区域插入
	{
		temp = array[i];
		for (j = i - dk; (j >= i%dk) && array[j]>temp; j -= dk)//比较与记录后移同时进行
			array[j + dk] = array[j];
		if (j != i - dk)
			array[j + dk] = temp;//插入
	}
}

//希尔排序
void shellSort(int array[], int n, int t)
{
	int i;
	while(t >= 1)
	{
		shellInsert(array, n, t);
		t = t / 2;
	}

	for (int f = 0; f < n; f++)
	{
		std::cout << array[f] << "  ";
	}
}


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

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

  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th

随机推荐

  • C/C++语言中的注释:功能、符号和使用方法详解

    目录 引言 注释的功能 注释符号 单行注释 多行注释 注释结尾问题 利用预处理实现多行注释 示例代码和解析 结论 引言 在C语言中 注释是一种非常有用的工具 可以帮助程序员在代码中添加说明 解释和备注 本文将深入探讨注释的功能 不同注释符号
  • MAC中文版 FCPX V10.6.5 专属视频剪辑后期工具及其插件安装使用教程

    Final Cut Pro X简介 Final Cut Pro X又名FCPX 是MAC上非常不错的视频非线性剪辑软件 它剪辑速度超凡 具有先进的调色功能 HDR 视频支持 以及 ProRes RAW 让剪辑 音轨 图形特效 整片输出 支持
  • 网络 ip tcp/udp dhcp dns rip/ospf

    网络 七层网络模型 物理层 数据链路层 网络层 传输层 会话层 表示层 应用层 物理层定义了一系列传输介质的电气标准 这个是弱电工程师关心的 数据链路层 封装成帧 差别检错 透明传输 MAC地址 通过CRC循环冗余校验生成校验码 放在数据包
  • 44黑马QT笔记之IP地址的划分与是否在同一网段

    44黑马QT笔记之IP地址的划分与是否在同一网段 前提 1 网络ID ip地址的第一个字节 2 网络地址 在这里你可以认为它就是网络ID 3 网段 用来区分网络上的主机是否在同一区段内 只要知道ip地址和子网掩码就知道该网段 在局域网中只有
  • MySQL多字段去重

    创建学生成绩表grade grade表的字段说明 id表示学生编号 name表示学生姓名 gender表示学生性别 score表示学生分数 create table grade id int name char 1 gender char
  • 自动化测试学习路线

    1 前端开发基础 HTML JS CSS 2 浏览器调试工具 F12 FireBug Chrome浏览器 3 接口测试工具使用 PostMan SoapUI Jmeter HttpClient UrlConnection Requests
  • ubuntu下编译linux内核

    1 下载linux内核源文件 www kernel org 2 安装有关编译工具 sudo apt get install build essential kernel package libncurses5 dev 3 把内核复制到 us
  • 【老生谈算法】基于matlab的车牌识别算法详解及程序源码——车牌识别算法

    基于matlab的车牌识别系统设计与算法原理 大家好 今天给大家介绍基于matlab的车牌识别系统设计与原理 车牌识别系统 License Plate Recognition 简称LPR 是智能交通系统 ITS 的核心组成部分 在现代交通管
  • 组件不更新怎么办!??

    适合多日 碰到了个莫名其妙的问题 上传图片后 列表组件没有更新 非要刷新页面或者切换组件才能更新 之前的暂时解决方案是 上传图片后手动刷新页面 非常不友好的交互 终于忍不住了 想办法解决它 想了很多办法 怎么都没有办法刷新页面 最后突然想到
  • python不同数据类型进行转换

    代码实现 代码如下 示例 name 张三 age 20 print 我叫 name 今年 str age 岁 不同类型转换为str类型 a 10 b 198 8 c False print str a str b str c 转为字符串格式
  • chainWebpack之optimization.splitChunks的cacheGroups缓存组代码分块实践案

    研究了好几天webpack打包 我们项目是vue的高版本 已经没有了webpack config js文件了 是直接在vue config js里的chainWebpack方法直接配置 这样做法的好处是用户既可以保留webpack的默认配置
  • sql 列求和_比较几种条件求和的方法——推荐PowerBI

    比较几种条件求和的方法 1 Excel鼠标框选 配合使用筛选功能 界面右下角显示求和结果 优点 可以快速 直观地满足一次简单的业务需求 缺点 只能快速地满足一次比较简单的查询需求 且求和结果无法被记录 2 Excel公式 sum sumif
  • 不支持请求方法POST或GET的一种解决方法

    Request method POST not supported 已解决 该错误一般是请求类型对不上导致的 比如PostMapping和GetMapping请求 一般错误发生在下图所示位置 我把Post和Get搞错了 RequiresAu
  • 线程的几种状态

    目录 前言 一 线程是什么 二 线程状态 1 新建状态 New 2 就绪状态 Runnable 3 运行状态 Running 4 阻塞状态 Blocked 5 等待状态 超时等待 Waiting Timed Waiting sleep 和
  • HTTP1.0、HTTP1.1 和 HTTP2.0 的区别

    原文 https mp weixin qq com s GICbiyJpINrHZ41u 4zT A 一 HTTP的历史 早在 HTTP 建立之初 主要就是为了将超文本标记语言 HTML 文档从Web服务器传送到客户端的浏览器 也是说对于前
  • 域名简单认识

    什么是域名 域名 Domain Name 是由一串用 点 分隔的字符组成的Internet上某一台计算机或计算机组的名称 用于在数据传输时标识计算机的电子方位 有时也指地理位置 地理上的域名 指代有行政自主权的一个地方区域 域名是一个IP地
  • SQL学习(五)查询结果过滤和排序

    如果初学 看看基础语法直接结合例子来看更容易理解 基础语法 DISTINCT 选取出唯一的结果的语法 SELECT DISTINCT column another column FROM mytable WHERE condition s
  • Retrofit上传/下载文件 (一)

    Retrofit是Square公司开源的简化 HTTP 请求的库 这篇文章主要介绍用Retrofit实现文件的上传与下载的功能 本文使用的是Retrofit 2 0 2版本 1 文件上传 api service接口 public inter
  • vue项目登录页面实现记住用户名和密码

    vue项目登录页面实现记住用户名和密码 记录一下实现的逻辑 应该分两步来理解这个逻辑 首次登录 页面没有用户的登录信息 实现逻辑如下 用户输入用户名和密码登录 用户信息为名为form的响应式对象 v model分别对应两个输入框 用户点击登
  • 八大排序算法-希尔排序

    希尔的定义 希尔排序是插入算法的一种 也叫缩小增量排序 是直接插入排序算法的一种改良版 希尔算法是把数据序列按下标的一定增量分组 对每组使用直接插入排序算法进行排序 然后依次缩减增量再进行排序 待整个序列中的元素基本 注 没有全部完成排序