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

排序算法实现:插入排序与希尔排序

目录

一、引言 

二、代码整体结构 

三、宏定义与头文件 

四、插入排序函数(Insertsort)

函数作用 

代码要点分析 

五、希尔排序函数(ShellSort) 

函数作用 

代码要点分析 

六、打印数组函数(PrintSort) 

 函数作用 

代码要点分析 

七、测试函数(TestSort)与主函数(main) 

 函数作用 

代码要点分析 

八、总结 


一、引言
 


在计算机科学领域,排序算法是非常基础且重要的内容。不同的排序算法有着各自的特点和适用场景。本文将基于给定的C语言代码,深入剖析插入排序(Insertion Sort)和希尔排序(Shell Sort)的实现过程,帮助读者更好地理解这两种排序算法的原理与应用。

 

作者主页:共享家9527-CSDN博客
二、代码整体结构
 


代码主要包含了插入排序函数、希尔排序函数、打印数组函数以及测试函数和主函数,整体结构清晰,便于理解和维护。下面我们对每个函数进行详细分析。


三、宏定义与头文件
 


c#define _CRT_SECURE_NO_WARNINGS
#include"Sort.h"


 
 #define _CRT_SECURE_NO_WARNINGS  这一宏定义的作用是在使用一些被认为可能存在安全风险的C标准库函数(如 scanf 、 strcpy 等)时,避免编译器产生警告信息。 #include"Sort.h"  表示包含自定义的头文件 Sort.h ,虽然在给出的代码中未看到该头文件的具体内容,但通常它会包含一些函数声明、类型定义等内容,方便代码的模块化管理。


四、插入排序函数(Insertsort)


c//插排
void Insertsort(int* a, int n){for (int i = 1;i < n;i++){int end = i - 1;int temp = a[i];while (end >= 0){if (temp < a[end]){a[end + 1] = a[end];end--;}else{break;}}a[end + 1] = temp;}
}


函数作用
 


插入排序函数的功能是对给定的整数数组进行排序,排序的基本思想是将一个数据插入到已经排好序的数组中的适当位置。
 


代码要点分析
 


1. 外层循环: for (int i = 1;i < n;i++)  从数组的第二个元素开始(因为第一个元素可以看作是已经排好序的子数组),依次将每个元素插入到前面已排序的子数组中的合适位置。
 
2. 初始化变量: int end = i - 1;  定义 end 变量表示已排序子数组的最后一个元素的下标。 int temp = a[i];  将当前待插入的元素暂存到 temp 变量中。
 
3. 内层循环: while (end >= 0)  当 end 大于等于0时,继续循环,即只要还在已排序的子数组范围内,就进行比较和移动操作。 if (temp < a[end])  如果待插入元素小于当前已排序子数组的最后一个元素,则将该元素向后移动一位,同时 end 减1,继续向前比较。当遇到不满足该条件的元素时,说明找到了待插入元素的合适位置,通过 break 跳出循环。
 
4. 插入操作: a[end + 1] = temp;  将暂存的待插入元素插入到合适的位置。
 


五、希尔排序函数(ShellSort)


c//希尔
void ShellSort(int* a, int n)
{int gap = 9;while (gap > 0){gap /= 2;for (int j = 0;j < gap;j++){for (int i = j;i < n - gap;i += gap){int end = i;int temp = a[i + gap];while (end >= 0){if (temp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = temp;}}}
}


 


函数作用
 


希尔排序是插入排序的一种改进版本,通过将数组按照一定的间隔( gap )进行分组,对每组分别进行插入排序,随着间隔逐渐减小,最终完成整个数组的排序。
 


代码要点分析
 


1. 初始间隔设置: int gap = 9;  定义初始的分组间隔,这里设置为9,不同的初始间隔可能会影响排序的效率。
 
2. 间隔调整循环: while (gap > 0)  当间隔大于0时,继续进行排序操作。每次循环中, gap /= 2;  将间隔逐渐缩小,直到间隔为1时,相当于进行一次普通的插入排序。
 
3. 分组循环: for (int j = 0;j < gap;j++)  对每个分组进行遍历,确保每个分组都能进行插入排序操作。
 
4. 组内插入排序循环: for (int i = j;i < n - gap;i += gap)  对每个分组内的元素进行插入排序,类似于插入排序的过程,但这里元素之间的比较和移动是按照间隔 gap 进行的。
 
5. 插入操作:与插入排序类似,通过比较和移动元素,将当前元素插入到分组内合适的位置。
 


六、打印数组函数(PrintSort)
 


cvoid PrintSort(int* a, int n)
{for (int i = 0;i < n;i++){printf("%d ",a[i]);}printf("\n");
}


 
函数作用
 


该函数的功能是将给定的整数数组按照顺序打印输出,方便查看数组在排序前后的状态。
 


代码要点分析
 


通过一个简单的 for 循环遍历数组,使用 printf 函数逐个输出数组元素,并在最后换行,使输出结果更加清晰易读。
 


七、测试函数(TestSort)与主函数(main)
 


cvoid TestSort()
{int arr[] = { 9,5,1,3,7,8,4,2,6,0 };int n = sizeof(arr) / sizeof(arr[0]);PrintSort(arr, n);Insertsort(arr, n);//ShellSort(arr, n);PrintSort(arr, n);
}int main()
{TestSort();return 0;
}


 
函数作用
 


 TestSort 函数用于测试排序算法的正确性,在函数内部创建一个测试数组,先打印数组的初始状态,然后调用插入排序函数对数组进行排序,再次打印排序后的数组状态。 main 函数则是程序的入口,调用 TestSort 函数来执行测试。
 


代码要点分析
 


1. 在 TestSort 函数中, int arr[] = { 9,5,1,3,7,8,4,2,6,0 };  创建一个包含10个整数的测试数组。 int n = sizeof(arr) / sizeof(arr[0]);  计算数组的元素个数。
 
2. 调用 PrintSort 函数打印数组初始状态,然后调用 Insertsort 函数进行排序,注释掉的 ShellSort(arr, n);  表示如果需要测试希尔排序,可取消注释。最后再次调用 PrintSort 函数打印排序后的数组。
 
3.  main 函数中仅调用 TestSort 函数,程序从这里开始执行。
 


八、总结


通过对上述代码的详细分析,我们深入了解了插入排序和希尔排序的实现过程。插入排序简单直观,适用于小规模数据的排序;希尔排序作为插入排序的改进算法,通过分组和逐渐缩小间隔的方式,提高了排序效率,尤其在处理大规模数据时表现更为出色。在实际应用中,我们可以根据数据的特点和规模,选择合适的排序算法来满足需求。

相关文章:

排序算法实现:插入排序与希尔排序

目录 一、引言 二、代码整体结构 三、宏定义与头文件 四、插入排序函数&#xff08;Insertsort&#xff09; 函数作用 代码要点分析 五、希尔排序函数&#xff08;ShellSort&#xff09; 函数作用 代码要点分析 六、打印数组函数&#xff08;PrintSort&#x…...

UDP协议原理

UDP协议原理 本篇介绍 在前面使用UDP编程时已经基本了解了UDP的工作模式&#xff0c;也知道了UDP有三个特点&#xff1a; 无连接不可靠面向数据报 但是当时并没有具体谈论为什么UDP有以上三个特点&#xff0c;基于这个原因&#xff0c;本篇就会针对这三个原因进行介绍 UDP…...

EtherCAT转Modbus网关如何在倍福plc组态快速配置

EtherCAT转Modbus网关如何在倍福plc组态快速配置 在工业控制领域&#xff0c;EtherCAT和Modbus是两种常见的总线通信协议。EtherCAT以其高速的数据传输和灵活的网络配置被广泛应用于高性能自动化控制系统中&#xff0c;而Modbus则因其简单、稳定且兼容性强而被许多设备所支持。…...

如何设计大模型意图识别?

环境&#xff1a; 大模型 问题描述&#xff1a; 如何设计大模型意图识别&#xff1f; 解决方案&#xff1a; 1. 意图识别定义与核心任务 定义&#xff1a;意图识别&#xff08;Intent Recognition&#xff09;是从用户输入&#xff08;文本、语音等&#xff09;中解析其核…...

FPGA设计中时间单位科普

FPGA设计中时间单位主要有秒s&#xff0c;毫秒ms&#xff0c;微秒us&#xff0c;纳秒ns&#xff0c;皮秒ps&#xff0c; 使用秒s作为单位时一定要谨慎&#xff0c;因为秒s对于FPGA来说是一个很大的单位。FPGA的时钟周期通常是20ns左右&#xff0c;1秒意味着需要等待50000000个…...

DooTask在Linux的离线部署教程

DooTask在Linux的离线部署教程 下载安装包 从网盘中将安装包下载到本地&#xff0c;下载地址 通过网盘分享的文件&#xff1a;DooTask项目管理工具 链接: https://pan.baidu.com/s/1hGmLXonT4c8hLiDP1QBr8w?pwdgdp6 提取码: gdp6 通过网盘分享的文件&#xff1a;DooTask项目…...

Python实现WYY音乐下载

一、需求背景 WYY音乐作为国内主流音乐平台,其歌曲资源丰富但下载接口存在多重加密保护。本文将通过Python结合JS逆向技术,解析其核心加密逻辑,实现免费歌曲的下载功能。 二、技术难点分析 1. 接口加密机制 通过抓包分析可知,网易云核心接口使用两次加密: 第一次:获取…...

Java基础面试题学习

转换成自已的语言来回答&#xff0c;来源小林coding、沉默王二以及其它资源和自已改编。 1、概念 1、说一下Java的特点 我认为Java有很多特点 首先是平台无关性&#xff1a;Java可以实现一次编译到处运行&#xff0c;因为Java的编译器将源代码编译成字节码&#xff0c;使得该…...

【笔记】深度学习模型训练的 GPU 内存优化之旅:重计算篇

开设此专题&#xff0c;目的一是梳理文献&#xff0c;目的二是分享知识。因为笔者读研期间的研究方向是单卡上的显存优化&#xff0c;所以最初思考的专题名称是“显存突围&#xff1a;深度学习模型训练的 GPU 内存优化之旅”&#xff0c;英文缩写是 “MLSys_GPU_Memory_Opt”。…...

AI革命!蓝耘携手海螺AI视频,打造智能化视频新纪元

AI革命&#xff01;蓝耘携手海螺AI视频&#xff0c;打造智能化视频新纪元 前言 在这个信息爆炸的时代&#xff0c;视频已经成为我们获取信息、学习新知识的重要方式。而随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;AI与视频内容的结合为我们带来了全新的…...

Django+celery+flower

Djangoceleryflower Django的定时任务及可视化监控Django Django的定时任务及可视化监控 Django的定时任务&#xff0c;以及可视化监控。 Django Django&#xff1b; 首先在python中新建虚拟环境并激活 pip install virtualenv python -m venv venv source venv/bin/activa…...

MapReduce处理数据流程

&#xff08;一&#xff09;Shuffle MapReduce中的Shuffle过程指的是在Map方法执行后、Reduce方法执行前对数据进行分区排序的阶段 &#xff08;二&#xff09;处理流程 1. 首先MapReduce会将处理的数据集划分成多个split&#xff0c;split划分是逻辑上进行划分&#xff0c;…...

基于springboot的教务系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 这些年随着Internet的迅速发展&#xff0c;我们国家和世界都已经进入了互联网大数据时代&#xff0c;计算机网络已经成为了整个社会以及经济发展的巨大动能&#xff0c;各个高校的教务工作成为了学校管理事务的重要目标和任务&#xff0c;因此运用互联网技术来提高教务的…...

潮流霓虹酸性渐变液体流体扭曲颗粒边缘模糊JPG背景图片设计素材 Organic Textures Gradients Collection

这个系列将液体运动、霓虹灯和热浪扭曲提炼成一组有机纹理。渐变像水面上的油一样荡漾&#xff0c;模糊了科幻小说与自然之间的界限。这种未来主义的边缘&#xff0c;加上近乎生物的感觉&#xff0c;与正在进行的抽象数字超现实主义浪潮完美同步。 这套具有 20 种原始纹理和 20…...

现代时尚标签海报包装网站设计几何风PSAI无衬线英文字体安装包 Matahari Sans Font Family

Matahari&#xff08;英语&#xff1a;Sun&#xff09;是生命的动力源泉。与日常生活的其他部分协同作用的力量和能量的象征。这是我们人类需要的最基本的东西之一&#xff0c;就像交流一样。就像 Matahari 本身一样&#xff0c;文字的力量足以维持生计。 参考怪诞字体并受到埃…...

Spring MVC响应数据

handler方法分析 /*** TODO: 一个controller的方法是控制层的一个处理器,我们称为handler* TODO: handler需要使用RequestMapping/GetMapping系列,声明路径,在HandlerMapping中注册,供DS查找!* TODO: handler作用总结:* 1.接收请求参数(param,json,pathVariable,共享域等…...

jmeter验证正则表达式提取值是否正确

正则提取 验证提取是否正确...

共注意力机制及创新点深度解析

一、核心原理剖析 1. 基本思想 共注意力机制&#xff08;Co-Attention&#xff09;通过建立双向注意力交互通道&#xff0c;同步学习图像和问题两个模态的关键信息。与传统单向注意力相比&#xff0c;其核心创新在于&#xff1a; ​双向信息流&#xff1a;图像特征和问题特征…...

联想台式电脑启动项没有U盘

开机按F12&#xff0c;进入启动设备菜单&#xff0c;发现这里没有识别到插在主机的U盘&#xff1f; 解决方法 1、选上图的Enter Setup或者开机按F2&#xff0c;进入BIOS设置 选择Startup -> Primary Boot Sequence 2、选中“Excludeed from boot order”中U盘所在的一行 …...

基于 Python 爬取 TikTok 搜索数据 Tiktok爬虫(2025.3.17)

1. 前言 在数据分析和网络爬虫的应用场景中&#xff0c;我们经常需要获取社交媒体平台的数据&#xff0c;例如 TikTok。本篇文章介绍如何使用 Python 爬取 TikTok 用户搜索数据&#xff0c;并解析其返回的数据。 结果截图 2. 项目环境准备 在正式运行代码之前&#xff0c;我…...

【HarmonyOS Next】鸿蒙中App、HAP、HAR、HSP概念详解

【HarmonyOS Next】鸿蒙中App、HAP、HAR、HSP概念详解 &#xff08;图1-1&#xff09; 一、鸿蒙中App、HAP、HAR、HSP是什么&#xff1f; &#xff08;1&#xff09;App Pack&#xff08;Application Package&#xff09; 是应用发布的形态&#xff0c;上架应用市场是以App Pa…...

计算机二级MS之Excel

声明&#xff1a;跟着大猫和小黑学习随便记下一些笔记供大家参考&#xff0c;二级考试之前将持续更新&#xff0c;希望大家二级都能轻轻松松过啦&#xff0c;过了二级的大神也可以在评论区留言给点建议&#xff0c;感谢大家&#xff01;&#xff01; 文章目录 考题难点&#x…...

Unity导出WebGL,无法加载,data文件无法找到 404(NotFound)

问题&#xff1a;data文件无法找到404Not found 示例是使用IIS托管启动 F12可以看到not found 的报错 解决办法&#xff1a; iis无法识别data文件&#xff0c;在MIME类型中增加data 类型&#xff1a;application/octet-stream 添加之后&#xff0c;会在根目录下生产一个…...

洛谷题目: P1225 黑白棋游戏 题解 (本题难)

题目传送门&#xff1a; P1225 黑白棋游戏 - 洛谷 (luogu.com.cn) 前言&#xff1a; 这道题要求我们找出从黑白棋游戏的初始棋盘状态变化到目标棋盘状态的最短着棋序列&#xff0c;也就是要找到最少的交换相邻方格棋子的步数以及每一步具体的交换位置。我们可以使用广度优先…...

网络安全技术分析:攻防演进、核心技术与未来挑战

本文系统梳理网络安全技术发展脉络&#xff0c;聚焦漏洞利用、威胁检测、数据保护三大核心领域&#xff0c;结合APT攻击、勒索软件、零日漏洞等典型案例&#xff0c;解析防火墙、IDS、零信任架构等技术原理。通过分析2023年全球重大安全事件&#xff08;如MOVEit漏洞攻击、Lock…...

SpringBoot与Redisson整合,用注解方式解决分布式锁的使用问题

文章引用&#xff1a;https://mp.weixin.qq.com/s/XgdKE2rBKL0-nFk2NJPuyg 一、单个服务 1.代码 该接口的作用是累加一个值&#xff0c;访问一次该值加1 RestController public class LockController {Autowiredprivate StringRedisTemplate stringRedisTemplate;GetMappin…...

通过Typora + PicGo + 阿里云对象存储(OSS)实现图床

文章目录 通过Typora PicGo 阿里云对象存储&#xff08;OSS&#xff09;实现图床1 准备工作1.1 阿里云对象存储 OSS配置创建oss存储空间bucket获取AccessKey 1.2 PicGo配置1.3 Typora配置 2 使用流程3 常见问题和解决3.1 创建asesskey3.2 You have no right to access this o…...

爱普生FC-12M石英晶体谐振器精准时钟源解决方案

在当今数字化时代&#xff0c;电子设备无处不在&#xff0c;从我们日常使用的智能手机、平板电脑&#xff0c;到复杂的工业控制系统、通信基站&#xff0c;每一台设备的稳定运行都离不开精准的时钟信号。而在众多提供时钟信号的元件中&#xff0c;爱普生 FC-12M 石英晶体谐振器…...

【css酷炫效果】纯CSS实现手风琴折叠效果

【css酷炫效果】纯CSS实现手风琴折叠效果 缘创作背景html结构css样式完整代码效果图 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;https://download.csdn.net/download/u011561335/90492015 缘 创作随缘&#xff0c;不定时更新。 创作背景 刚看到csdn出活动了&am…...

AI辅助的逆向分析

AI大模型结合反编译工具与AI的辅助分析能力&#xff0c;已能实现部分代码逻辑的还原与重构。 1. 技术实现路径 &#xff08;1&#xff09;二进制文件预处理与反编译 反编译工具&#xff1a;需先使用IDA Pro、Ghidra等工具将二进制文件转换为低级中间表示&#xff08;如汇编代…...