经典排序算法之希尔排序|c++代码实现||什么是希尔排序|如何代码实现

引言

排序算法c++实现系列第4弹——希尔排序

算法介绍

希尔排序(Shell Sort),也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。该排序算法的基本思想是将原始序列分成若干个子序列,分别对每个子序列进行直接插入排序,然后逐步缩小子序列的间隔,直到整个序列变成一个有序序列。

算法步骤

  1. 选择增量序列:选择一个增量序列(即代码中的gap),通常以2为基数,逐步缩小增量的值(即希尔增量序列)。增量序列的选择对希尔排序的性能影响很大,常见的增量序列包括希尔增量序列、Hibbard增量序列、Sedgewick增量序列等。

    1. 希尔增量序列(Shell's Increment Sequence): 希尔增量序列是希尔排序的名字来源之一。希尔增量序列是通过h_k = n / 2^k计算得到的,其中(n)为序列长度,(k)为增量的序号。希尔增量序列的第一个增量通常为序列长度的一半,随后的增量依次减半,直到增量为1。希尔增量序列的优点是简单易于实现,但其性能较差,不如其他增量序列。

    2. Hibbard增量序列: Hibbard增量序列是由Donald Hibbard于1963年提出的一种增量序列。Hibbard增量序列的计算公式为(h_k = 2^k - 1),其中(k)为增量的序号。Hibbard增量序列的特点是每个增量都是连续的奇数,并且增量递减非常快。Hibbard增量序列的性能相对较好,但增量之间的差异较大,可能导致不稳定的性能。

    3. Sedgewick增量序列: Sedgewick增量序列是由Robert Sedgewick于1986年提出的一种增量序列。:Sedgewick增量序列的特点是增量之间的差异较小,性能稳定,并且在实际应用中表现优秀。(在代码中也已实现)

  2. 分组排序:根据选定的增量序列,将原始序列分成若干个子序列,对每个子序列进行直接插入排序。

  3. 缩小增量:逐步缩小增量的值,重复第二步的分组排序过程,直到增量为1。

  4. 最终排序:当增量为1时,即对整个序列进行一次直接插入排序,最终得到排序好的序列。

举例说明:如代码中的数组arr = {61, 17, 29, 22, 34, 60, 72, 21, 50, 1, 62};我们假设此时gap为2,那么原数据就将被分为

子序列1:{61, 29, 34, 72, 50, 62};子序列2:{17, 22, 60, 21, 1};分别对上述两个子序列进行直接插入排序后得到全部数据序列为:{29, 1, 34, 17, 50, 21, 61, 22, 62, 60, 72};

接下来,可以使gap为1,相当于对{29, 1, 34, 17, 50, 21, 61, 22, 62, 60, 72}整体做一次直接插入排序,即得到最终结果

时间复杂度

希尔排序的时间复杂度取决于增量序列的选择,最坏情况下的时间复杂度为 O(n2),平均情况下为 O(nlog2n)

代码实现

#include<bits/stdc++.h>
using namespace std;
template<typename T>
void shell_sort(T arr[], int len) {
//	// 希尔增量序列
//	int gap = len / 2;
//	while (gap) {
//		for (int i = gap; i < len; i++) {
//			int j = i - gap;
//			T k = arr[i];
//			while ((j >= 0) && (arr[j] > k)) {
//				arr[j + gap] = arr[j];
//				j -= gap;
//			}
//			arr[j + gap] = k;
//		}
//		gap /= 2;
//	}// Sedgewick增量序列int gap = 1;while (gap < len / 3) {gap = 3 * gap + 1;}while (gap) {for (int i = gap; i < len; i++) {T key = arr[i];int j = i - gap;while (arr[j] > key && (j >= 0)) {arr[j + gap] = arr[j];j -= gap;}arr[j + gap] = key;}gap /= 3;}}
int main() {int arr[] = {61, 17, 29, 22, 34, 60, 72, 21, 50, 1, 62};int len = (int) sizeof(arr) / sizeof(*arr);shell_sort(arr, len);for (int i = 0; i < len; i++) {cout << arr[i] << " ";}cout << endl;float arrf[] = {17.5, 19.1, 0.6, 1.9, 10.5, 12.4, 3.8, 19.7, 1.5, 25.4, 28.6, 4.4, 23.7, 5.4};int lenf = sizeof(arrf) / sizeof(*arrf);shell_sort(arrf, lenf);for (int i = 0; i < lenf; i++) {cout << arrf[i] << " ";}return 0;
}

运行结果展示:

如果对您有启发的话,欢迎点赞加收藏

其他排序算法实现

经典排序算法之插入排序|c++实现|什么是插入排序|如何代码实现-CSDN博客

排序算法之选择排序|c++实现-CSDN博客

 经典排序算法之冒泡排序|c++代码实现-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Finetuning Large Language Models: Sharon Zhou

Finetuning Large Language Models 课程地址&#xff1a;https://www.deeplearning.ai/short-courses/finetuning-large-language-models/ 本文是学习笔记。 Goal&#xff1a; Learn the fundamentals of finetuning a large language model (LLM). Understand how finetu…

Scrapy与分布式开发(2.3):lxml+xpath基本指令和提取方法详解

lxmlxpath基本指令和提取方法详解 一、XPath简介 XPath&#xff0c;全称为XML Path Language&#xff0c;是一种在XML文档中查找信息的语言。它允许用户通过简单的路径表达式在XML文档中进行导航。XPath不仅适用于XML&#xff0c;还常用于处理HTML文档。 二、基本指令和提取…

pytorch续写tensorboard

模型训练到一半有 bug 停了&#xff0c;可以 resume 继续炼&#xff0c;本篇给出 pytorch 在 resume 训练时续写 tensorboard 的简例&#xff0c;参考 [1-3]&#xff0c;只要保证 writer 接收的 global step 是连着的就行。 Code import numpy as np from torch.utils.tensor…

【node版本问题】运行项目报错 PostCSS received undefined instead of CSS string

最近该项目没有做任何修改&#xff0c;今天运行突然跑不起来报错了 PostCSS received undefined instead of CSS string 【原因】突然想起来期间有换过 node 版本为 16.17.1 【解决】将 node 版本换回之前的 14.18.0 就可以了

电脑不小心格式化了,怎么恢复?

在这个数字化时代&#xff0c;电脑已经成为我们日常生活和工作中不可或缺的工具。然而&#xff0c;有时我们可能会不小心格式化电脑硬盘&#xff0c;导致重要数据的丢失。那么&#xff0c;电脑不小心格式化了&#xff0c;怎么恢复&#xff1f; 别着急&#xff0c;在本篇攻略中&…

25考研资料PDF汇总

资料V馊public号ZL研知己 V馊public号ZL研知己 25考研资料PDF汇总

开关电源安规测试标准与测试要求

安规测试是对开关电源进行电气性能、安全性能等检测&#xff0c;确保开关电源符合规定并且安全可靠&#xff0c;为开关电源的质量把关。那么开关电源安规测试有哪些测试要求和标准呢&#xff1f; 开关电源安规测试要求 一、测试前 1. 首先&#xff0c;要检查测试环境&#xff0…

Python数据处理实战(5)-上万行log数据提取并分类进阶版

系列文章&#xff1a; 0、基本常用功能及其操作 1&#xff0c;20G文件&#xff0c;分类&#xff0c;放入不同文件&#xff0c;每个单独处理 2&#xff0c;数据的归类并处理 3&#xff0c;txt文件指定的数据处理并可视化作图 4&#xff0c;上万行log数据提取并作图进阶版 …

基于OpenCV的图形分析辨认02

目录 一、前言 二、实验目的 三、实验内容 四、实验过程 一、前言 编程语言&#xff1a;Python&#xff0c;编程软件&#xff1a;vscode或pycharm&#xff0c;必备的第三方库&#xff1a;OpenCV&#xff0c;numpy&#xff0c;matplotlib&#xff0c;os等等。 关于OpenCV&…

WPF学习三(MVVM+自定义按钮等的登录界面)

跟着bilibil龙马哥视频做的一个登录界面&#xff0c;个人感觉讲得很到位&#xff0c;适合新手&#xff09;&#xff0c;他是从开始的前后绑定慢慢解耦合到MVVM&#xff0c;让我较快的理解了WPF的基础。 【WPF入门】WPF零基础到精通&#xff0c;从概念到实操&#xff0c;步步提升…

换手机后日记不见了怎么恢复?换手机日记内容同步方法

曾经&#xff0c;我使用的是一款苹果手机&#xff0c;这部手机陪伴了我整整3年。随着时间的推移&#xff0c;手机内存不够用成为了我面临的一个大问题&#xff0c;因此我决定更换一部新手机——这次我选择了OPPO品牌。在更换手机的过程中&#xff0c;我利用手机搬家软件一键同步…

英语四级开始报名了?大学生如何三个月突破四级【文章底部添加进大学生就业交流群】

目录 一、明确考试内容与要求 二、制定合理的复习计划 三、注重听力和阅读能力的提升 四、加强词汇和语法的积累 五、多做真题和模拟题 英语四级考试&#xff0c;对于大多数大学生来说&#xff0c;是检验英语水平的一个重要标准。随着报名时间的来临&#xff0c;许多同学都…

vue3 ref获取子组件显示 __v_skip : true 获取不到组件的方法 怎么回事怎么解决

看代码 问题出现了 当我想要获取这个组件上的方法时 为什么获取不到这个组件上的方法呢 原來&#xff1a; __v_skip: true 是 Vue 3 中的一个特殊属性&#xff0c;用于跳过某些组件的渲染。当一个组件被标记为 __v_skip: true 时&#xff0c;Vue 将不会对该组件进行渲染&am…

开源模型应用落地-工具使用篇-Spring AI-高阶用法(九)

一、前言 通过“开源模型应用落地-工具使用篇-Spring AI-Function Call&#xff08;八&#xff09;-CSDN博客”文章的学习&#xff0c;已经掌握了如何通过Spring AI集成OpenAI以及如何进行function call的调用&#xff0c;现在将进一步学习Spring AI更高阶的用法&#xff0c;如…

vscode 使用ssh进行远程开发 (remote-ssh),首次连接及后续使用,详细介绍

在vscode添加remote ssh插件 首次连接 选择左侧栏的扩展&#xff0c;并搜索remote ssh 它大概长这样&#xff0c;点击安装 安装成功后&#xff0c;在左侧栏会出现远程连接的图标&#xff0c;点击后选择ssh旁加号便可以进行连接。 安装成功后vscode左下角会有一个图标 点击图…

08.回调地狱函数及其解决(Promise链式调用)

一.同步代码和异步代码 1. 同步代码&#xff1a; 逐行执行&#xff0c;需原地等待结果后&#xff0c;才继续向下执行 2. 异步代码&#xff1a; 调用后耗时&#xff0c;不阻塞代码继续执行&#xff08;不必原地等待&#xff09;&#xff0c;在将来完成后触发回调函数传递结果…

Windows上基于名称快速定位文件和文件夹的免费工具Everything

在Windows上搜索文件时&#xff0c;使用windows上内置搜索会很慢&#xff0c;这里推荐使用Everything工具进行搜索。 "Everything"是Windows上一款搜索引擎&#xff0c;它能够基于文件名快速定位文件和文件夹位置。不像Windows内置搜索&#xff0c;"Everything&…

Docker-完整项目的部署(保姆级教学)

目录 1 手动部署(白雪版) 1.1 创建网络 1.2 MySQL的部署 1.2.1 准备 1.2.2 部署 1.3 Java项目的部署 1.3.1 准备 1.3.1.1 将Java项目打成jar包 1.3.1.2 编写Dockerfile文件 1.3.2 部署 1.3.2.1 将jar包、Dockerfile文件放在linux同一个文件夹下 1.3.2.2 构建镜像 …

飞行汽车首飞成功?一文讲解飞行汽车与其代表的立体交通形式

中国的“飞行汽车”从深圳跨越大湾区到珠海首飞成功&#xff0c;既是一次重要尝试&#xff0c;更是交通运输行业发展史中一个全新的起点 关注我&#xff0c;共同交流&#xff0c;一起成长 前言一、基本认识飞行汽车二、发展飞行汽车必要性三、飞行汽车所形成的影响 前言 2月27…

swoole

php是单线程。php是靠多进程来处理任务&#xff0c;任何后端语言都可以采用多进程处理方式。如我们常用的php-fpm进程管理器。线程与协程,大小的关系是进程>线程>协程,而我们所说的swoole让php实现了多线程,其实在这里来说,就是好比让php创建了多个进程,每个进程执行一条…