当前位置: 首页 > news >正文

数据结构:希尔排序

文章目录

  • 前言
  • 一、排序的概念及其运用
  • 二、常见排序算法的实现
    • 1.插入排序
    • 2.希尔排序
  • 总结

前言

排序在生活中有许多实际的运用。以下是一些例子:

  1. 购物清单:当我们去超市购物时,通常会列出一份购物清单。将购物清单按照需要购买的顺序排序,可以使购物过程更加高效和有序。

  2. 时间管理:在安排日程和任务时,将任务按照优先级排序可以帮助我们更好地管理时间。通过将任务按照重要性和紧急性进行排序,我们可以更好地掌控时间,确保重要的事情得到优先处理。

  3. 紧急情况应对:在紧急情况下,如自然灾害或事故,排序可以帮助救援人员更好地组织和协调救援工作。根据伤势的严重性和治疗的紧迫性对伤者进行排序,可以确保救援资源得到合理利用,最大程度地拯救生命。

  4. 选课/注册:在大学或学校的选课和注册过程中,学生通常需要按照自身的兴趣和要求对课程进行选择。将课程按照自己的优先级进行排序,可以确保能够在有限的选课时间内选到最理想的课程。

  5. 编辑和整理文件:在工作或学习中,我们经常需要整理和编辑文件。将文件按照名称、日期或其他标准进行排序,可以帮助我们更快地找到需要的文件,提高工作效率。

  6. 旅行规划:在计划旅行时,我们通常会按照时间和地点对行程进行排序。这样可以确保旅行过程中的交通和活动安排紧密合理,更好地利用旅行时间。

综上所述,排序在生活中的运用是非常广泛的。通过排序,我们可以更好地组织和安排工作、学习和生活,提高效率和质量。


一、排序的概念及其运用

1.排序的概念 

排序 :所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
稳定性 :假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次
序保持不变,即在原序列中, r[i]=r[j] ,且 r[i] r[j] 之前,而在排序后的序列中, r[i] 仍在 r[j] 之前,则称这种排 序算法是稳定的;否则称为不稳定的。
内部排序 :数据元素全部放在内存中的排序。
外部排序 :数据元素太多不能同时放在内存中,根据排序过程的要求不断地在内外存之间移动数据的

 2.常见排序算法

// 插入排序
void InsertSort(int* a, int n);
// 希尔排序
void ShellSort(int* a, int n);
// 选择排序
void SelectSort(int* a, int n);
// 堆排序
void AdjustDwon(int* a, int n, int root);
void HeapSort(int* a, int n);
// 冒泡排序
void BubbleSort(int* a, int n)
// 快速排序递归实现
// 快速排序hoare版本
int PartSort1(int* a, int left, int right);
// 快速排序挖坑法
int PartSort2(int* a, int left, int right);
// 快速排序前后指针法
int PartSort3(int* a, int left, int right);
void QuickSort(int* a, int left, int right);
// 快速排序 非递归实现
void QuickSortNonR(int* a, int left, int right)
// 归并排序递归实现
void MergeSort(int* a, int n)

二、常见排序算法的实现

1.插入排序

1.1插入排序基本思想

把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为 止,得到一个新的有序序列

 以下是插入排序动图演示: 

当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与 array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移

2.代码实现 

void InsertSort(int* a, int n)
{//  [0, n-1]for (int i = 0; i < n - 1; i++){// [0, n-2]是最后一组// [0,end]有序 end+1位置的值插入[0,end],保持有序int end = i;int tmp = a[end + 1];while (end >= 0){if (tmp < a[end]){a[end + 1] = a[end];--end;}else{break;}}a[end + 1] = tmp;}
}
直接插入排序的特性总结:
1. 元素集合越接近有序,直接插入排序算法的时间效率越高
2. 时间复杂度:O(N^2)
3. 空间复杂度:O(1),它是一种稳定的排序算法
4. 稳定性:稳定

2.希尔排序

希尔排序法又称缩小增量法。希尔排序法的基本思想是: 先选定一个整数,把待排序文件中所有记录分成个
组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工
作。当到达 =1 时,所有记录在统一组内排好序

 首先进行预排序,让数组接近有序

gap越大,大的数可以越快跳到后面,小的数可以越快跳到前面

gap越小,跳的越慢,但是越接近有序,当gap==1时就是插入排序

void ShellSort(int* a, int n)
{int gap = 3;for (int j = 0; j < gap; j++){for (int i = j; i < n - gap; i += 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 + 1] = tmp;}}
}

 该代码的两层for循环嵌套可改写成一层for循环,时间复杂度不变

gap最后+1是确保 最后一个gap一定是1

gap

void ShellSort2(int* a, int n)
{int gap = n;while (gap > 1){gap = gap / 3 + 1;//for (int j = 0; j < gap; j++){for (int i = j; i < n - gap; i += gap){int end = i;int tmp = a[end + 1];//小心越界while (end >= 0){if (a[end] > tmp){a[end + 1] = a[end];end--;}else{break;}}a[end + 1] = tmp;}}}
}

希尔排序的时间复杂度取决于选择的间隔序列。假设有n个元素需要排序,希尔排序的最坏时间复杂度为O(n^2),而平均情况下的时间复杂度则为O(n^1.3)。这使得希尔排序相比于其他排序算法具有较好的性能。


总结

希尔排序(Shell Sort)是一种高效的排序算法,它是插入排序的一种改进。希尔排序通过将待排序的元素按照一定间隔分组,然后对每个分组进行插入排序,不断缩小间隔,直到间隔为1时完成最后一次排序,使整个序列基本有序。希尔排序的作用主要有以下几个方面:

1. 加快排序速度:相比于传统的插入排序,希尔排序可以显著减少比较和交换的次数,从而提高排序的速度。

2. 克服插入排序的缺点:插入排序在处理大规模或逆序序列时,移动元素的次数较多,效率较低。希尔排序通过分组排序和逐步缩小间隔的方式,可以有效地克服插入排序的这一缺点。

3. 高效处理部分有序序列:希尔排序在每一轮排序时,会将相距较远的元素进行比较和交换,从而可以快速将部分有序的序列整理成完全有序的序列。

总的来说,希尔排序可以提高排序效率,克服插入排序的缺点,并且在处理部分有序序列时表现出较好的性能。

相关文章:

数据结构:希尔排序

文章目录 前言一、排序的概念及其运用二、常见排序算法的实现 1.插入排序2.希尔排序总结 前言 排序在生活中有许多实际的运用。以下是一些例子&#xff1a; 购物清单&#xff1a;当我们去超市购物时&#xff0c;通常会列出一份购物清单。将购物清单按照需要购买的顺序排序&…...

unicloud 云对象

背景和优势 20年前&#xff0c;restful接口开发开始流行&#xff0c;服务器编写接口&#xff0c;客户端调用接口&#xff0c;传输json。 现在&#xff0c;替代restful的新模式来了。 云对象&#xff0c;服务器编写API&#xff0c;客户端调用API&#xff0c;不再开发传输json…...

【车载开发系列】常用专业术语汇总

【车载开发系列】常用专业词汇汇总 英语全称说明详细HILSHardware In the Loop Simulation车硬件仿真模拟器精密仪器&#xff0c;价格昂贵&#xff0c;机能测试时一定要小心使用。使用简易HILS不能模拟电气故障。要模拟电气故障需要外接故障BoxLSBLeast Significant Bit单位精…...

如何实现Docker容器的自动化升级:不再为手动更新烦恼!

要升级 Docker 容器&#xff0c;你可以按照以下步骤操作&#xff0c;这些步骤涵盖了从拉取最新镜像到重启容器的整个过程。 步骤一&#xff1a;拉取最新的镜像 首先&#xff0c;确保你有最新版本的镜像。例如&#xff0c;如果你要升级一个 Spring Boot 应用的镜像&#xff0c…...

SwiftUI 5.0(iOS 17)进一步定制 TipKit 外观让撸码如虎添翼

概览 在之前 SwiftUI 5.0&#xff08;iOS 17&#xff09;TipKit 让用户更懂你的 App 这篇博文里&#xff0c;我们已经初步介绍过了 TipKit 的基本知识。 现在&#xff0c;让我们来看看如何进一步利用 SwiftUI 对 TipKit 提供的细粒度外观定制技巧&#xff0c;让 Tip 更加“明眸…...

使用C#实现VS窗体应用——画图板

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。&#x1f34e;个人主页&#xff1a;Meteors.的博客&#x1f49e;当前专栏&#xff1a;小项目✨特色专栏&#xff1a; 知识分享&#x1f96d…...

flutter 自定义本地化-GlobalMaterialLocalizations(重写本地化日期转换)

1. 创建自定义 GlobalMaterialLocalizations import package:flutter_localizations/flutter_localizations.dart; import package:kittlenapp/utils/base/date_time_util.dart;///[auth] kittlen ///[createTime] 2024-05-31 11:40 ///[description]class MyMaterialLocaliza…...

HTTPS 原理技术

HTTPS原理技术 背景简介原理总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日子。本文内容并非完全原创&am…...

Linux基础指令及其作用之压缩与解压

压缩与解压targzip示例输出解释 gunzipzipunzip 压缩与解压 tar tar xzf 是一个常用的命令组合&#xff0c;用于解压缩由 gzip 压缩的 tarball 文件。下面是对这个命令的详细说明&#xff1a; tar&#xff1a;这是一个用于在 Linux 和类 Unix 系统上创建、查看或提取归档文件…...

ORA-08189: 因为未启用行移动功能, 不能闪回表问题

在执行闪回恢复误删数据出现“ORA-08189: 因为未启用行移动功能, 不能闪回表”的错误提示。 ORA-08189 错误表示你尝试对一个表执行闪回操作&#xff0c;但该表没有启用行移动&#xff08;ROW MOVEMENT&#xff09;功能。行移动是Oracle中的一个特性&#xff0c;它允许表中的行…...

html+CSS部分基础运用9

项目1 参会注册表 1.设计参会注册表页面&#xff0c;效果如图9-1所示。 图9-1 参会注册表页面 项目2 设计《大学生暑期社会实践调查问卷》 1.设计“大学生暑期社会实践调查问卷”页面&#xff0c;如图9-2所示。 图9-2 大学生暑期社会调查表页面 2&#xff0e;调查表前导语的…...

五大元素之一,累不累——Java内部类

目录 简略版&#xff1a; 详解版&#xff1a; 使用场景&#xff1a; 内部类的优点&#xff1a; 内部类的分类&#xff1a; 一. 成员内部类 1.创建对象 2.访问方法 3. 外部类名.this. 二. 静态内部类 1. 创建对象 2. 访问特点 三. 局部内部类 四. 匿名内部类 …...

YAML快速编写示例

一、案例 1.1 自主式创建service关联上方的pod 资源名称my-nginx-kkk命名空间my-kkk容器镜像nginx:1.21容器端口80标签njzb:my-kkk 1.1.1 创建一个demo文件夹 1.1.2 创建并获取模版文件 1.1.3 查看服务并编写yaml文件 1.1.4 编写yaml文件并部署&#xff0c;查看服务是否运行成…...

2024 江苏省大学生程序设计大赛 2024 Jiangsu Collegiate Programming Contest(FGKI)

题目来源&#xff1a;https://codeforces.com/gym/105161 文章目录 F - Download Speed Monitor题意思路编程 G - Download Time Monitor题意思路编程 K - Number Deletion Game题意思路编程 I - Integer Reaction题意思路编程 写在前面&#xff1a;今天打的训练赛打的很水&…...

【C语言】基于C语言实现的贪吃蛇游戏

【C语言】基于C语言实现的贪吃蛇游戏 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C语言学习之路 文章目录 【C语言】基于C语言实现的贪吃蛇游戏前言一.最终实现效果一.Win32 API介绍1.1Win32 API1.2控制台程序1.3控制台屏幕上的坐标COORD…...

代码审计(工具Fortify 、Seay审计系统安装及漏洞验证)

源代码审计 代码安全测试简介 代码安全测试是从安全的角度对代码进行的安全测试评估。&#xff08;白盒测试&#xff1b;可看到源代码&#xff09; 结合丰富的安全知识、编程经验、测试技术&#xff0c;利用静态分析和人工审核的方法寻找代码在架构和编码上的安全缺陷&#xf…...

cocos creator 3.x 手搓背包拖拽装备

项目背景&#xff1a; 游戏背包 需要手动 拖拽游戏装备到 装备卡槽中&#xff0c;看了下网上资料很少。手搓了一个下午搞定&#xff0c;现在来记录下实现步骤&#xff1b; 功能拆分&#xff1a; 一个完整需求&#xff0c;我们一般会把它拆分成 几个小步骤分别造零件。等都造好了…...

运维开发.Kubernetes探针与应用

运维系列 Kubernetes探针与应用 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263…...

Spring 框架:Java 企业级开发的基石

文章目录 序言Spring 框架的核心概念Spring 框架的主要模块Spring Boot&#xff1a;简化 Spring 开发Spring Cloud&#xff1a;构建微服务架构实际案例分析结论 序言 Spring 框架自 2002 年发布以来&#xff0c;已经成为 Java 企业级开发的标准之一。它通过提供全面的基础设施…...

在Docker中使用GPU

一、安装nvidia-container-toolkit 总之一句话&#xff1a;nvidia-docker和nvidia-docker2&#xff0c;nvidia-container-runtime 已经被英伟达迭代了&#xff0c;可以认为nvidia-container-toolkit是nvidia-docker和nvidia-docker2&#xff0c; nvidia-container-runtime 的替…...

Qwen3-0.6B-FP8极速对话工具:STM32F103C8T6最小系统板集成

Qwen3-0.6B-FP8极速对话工具&#xff1a;STM32F103C8T6最小系统板集成 让AI对话能力跑在指甲盖大小的开发板上 1. 场景与痛点 你可能很难想象&#xff0c;一个能进行智能对话的AI模型&#xff0c;居然可以运行在一块只有拇指大小的STM32开发板上。传统的AI模型部署往往需要强大…...

OpenClaw多模型切换指南:Qwen3-32B与其他镜像协同工作

OpenClaw多模型切换指南&#xff1a;Qwen3-32B与其他镜像协同工作 1. 为什么需要多模型切换&#xff1f; 去年冬天&#xff0c;当我第一次尝试用OpenClaw自动化处理公司周报时&#xff0c;发现单一模型很难同时满足"数据分析"和"文案润色"两种需求。Qwen…...

Suricata在CentOS7上的性能优化:如何配置网卡混杂模式与端口聚合

Suricata在CentOS7上的性能优化&#xff1a;网卡混杂模式与端口聚合实战指南 当企业网络流量突破千兆级别时&#xff0c;传统单网卡监控方案往往力不从心。我曾为某金融客户部署Suricata时&#xff0c;单台服务器每天要处理超过2TB的流量数据&#xff0c;正是通过下文介绍的网卡…...

AI辅助开发:用提示词让快马AI自动生成技术职级成长路径分析应用

AI辅助开发&#xff1a;用提示词让快马AI自动生成技术职级成长路径分析应用 最近在研究技术职级体系时&#xff0c;发现很多开发者对阿里P10这类高级职位的成长路径特别感兴趣。但手动整理这些信息费时费力&#xff0c;于是尝试用AI辅助开发的方式快速生成一个可视化分析工具。…...

【限时开放】Mojo-Python互操作安全边界图谱(2024 Q3最新CVE影响评估+3类高危反模式代码扫描规则),错过将无法适配Mojo v1.2+运行时

第一章&#xff1a;Mojo-Python互操作安全边界图谱概览Mojo 作为面向 AI 原生开发的系统级编程语言&#xff0c;其与 Python 的互操作并非简单语法兼容&#xff0c;而是在运行时、内存模型、类型系统与异常传播四个维度上构建了显式、可审计的安全边界。这些边界共同构成一张动…...

从零到一:基于GitHub Pages与Jekyll搭建你的专属学术主页

1. 为什么选择GitHub Pages Jekyll搭建学术主页&#xff1f; 作为一个长期在学术界摸爬滚打的老兵&#xff0c;我见过太多同行花大价钱购买服务器和维护网站&#xff0c;结果最后因为各种技术问题半途而废。直到我发现GitHub Pages和Jekyll这对黄金组合&#xff0c;才真正找到…...

【概率统计】从直方图到核密度估计:数据分布可视化的进阶之路

1. 直方图&#xff1a;数据可视化的第一课 第一次接触数据分布可视化时&#xff0c;大多数人都是从直方图开始的。记得我刚学数据分析时&#xff0c;导师扔给我一组销售数据说&#xff1a;"先画个直方图看看分布情况。"当时我盯着matplotlib的hist函数参数一脸茫然—…...

全向轮底盘运动控制:嵌入式PID与逆运动学实现

1. 全向轮底盘控制库&#xff08;omni_wheel&#xff09;技术解析与工程实践1.1 项目背景与工程定位omni_wheel是为B团队自主移动机器人开发的底层运动控制模块&#xff0c;最初版本发布于2018年7月10日。从其原始README描述“PIDかけて一方向に進むだけのプログラムでござんす…...

为什么很多人学 Django 会懵?因为没搞懂 MVC 和 MTV 的真正区别

很多刚接触 Django 的开发者&#xff0c;甚至包括不少测试工程师&#xff0c;在学习 Django 时都会遇到一个困惑&#xff1a;为什么 Django 不叫 MVC&#xff0c;而是 MTV&#xff1f;更奇怪的是&#xff1a;很多教程还会说&#xff1a;“Django 的 MTV 其实就是 MVC。”这句话…...

PP实战指南:ECN工程变更在物料计划中的关键应用与系统操作解析

1. ECN工程变更的核心价值与业务场景 第一次接触ECN&#xff08;Engineering Change Notice&#xff09;是在2015年负责汽车零部件项目时&#xff0c;当时产线因为一个螺丝规格变更导致全线停产8小时。这个惨痛教训让我深刻理解到&#xff0c;工程变更绝不是简单的技术文档更新…...