(动画版)排序算法 -希尔排序

文章目录

  • 1. 希尔排序(Shellsort)
    • 1.1 简介
    • 1.2 希尔排序的步骤
    • 1.3 希尔排序的C实现
    • 1.4 时间复杂度
    • 1.5 空间复杂度
    • 1.6 希尔排序动画

1. 希尔排序(Shellsort)

1.1 简介

希尔排序(Shell's Sort),又称缩小增量排序(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法,其核心思想是通过逐渐减小元素之间的间隔,使得序列在初始阶段就呈现局部有序,从而减少插入排序的工作量。希尔排序的基本思想是将待排序的序列划分成若干个子序列,分别进行插入排序。随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个序列恰被分成一组,此时再对全体记录进行一次直接插入排序,排序完成。

1.2 希尔排序的步骤

  1. 选择一个增量序列,该序列通常是递减的正整数序列。常用的增量序列有希尔建议的序列、Hibbard序列、Sedgewick序列等。增量序列的选择会直接影响希尔排序的性能。
  2. 使用选定的增量序列进行外层循环,每次循环缩小增量。
  3. 在每一轮外层循环中,通过增量对元素进行分组,每组包含相隔一定间隔的元素。这一步骤旨在逐步减小元素之间的间隔,从而实现序列的局部有序。
  4. 在每一组内,通过插入排序对元素进行排序。这是希尔排序的关键步骤,通过比较相隔增量的元素,并在需要时交换它们的位置,逐步实现每个小组的局部有序。
  5. 重复外层循环和内层循环,逐渐减小增量,直到增量为1。最后一次外层循环使用增量为1,相当于进行一次标准的插入排序。此时,整个序列已经基本有序,最终完成排序。

1.3 希尔排序的C实现


#include <stdio.h>// 希尔排序函数(带步骤输出)
void shellSort(int arr[], int n) {// 初始增量设置为数组长度的一半for (int gap = n / 2; gap > 0; gap /= 2) {printf("当前间隔 (gap): %d\n", gap); // 输出当前的间隔// 对每个增量子数组进行插入排序for (int i = gap; i < n; i++) {int temp = arr[i];int j;printf("  当前插入元素 (arr[%d]): %d\n", i, temp);// 在增量子数组中向前移动元素,直到找到合适的位置for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {printf("    比较并移动元素 (arr[%d] = %d) 到位置 arr[%d]\n", j - gap, arr[j - gap], j);arr[j] = arr[j - gap];}// 将当前元素放到合适的位置arr[j] = temp;printf("  将元素 %d 插入到位置 arr[%d]\n", temp, j);// 输出每次插入后的数组状态printf("  当前数组状态: ");for (int k = 0; k < n; k++) {printf("%d ", arr[k]);}printf("\n");}// 输出每次间隔完成后的数组状态printf("间隔 %d 排序后的数组: ", gap);for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n\n");}
}// 打印数组函数
void printArray(int arr[], int size) {for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");
}// 主函数
int main() {int arr[] = {22, 48, 65, 68, 68, 10, 84, 45, 37, 88, 71, 89, 89, 13, 59};int n = sizeof(arr) / sizeof(arr[0]);printf("排序前的数组: \n");printArray(arr, n);shellSort(arr, n);printf("排序后的数组: \n");printArray(arr, n);return 0;
}

希尔排序(Shell Sort)的时间复杂度和空间复杂度分析如下:

1.4 时间复杂度

希尔排序的时间复杂度取决于所选的增量序列。对于不同的增量序列,希尔排序的性能可能会有很大的差异。
  1. 最坏情况:使用原始的希尔增量(即每次将增量减半,从 n 2 \frac{n}{2} 2n开始),希尔排序的时间复杂度在最坏情况下可以达到O(n2)。这通常发生在数据已经接近有序但尚未完全有序的情况下,因为此时的插入排序(希尔排序在增量为1时的特殊情况)可能会执行大量的元素移动。

  2. 平均情况:在实际应用中,希尔排序通常比简单的插入排序要快得多,特别是在处理大数据集时。虽然其最坏情况时间复杂度较高,但平均情况下,希尔排序的性能通常优于O(n2)的排序算法。

  3. 最优增量序列:通过选择更好的增量序列(如Hibbard增量、Sedgewick增量等),可以进一步改进希尔排序的性能。然而,找到最优的增量序列仍然是一个未解决的问题,因此希尔排序的时间复杂度在很大程度上仍然是一个开放性问题。

  4. 实验观察:实验结果表明,对于中等规模的数据集,希尔排序的性能通常与快速排序(Quick Sort)相当,甚至在某些情况下可能更快。然而,对于非常大的数据集,快速排序通常具有更好的性能。

1.5 空间复杂度

希尔排序是一种原地排序算法(in-place sorting algorithm),这意味着它只需要一个与输入数组大小相同的额外空间来存储临时变量(在插入排序的每一步中用于保存要插入的元素)。因此,希尔排序的空间复杂度是O(1)。

1.6 希尔排序动画

在希尔排序的动画中,用三种颜色来帮助理解排序过程:
  1. 橙色:当前插入的元素,表示正在考虑插入排序的那个元素(i)。
  2. 绿色:正在比较或插入的位置,表示当前正在比较或准备插入的具体位置(j)。
  3. 紫色:属于同一间隔组的元素,用来表明在当前的间隔(gap)下,这些元素属于同一组,将通过插入排序在组内进行比较和排序。

shell

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

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

相关文章

蓝桥杯每日真题 - 第7天

题目&#xff1a;&#xff08;爬山&#xff09; 题目描述&#xff08;X届 C&C B组X题&#xff09; 解题思路&#xff1a; 前缀和构造&#xff1a;为了高效地计算子数组的和&#xff0c;我们可以先构造前缀和数组 a&#xff0c;其中 a[i] 表示从第 1 个元素到第 i 个元素的…

socketcan-goloang

模拟接收 模拟发送 package mainimport ("context""fmt""go.einride.tech/can""go.einride.tech/can/pkg/candevice""go.einride.tech/can/pkg/socketcan" )func main() {// linux系统设置// sudo ip link add dev can0 ty…

Java期末复习暨学校第五次上机课作业

Java期末复习暨学校第五次上机课作业&#xff1a;掌握类的定义、掌握类的封装、熟悉类的成员方法的调用。 第一题&#xff1a; 先定义两个整形变量x和y&#xff0c;然后showMessage方法打印防御塔的位置。 然后通过new关键字实例化了一个TowerDefense对象t1,并把x赋值为3&…

【目标检测】【Ultralytics-YOLO系列】Windows11下YOLOV5人脸目标检测

【目标检测】【Ultralytics-YOLO系列】Windows11下YOLOV5人脸目标检测 文章目录 【目标检测】【Ultralytics-YOLO系列】Windows11下YOLOV5人脸目标检测前言YOLOV5模型运行环境搭建YOLOV5模型运行数据集准备YOLOV5运行模型训练模型验证模型推理 总结 前言 Ultralytics YOLO 是一…

【启明智显分享】5G CPE与5G路由器到底有什么区别?

5G路由器和5G CPE在功能和应用场景上存在很明显的差异&#xff0c;小编做了详细比较&#xff0c;希望能帮助到你进一步了解他们的区别及应用。 一、定义与功能 5G路由器 5G路由器是一个将5G网络连接转换为Wi-Fi信号的设备&#xff0c;使多个Wi-Fi设备可以通过5G网络进行连接…

【go从零单排】File Paths文件路径

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在 Go 中&#xff0c;处理文件路径通常使用 path/filepath 包。这个包提供了一系…

【数据分享】中国渔业统计年鉴(1979-2024) pdf

数据介绍 一、《中国渔业统计年鉴》以正式出版年份标序。其统计数据起讫日期:渔民家庭收支调查起讫时间为 2022年11月1日至2023年10月31日&#xff0c;其他数据起讫时间为2023年1月1日至2023年12月31日。 二、统计数据中&#xff0c;远洋渔业数据按照远洋渔业管理办法进行统计…

Windows10“大限”将至或加速政企信创进程

近日&#xff0c;微软公司正式宣布将于2025年10月14日终止对Windows 10系统的支持服务。Windows 10“退休”在即&#xff0c;信息安全风险陡增——对此&#xff0c;360织语的安全专家认为&#xff0c;对于政企用户而言&#xff0c;不管是选择继续使用Windows 10&#xff0c;还是…

文本嵌入方案大总结:从词向量到句向量

这里写目录标题 文本嵌入方案总结一、文本嵌入三种层次 词向量应用&#xff1a; 句向量应用&#xff1a; 扩展&#xff1a;文本嵌入和句子相似度、文本匹配的逻辑关系&#xff1f; 二、词向量有哪些方案、优缺点、工具&#xff1f;方案一&#xff1a;统计编码方案二&…

第23天Linux下常用工具(二)

目录 第四章 GDB调试工具 4.1gdb的作用 4.2调试代码的流程 4.3gdb的安装 4.4 gdb的使用 第五章 makefile工程管理工具 5.1makefile的作用 5.2makefile的运行 5.3make的安装 5.4makefile的编写方法 5.5makefile的语法 5.6makefile使用示例 第四章 GDB调试工具 4.1g…

ubuntu22.04与ubuntu24.10使用Remmina远程桌面共享

1. ubuntu22.04启用远程桌面共享 点击Remote Desktop,按下图设置 成功启用 2.ubuntu24.10远程桌面启用 选择远程桌面选项 启用远程桌面共享与远程控制 启用远程登陆

基于51单片机的高压锅控制系统proteus仿真

地址&#xff1a; https://pan.baidu.com/s/16BuxmKYUprTGbkEj_BWGvQ 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectro…

D3的竞品有哪些,D3的优势,D3和echarts的对比

D3 的竞品 ECharts: 简介: ECharts 是由百度公司开发的一款开源的 JavaScript 图表库&#xff0c;提供了丰富的图表类型和高度定制化的配置选项。特点: 易于使用&#xff0c;文档详尽&#xff0c;社区活跃&#xff0c;支持多种图表类型&#xff08;如折线图、柱状图、饼图、散点…

2024年11月13日

1.创业法律指南 留置权和其他三个权 定金和订金 一般保证和连带保证 1.案例 物权编之担保法律制度案例一 冯系养鸡专业户&#xff0c;为改建鸡会和引进良种需资金20万元。冯向陈借款10万元&#xff0c;以自己的一套价值10万元的音响设备抵押&#xff0c;双方立有抵押字据&a…

从电动汽车到车载充电器:LM317LBDR2G 线性稳压器在汽车中的多场景应用

附上LM317系列选型&#xff1a; LM317BD2TG-TO-263 LM317BTG-TO-220 LM317BD2TR4G-TO-263 LM317D2TG-TO-263 LM317D2TR4G-TO-263 LM317TG-TO-220 LM317LBDR2G-SOP-8 LM317LDR2G-SOP-8 LM317MABDTG-TO-252 LM317MABDTRKG-TO-252 LM317MA…

健康之路三度冲击港交所,数字健康医疗平台IPO前景引关注

健康之路股份有限公司&#xff08;HealthyWay Inc.&#xff09;再次向港交所递交招股书&#xff0c;拟在主板上市。此前两次尝试未果&#xff0c;但公司用户基础坚实&#xff0c;业务覆盖广泛&#xff0c;包括健康医疗服务和企业服务及数字营销服务。股东阵容强大&#xff0c;营…

SpringCloud篇(配置中心 - Nacos)

目录 一、Nacos 配置中心 1. 统一配置管理 1.1. 在nacos中添加配置文件 1.2. 从微服务拉取配置 1.2.1. 引入nacos-config依赖 1.2.2. 添加bootstrap.yaml 1.2.3. 读取nacos配置 1.2.4. 页面访问 2. 配置热更新&#xff1a;两种 2.1. 方式一 2.2. 方式二 3. 配置共享…

vue2和vue3的区别详解

vue2 VS vue3 对比vue2vue3配置脚手架cmd命令行可视化方式创建脚⼿架组件通信props、$emit、provide、$arrts、EventBus等props、$emit、provide、inject、arrts等数据监听watch,computedwatch,watchEffect,computed双向绑定Object.definePropertyProxyAPI⽣命周期四个阶段befo…

高中数学:概率-相关运算性质

文章目录 一、概率定义二、运算性质三、事件相互独立四、频率与概率五、练习 一、概率定义 二、运算性质 基本性质 互斥事件的性质 对立事件性质 包含事件的性质 有交集但不包含的事件性质 三、事件相互独立 注意&#xff1a; 四、频率与概率 五、练习

我要学kali-linux之shell脚本编程1

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…