【C语言】排序算法——希尔排序以及插入排序 ——详解!!!

【C语言】排序算法——希尔排序以及插入排序 ——详解!!!

【C语言】排序算法——希尔排序以及插入排序详解

前言

在学习循环的时候,我们学习到了冒泡排序这个算法
那么,除了冒泡排序,还有什么排序算法呢?
今天给大家带来的是插入排序以及希尔排序

一 、插入排序

1. 视频演示

首先给大家看一段视频,让大家先看看插入排序是怎么运行的

插入排序演示

2. 算法思想

我们可以从视频里看见,插入排序就像是我们打扑克牌一样,一张一张插入到了有序队列
每次都有一个数据 x(标红的)要跟前面的数据一一比大小
若 x 比前一个数据小,则 x 就再向前比较
若 x 比前一个数据大,则 x 就插入到这个数据的后面

3. 实现思路

由视频可知,数据 x(标红的)前面的序列都是有序的,故每一次只需要将 x 插入其中即可
  • 第一步
我们给定下标范围【0,end】区间是有序的,tmp为要插入的数据的值,故tmp为下标为end + 1所对应的值
  • 第二步
将下标为end所对应的值与tmp比较
tmp比前一个数据小,则tmp就再向前一个数比较
tmp比前一个数据大,则tmp就插入到这个数据的后面
  • 第三步
循环遍历整个数组,直到数组全部插入进去

4. 代码演示

// 插入排序voidInsertSort(int* a,int n){for(int i =0; i < n -1; i++){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. 算法思想

当你看完视频,你也许就会发现希尔排序和插入排序很相似
只不过,希尔排序相当于间隔插入排序 n 次
而每一次都越来越接近有序数组,直到最后一次排成有序

3. 实现思路

那该怎么实现呢?

(1)分组

  • 第一步:分组
由视频可知,每次排序并不是一个一个排,而是每间隔几个数据成一组来排序
一组一组排,这组排完就到下一组,直到全部排完
这里先假设分成3组数据进行排序,也就是每隔2个数据成一组

如图:

在这里插入图片描述

(2)预排序

  • 第二步:预排序
分成了几组后,每一组就开始插入排序,称为预排序
插入排序前面讲了,就不赘述了

代码演示:
( gap 就是被分成了几组)

int gap = n;while(gap >1){ gap =3;for(int i =0; i < n - gap; i++){int end = i;int tmp = a[end + gap];while(end >=0){if(tmp < a[end]){ a[end + gap]= a[end]; end -= gap;}else{break;}} a[end + gap]= tmp;}}
预排序是干什么呢?
预排序的主要功能就是让一个数组接近有序,为了给后面的插入排序节省大量的时间

(3)最终排序

  • 第三步:最终排序
现在,在排序完三组数据后,我们的数组已经很接近有序
所以现在只需要用插入排序排最后一次收尾就行了

这里就不进行代码演示了,就是一个普通的插入排序

(4)gap的取值

  • 第四步:gap的取值
、前面我们的代码中 gap 的取值定为了 3,但是这不可能对于每个数组都适应
那么该如何给 gap 来取值呢?
根据科学的实验,发现当gapn / 3时,排序最快
所以,在排序的过程中,gap 的值是不断发生变化的
、到这里,可能已经有人发现了,刚刚写的预排序和前面写的插入排序几乎一摸一样
只是将 1 变成了 gap
>其实,当gap1时,就是普通的插入排序

那么我们能不能设计一个循环,既能在排序的过程中满足gap的动态变化,又能使gap的最后一次取值为 1 呢?

所以我们可以有一些改进,在函数外面再套一层循环:
int gap = n;
while (gap > 1)
{
gap = gap / 3 + 1;
…………
…………//这里省去代码
}

这样,gap能够很好的动态变化,且最后一次循环的gap值为1,恰好能完成一次普通的插入排序

4. 代码演示

代码演示:

// 希尔排序voidShellSort(int* a,int n){int gap = n;while(gap >1){ gap = gap /3+1;for(int i =0; i < n - gap; i++){int end = i;int tmp = a[end + gap];while(end >=0){if(tmp < a[end]){ a[end + gap]= a[end]; end -= gap;}else{break;}} a[end + gap]= tmp;}}}

结语

OK,本期的排序算法详解到这里就结束了

若内容对大家有所帮助,可以收藏慢慢看,感谢大家支持

本文有若有不足之处,希望各位兄弟们能给出宝贵的意见。谢谢大家!!!

新人,本期制作不易希望各位兄弟们能动动小手,三连走一走!!!

支持一下(三连必回QwQ)

Read more

python 多版本管理(pyenv)

上篇文章提到了uv 可以进行 pip 包管理和 虚拟环境构建,其实,对于我们来说,还有一个需求,就是多个python环境进行管理,刚好找了下,发现了这个pyenv工具。话不多少,直接开始。         pyenv(Windows 下为pyenv-win)是Python 版本管理神器,核心解决「多 Python 版本共存、版本冲突、环境不一致」的痛点,让你在一台电脑上无痛切换不同 Python 版本,不用手动改环境变量、卸载重装,是 Python 开发的必备工具。         一、pyenv可以干什么事情? 1.1 多版本 Python 共存(最核心)         手动管理多个 Python 版本时,你需要反复修改环境变量、记住不同版本的安装路径,极易混乱;而 pyenv 能:

By Ne0inhk
Python异步编程:深入理解asyncio核心原理与实战

Python异步编程:深入理解asyncio核心原理与实战

本文深入剖析Python异步编程核心库asyncio的工作原理,从事件循环、协程、Future到Task的完整技术栈。通过真实性能对比数据、企业级案例和5个架构流程图,全面解析async/await底层机制。涵盖异步编程最佳实践、性能优化技巧和故障排查方案,帮助开发者掌握高并发程序设计精髓,提升I/O密集型应用性能数倍。 1 异步编程:为什么它是Python高性能的关键 在我13年的Python开发经验中,异步编程是性能优化的分水岭。记得曾经处理一个需要调用10个外部API的任务,同步版本需要20多秒,而改用异步后仅需2秒——这种10倍性能提升让我彻底认识到异步编程的价值。 1.1 同步 vs 异步:直观对比 想象你在餐厅点餐的场景: 同步:点完第一个菜后站着等厨师做完,再点第二个菜,效率极低 异步:点完所有菜后找座位等待,厨师并行制作,服务员送餐时通知你 这就是异步编程的核心优势:避免不必要的等待,充分利用等待时间执行其他任务。 import time import asyncio   # 同步版本:顺序执行,总耗时=各任务耗时之和 def sync_

By Ne0inhk
【办公类-119-02】20260201三个园区“国旗下讲话” 按班级组合docx模板(AI+excel+python)

【办公类-119-02】20260201三个园区“国旗下讲话” 按班级组合docx模板(AI+excel+python)

背景需求 上学期国旗下讲话,按照园区合并成一个WORD(里面有22张表格),并发布成共享编辑模式 【办公类-119-01】20250824一分园“国旗下讲话”批量模板(托班小班4周轮流1次)https://mp.ZEEKLOG.net/mp_blog/creation/editor/150716284 但是实际操作中,出现问题 1、网络数据遗失: 10月我在网络共同编辑里面写好内容,插入照片,但是1月再看,内容不见了,只能重新做 2、填写不便: 部分老师说:不会用共享编辑,搭档就单独发了WORD合并版本,但是里面有22个表格,班主任需要翻页找到自己班级的页面,填写内容,再翻页4页或6页,才能找到自己的内容。很多老师只能删除非自己班级的页面内容,再填写3、 3、照片移位: 一个格子插入两张照片,照片的插入样式多样(嵌入型,上下环绕、四周环绕),照片大量移位。打印时需要检查和调整位置,确保表格内容在一页上。

By Ne0inhk

什么是Python中的库以及如何导入使用库

一、引言 Python被誉为“胶水语言”,不仅语法简洁,更重要的是它拥有极其丰富的生态系统。无论是做数据分析、Web开发、人工智能,还是自动化脚本,你几乎总能找到一个现成的工具来帮你完成任务——这些工具,就是我们常说的 “库(Library)”。 但很多初学者在刚接触Python时,常常对“库”“模块”“包”这些概念感到困惑,也不知道该如何正确地导入和使用它们。本文将从零开始,带你搞清楚: * 什么是Python中的库? * 库有哪些类型? * 如何导入并使用它们? * 如何安装第三方库? 二、什么是Python中的库? 简单来说,库就是别人(或你自己)写好的代码集合,封装了特定功能,你可以直接调用,而无需从头编写。 比如: * 想发送一个HTTP请求?不用自己实现TCP协议,直接用 requests 库。 * 想处理Excel表格?用 pandas 几行代码搞定。 * 想生成随机数?标准库里的 random

By Ne0inhk