c语言排序算法之七(希尔排序)

前言

以下内容是被验证可以有效理解希尔排序,代码也较容易理解。如果你发现还有很多需要增加的,欢迎留言。

为什么要单独写排序算法这一系列,看过一些贴子普遍篇幅较长。看完还依旧云里雾里,难以直观理解原理及整个过程。代码永远是基于理解的基础上才能实现。

执行过程能动画展示需方便清晰,同时需具备单步调试,方便没理解的可以回看。

语言比较推荐c语言,高级语言库函数较多,人都有惰性思维,将自己置身于环境中训练也是至关重要。

感悟心得:初级阶段学习算法,在理解的基础上每天徒手2种算法。每种算法都是一种不同的思维方式,相信第一阶段坚持30天后会有不一样的收获。

实现原理

希尔排序(Shell Sort)是一种插入排序的改进版本,其核心思想是首先将待排序的数组按照一定的间隔分组,对每组数据进行插入排序,然后逐渐减小间隔,重复分组和排序的过程,直到间隔为1,此时整个数组被视为一个组,进行最后一次插入排序。希尔排序的增量序列选择是数学上的一个难题,但希尔最初建议的增量序列是{n/2, (n/2)/2, ..., 1},其中n是数组的长度。

希尔排序的详细过程可以概括为以下几个步骤:

  1. 初始化增量:选择一个初始增量gap,通常为数组长度的一半。如果数组长度为奇数,向下取整。

  2. 分组排序:将数组分为多个子组,每个子组包含间隔为gap的元素。对每个子组使用直接插入排序进行排序。

  3. 减小增量:减小增量gap,通常为gap/2。重复步骤2,直到增量减至1。

  4. 最终排序:当增量为1时,整个数组被视为一个组,进行最后一次直接插入排序。

希尔排序的时间复杂度分析较为困难,因为它依赖于增量序列的具体形式。在特定情况下,希尔排序的时间复杂度约为O(n^1.3),在最坏情况下可能达到O(n^2)。希尔排序的空间复杂度为O(1),因为它只需常数个额外空间来存储增量和索引。希尔排序是不稳定的排序算法,因为相同的关键字可能会在分组过程中改变它们的相对次序。

动画展示过程(Shell Sort)

Comparison Sorting Visualization

具体代码实现

#include <stdio.h>void shell_sort(int arr[], int len) {int i, j, gap;for (gap = len / 2; gap > 0; gap /= 2) {for (i = gap; i < len; i++) {int temp = arr[i];for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {arr[j] = arr[j - gap];}arr[j] = temp;}}
}int main() {int arr[] = {12, 34, 54, 2, 3, 4, 34, 56, 7, 9, 10, 12};int len = (int) sizeof(arr) / sizeof(*arr);shell_sort(arr, len);for (int i = 0; i < len; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}

Q1:

A1:

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

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

相关文章

RK3568 学习笔记 : 精简 u-boot env 默认复杂的多种引导启动设置

前言 环境&#xff1a; 正点原子 Atompi-CA1 RK3568 开发板、正点原子 DLRK3568 开发板&#xff0c;&#xff08;一时脑热买了两块 RK3568 开发板&#xff09;&#xff0c;Atompi-CA1 RK3568 开发板比较小巧&#xff0c;利于一些前期的嵌入式 Linux 开发学习与实践。 RK3568 开…

VGA项目:联合精简帧+双fifo+sobel算法 实现VGA显示(未完)

前言&#xff1a;该项目实际上是在很多基础的小练习上合成起来的&#xff0c;例如涉及到uart&#xff08;rs232&#xff09;的数据传输、双fifo流水线操作、VGA图像显示&#xff0c;本次内容在此基础上又增添了sobel算法&#xff0c;能实现图像的边沿监测并VGA显示。 文章目录…

假期的最后一天...

今天是假期最后一天&#xff0c;这个假期我也跑了不少高速&#xff0c;说实话&#xff0c;看到了梅大高速塌方事故&#xff0c;心情一直不是滋味... 我就在思考&#xff0c;我们究竟在追求什么&#xff1f; 有人说生命是脆弱的&#xff0c;也有人说生命是顽强的&#xff0c;是呀…

【C++风云录】科学可视化与数据分析:从特性探索到高级应用实践

科技赋能&#xff1a;六大工具助力你的职业生涯 前言 在本文中&#xff0c;我们将对六种广泛使用的计算机视觉和图形库进行深入介绍&#xff0c;这些库包括VTK、D3.js、OpenCV、Eigen、Boost和PCL。每个章节都会包含库的基本介绍&#xff0c;系统要求&#xff0c;安装和配置过…

Unity MeshRenderer 入门

概述 在项目制作过程中&#xff0c;肯定缺少不了模型的使用&#xff0c;那就一定接触过MeshRenderer&#xff0c;也许还有你不理解的地方&#xff0c;接下来让我们来学习一下这部分的内容吧。 Mesh Filter&#xff08;网格过滤器&#xff09; Mesh:提供一个网格的参考&#xf…

医学图像处理:nii格式转换(3D切片为2D)

目录 NIFTI文件结构 读取NII文件 ITK-SNAP安装 使用方法 NII转PNG NIFTI文件结构 NIFTI 格式&#xff0c;是一种用于存储和交换医学成像数据的文件格式&#xff0c;特别适用于神经影像学领域。NIFTI文件通常有两个扩展名&#xff1a;.nii&#xff08;用于图像数据&#xf…

持续总结中!2024年面试必问 100 道 Java基础面试题(三十二)

上一篇地址&#xff1a;持续总结中&#xff01;2024年面试必问 100 道 Java基础面试题&#xff08;三十一&#xff09;-CSDN博客 六十三、接口里面可以写方法实现吗&#xff1f; 在Java中&#xff0c;接口&#xff08;Interface&#xff09;主要用于定义一组抽象方法&#xf…

MySQL 优化 - index_merge 导致查询偶发变慢

文章目录 前言问题描述原因分析总结 前言 今天遇到了一个有意思的问题&#xff0c;线上数据库 CPU 出现了偶发的抖动。定位到原因是一条查询语句偶发变慢造成的&#xff0c;随后通过调整表中的索引解决。 问题描述 下方是脱敏后的 SQL 语句&#xff1a; select oss_path f…

字节跳动后端或大数据基础知识面试题及参考答案(2万字长文)

目录 Redis的数据类型 Redis数据类型的底层数据结构 三次握手、四次挥手 Redis持久化机制

搜索算法系列之三(插值查找)

前言 插值查找仅适用于有序数据、有序数组&#xff0c;和二分查找类似&#xff0c;更讲究数据有序均匀分布。 算法原理 插值查找(interpolation search)是一种查找算法&#xff0c;它与二分查找类似&#xff0c;但在寻找元素时更加智能化。这种算法假设数据集是等距的或者有…

VMP 简单源码分析

虚拟机 获取CPU的型号 实现了一个指令集解释器&#xff0c;每个操作码对应一个特定的处理函数&#xff0c;用于执行相应的指令操作。在执行字节码时&#xff0c;解释器会根据操作码查找并调用相应的处理函数来执行指令。 截获异常 先由虚拟机处理 处理不了再抛出异常 priva…

Python日志记录:全面指南

基本原理 日志记录是软件开发中的一个核心组成部分&#xff0c;它帮助开发者跟踪程序的运行流程&#xff0c;捕获程序执行期间的重要事件。日志记录可以作为程序运行状态的连续监控&#xff0c;记录用户细节、IP地址访问信息等重要数据。当发生错误时&#xff0c;日志不仅提供…

(学习日记)2024.05.12:UCOSIII第六十六节:常用的控制宏介绍 第二部分

之前的章节都是针对某个或某些知识点进行的专项讲解&#xff0c;重点在功能和代码解释。 回到最初开始学μC/OS-III系统时&#xff0c;当时就定下了一个目标&#xff0c;不仅要读懂&#xff0c;还要读透&#xff0c;改造成更适合中国宝宝体质的使用方式。在学完野火的教程后&a…

【LLM】动手部署个人知识库助手

文章目录 动手部署个人知识库助手环境依赖项目运行总结 动手部署个人知识库助手 经过前面章节的学习&#xff0c;理解了LLM、向量知识库等知识&#xff0c;本章节开始实践部署个人知识库助手。 本次部署的项目github地址个人知识库助手项目 环境依赖 技术资源要求 CPU: Int…

MySql#MySql安装和配置

目录 一、卸载不需要的环境 二、安装mysql yum 源 三、开始安装 四、如果保证安装成功呢&#xff1f; 五、MySql 启动&#xff01; 六、登录mysql 七、配置文件说明 八、设置开机启动&#xff01; 本次安装是在Linux环境在centos7中完成 首先先将自己切换成root 一、…

分页封装类

加油&#xff0c;新时代打工人&#xff01; package com.love.starter.common.util;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest; import java.util.Map;/*** 计算页开始及结束位置** author Administrator*/ public c…

MySQL数据库——20.索引

在 MySQL 中&#xff0c;索引是一种特殊的数据结构&#xff0c;用于快速查找数据库表中的数据。索引可以帮助提高查询速度&#xff0c;特别是对于大型数据表而言&#xff0c;使用索引可以大大减少查询的时间复杂度。 索引类 普通索引&#xff08;Normal Index&#xff09;&am…

基于springboot实现图书电子商务网站系统项目【项目源码+论文说明】

基于springboot实现图书电子商务网站系统演示 摘要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱…

flowable流程跳转或退回到网关上的用户节点后流程走不下去了

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

在Ubuntu上搭建并通过systemctl管理Minecraft Java版服务器

本教程将详细介绍如何在Ubuntu操作系统上搭建一个Minecraft Java版服务器&#xff0c;并使用systemctl服务来管理服务器的启动、停止和重启。同时&#xff0c;我们还将探讨如何通过NGINX设置TCP/UDP转发&#xff0c;使得玩家能够通过域名方便地连接到你的Minecraft服务器。 准…