深入理解C语言:详解直接插入排序的实现与优化

目录

引言

一、直接插入排序的相关概念

1.1、基本概念

1.2、直接插入排序过程详解

二、代码实现

三、时间复杂度

四、希尔排序

4.1、希尔排序的陈述

4.2、代码实现

4.3、时间复杂度

结语


引言

在计算机科学的世界里,排序算法是基础且重要的组成部分。它们是组织和处理数据的核心工具,能够让数据更易于检索、分析和理解。今天,我们将一同探讨一种简单而经典的排序算法——直接插入排序。 尤其对于初学者来说,理解直接插入排序的原理和实现,能够帮助你更好地掌握C语言的编程技巧,并为后续学习更复杂的排序算法奠定坚实的基础。本文将结合C语言代码实例,带你深入理解直接插入排序的原理、实现方法,并探讨其优缺点,让你能够轻松掌握这一基础算法。

一、直接插入排序的相关概念

1.1、基本概念

直接插入排序是插入排序的一种,其核心思想是:把待排序的序列,按其关键码值的大小逐个插入到一个已经排好序的有序序列中。

通过核心思想,我们了解到,直接插入排序的前提条件是有一个有序序列,那么,我们还没进行直接插入排序,难道就需要利用其他算法先排序一遍吗?当然不是,这里有个很隐晦的条件——单个元素也是有序序列!是不是感觉有点牵强,但是仔细想想,也确实是这样的。

1.2、直接插入排序过程详解

通俗点说,就是先找出一个有序序列(单个元素,一般用首元素),然后依次遍历后面的元素,然后在看看后面的元素适合放在哪个位置,就放在哪个位置

那么,具体的操作应该怎样呢?

首先,我们要创建两个变量,end 存放元素的下标,tmp存放的是下标对应的元素,而且,tmp 存放的元素是 arr[end+1] ,如图:

其次,判断 end 指向的元素 与 tmp 存放的元素比大小,如果比 tmp 大了,则 end 的元素覆盖 end+1的元素,如图:

直到 end 小于0为止。目前截止,这只是第一个循环,结束后,要将tmp的元素放到 arr[end+1] 中。

从第二循环开始, end 就等于 1 了,然后等于3 ,一直到倒数第二元素结束。

在上面的动图循环完成后,end 将会变成3 ,开始下一轮的操作。一直到倒数第二个元素为止,因为tmp始终比end大一 ,又不能让tmp越界访问。

二、代码实现

void InsertSort(int* arr, int n)
{assert(arr);for (int i = 0; i < n - 1; i++){int end = i;int tmp = arr[end + 1];while (end >= 0){if (arr[end] > tmp){arr[end + 1] = arr[end];end--;}else{break;}}arr[end + 1] = tmp;}
}

代码这里正常写就行了,注意end的停止范围,不能让tmp越界访问哦!

三、时间复杂度

通过上面代码,可以看到有两个循环,而且结合过程,就知道它把序列遍历了两遍,所以时间复杂度为 O(N^2)  ,当然,最好的情况就是序列本来就是有序或者近似有序的,则时间复杂度就变为O(N)

四、希尔排序

前面提到,直接插入算法的时间复杂度为O(N^2) ,而只有在待排序列是有序的或者近似有序的时候,它的时间复杂度才能降为 O(N)。那么,有没有什么办法可以降低直接插入排序的时间复杂度呢?有的,那就是希尔排序

4.1、希尔排序的陈述

先选定一个整数,把带待排序文件所有记录分成各组,所有的距离相等的记录分在同一组内,并对每一组内的记录进行排序,然后 gap = gap/3 +1 得到下一个整数,再将序列分割成各组,进行插入排序。当 gap = 1时,就相当于直接插入排序

如图,是 gap = 3 时的分组

将每组排完序后:

gap = 3/3 +1 = 2, 所以就是这样分组的:

每组排好序后:

接下来的 gap = 2/3+1 = 1 ,也就是一个元素一组,相当于直接插入排序:

此刻再看,待排序序列已经成为一个近似有序序列,甚至是有序序列,这样,时间复杂度只有O(N)!

4.2、代码实现

void ShellSort(int* arr, int n)
{assert(arr);int gap = n;while (gap > 1){gap = gap / 3 + 1;for (int i = 0; i < n - gap; i++){int end = i;int tmp = arr[end + gap];while (end >= 0){if (arr[end] > tmp){arr[end + gap] = arr[end];end -= gap;}else{break;}}arr[end + gap] = tmp;}}
}

这里要提一嘴,分组时的插入排序算法和直接插入排序算法是一样的,区别就在于,直接插入排序元素是一个挨着一个的,而分组元素中间有个 gap ,,把gap看成1就是直接插入排序了。因此,分组的排序只需要在直接排序算法的基础上把1改为gap就行了。

4.3、时间复杂度

有大佬说过希尔排序的时间复杂度非常复杂,但最后还是给出了具体的值:O(N^1.3)。鄙人水平有限,这里就不推导了。

可以看到,希尔排序的时间复杂度比直接插入排序的时间复杂度要小的很多,从某种意义上说,希尔排序即是一种新的排序,也是直接插入排序的延伸和改进!

结语

恭喜你,你已经掌握了C语言插入排序算法的核心知识! 通过本文的学习,你不仅理解了直接插入排序的原理,还学会了用C语言实现它,并了解了它的优缺点。 掌握直接插入排序,是成为一名合格程序员的必经之路。希望你能够将所学知识应用到实际项目中,不断提升自己的编程能力。 记住,实践是检验真理的唯一标准,多写代码,多思考,你就能在编程的世界里越走越远! 祝你在编程的道路上越走越好!

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

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

相关文章

【DRAM存储器五十五】LPDDR5介绍--command bus training

👉个人主页:highman110 👉作者简介:一名硬件工程师,持续学习,不断记录,保持思考,输出干货内容 参考资料:《某LPDDR5数据手册》 、《JESD209-5A》 在为高频或中频操作启用ODT之前,必须对L

一道曾经百度面试题

&#x1f680;个人主页&#xff1a;BabyZZの秘密日记 &#x1f4d6;收入专栏&#xff1a;C语言 &#x1f30d;文章目入1. 题目重现2. 大小端到底在比什么&#xff1f;3. 解法一&#xff1a;联合体&#xff08;union&#xff09;为什么一行就够&#xff1f;使用示例4. 解法二&am…

VIKOR(Multi-criteria Optimization and Compromise Solution)简介与简单示例

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

【算法训练营Day18】二叉树part8

文章目录修剪二叉搜索树将有序数组转换为二叉搜索树把二叉搜索树转换为累加树修剪二叉搜索树 题目链接&#xff1a;669. 修剪二叉搜索树 解题逻辑&#xff1a; 因为在删除的同时要保证相对结构&#xff0c;所以我们不能沿用上一篇文章中的删除逻辑&#xff0c;新的删除逻辑为&…

【C++篇】“内存泄露”的宝藏手段:智能指针

目录 智能指针的使用场景分析 RAII和智能指针的设计思路 C标准库智能指针的使用 auto_ptr的使用&#xff1a; unique_ptr的使用&#xff1a; shared_ptr的使用&#xff1a; 模拟shared_ptr: 定制删除器&#xff1a; shared_ptr的循环引用 weak_ptr 智能指针的使用场景…

【密码学】4. 分组密码

目录分组密码分组密码概述Feistel 密码结构数据加密标准&#xff08;DES&#xff09;差分密码分析与线性密码分析分组密码的运行模式国际数据加密算法&#xff08;IDEA&#xff09;高级加密标准&#xff08;AES&#xff0c;Rijndael&#xff09;中国商用密码 SM4祖冲之密码&…

单片机(STM32-WIFI模块)

一、WIFI模块介绍 1. ESP12-F模组介绍 1.1 简介 ESP12-F模组&#xff08;安信可&#xff08;Ai-Thinker&#xff09;ESP8266系列模组&#xff09;是一款基于乐鑫&#xff08;Espressif&#xff09;公司ESP8266芯片的Wi-Fi无线通信模块&#xff0c;广泛应用于物联网&#xff0…

PyTorch 数据类型和使用

关于PyTorch的数据类型和使用的学习笔记 系统介绍了PyTorch的核心数据类型Tensor及其应用。Tensor作为多维矩阵数据容器&#xff0c;支持0-4维数据结构&#xff08;标量到批量图像&#xff09;&#xff0c;并提供了多种数值类型&#xff08;float32/int64等&#xff09;。通过…

[python刷题模板] LogTrick

[python刷题模板] LogTrick 一、 算法&数据结构1. 描述2. 复杂度分析3. 常见应用4. 常用优化二、 模板代码1. 特定或值的最短子数组2. 找特定值3. 找位置j的最后一次被谁更新4. 问某个或和的数量三、其他四、更多例题五、参考链接一、 算法&数据结构 1. 描述 LogTric…

Vim与VS Code

Vim is a clone, with additions, of Bill Joys vi text editor program for Unix. It was written by Bram Moolenaar based on source for a port of the Stevie editor to the Amiga and first released publicly in 1991.其实这个本身不是 IDE &#xff08;只有在加入和配置…

[2025CVPR-图象分类方向]CATANet:用于轻量级图像超分辨率的高效内容感知标记聚合

​1. 研究背景与动机​ ​问题​&#xff1a;Transformer在图像超分辨率&#xff08;SR&#xff09;中计算复杂度随空间分辨率呈二次增长&#xff0c;现有方法&#xff08;如局部窗口、轴向条纹&#xff09;因内容无关性无法有效捕获长距离依赖。​现有局限​&#xff1a; SPI…

课题学习笔记3——SBERT

1 引言在构建基于知识库的问答系统时&#xff0c;"语义匹配" 是核心难题 —— 如何让系统准确识别 "表述不同但含义相同" 的问题&#xff1f;比如用户问 "对亲人的期待是不是欲&#xff1f;"&#xff0c;系统能匹配到知识库中 "追名逐利是欲…

在Word和WPS文字中把全角数字全部改为半角

大部分情况下我们在Word或WPS文字中使用的数字或标点符号都是半角&#xff0c;但是有时不小心按错了快捷键或者点到了输入法的全角半角切换图标&#xff0c;就输入了全角符号和数字。不用担心&#xff0c;使用它们自带的全角、半角转换功能即可快速全部转换回来。一、为什么会输…

数据结构的基本知识

一、集合框架1、什么是集合框架Java集合框架(Java Collection Framework),又被称为容器(container),是定义在java.util包下的一组接口(interfaces)和其实现类(classes).主要表现为把多个元素(element)放在一个单元中,用于对这些元素进行快速、便捷的存储&#xff08;store&…

WebStack-Hugo | 一个静态响应式导航主题

WebStack-Hugo | 一个静态响应式导航主题 #10 shenweiyan announced in 1.3-折腾 WebStack-Hugo | 一个静态响应式导航主题#10 ​编辑shenweiyan on Oct 23, 2023 6 comments 7 replies Return to top shenweiyan on Oct 23, 2023 Maintainer Via&#xff1a;我给自己…

01 基于sklearn的机械学习-机械学习的分类、sklearn的安装、sklearn数据集、数据集的划分、特征工程中特征提取与无量纲化

文章目录机械学习机械学习分类1. 监督学习2. 半监督学习3. 无监督学习4. 强化学习机械学习的项目开发步骤scikit-learn1 scikit-learn安装2 sklearn数据集1. sklearn 玩具数据集鸢尾花数据集糖尿病数据集葡萄酒数据集2. sklearn现实世界数据集20 新闻组数据集3. 数据集的划分特…

携全双工语音通话大模型亮相WAIC,Soul重塑人机互动新范式

近日&#xff0c;WAIC 2025在上海隆重开幕。作为全球人工智能领域的顶级盛会&#xff0c;本届WAIC展览聚焦底层能力的演进与具体垂类场景的融合落地。坚持“模应一体”方向、立足“AI社交”的具体场景&#xff0c;Soul App此次携最新升级的自研端到端全双工语音通话大模型亮相&…

第2章 cmd命令基础:常用基础命令(1)

Hi~ 我是李小咖&#xff0c;主要从事网络安全技术开发和研究。 本文取自《李小咖网安技术库》&#xff0c;欢迎一起交流学习&#x1fae1;&#xff1a;https://imbyter.com 本节介绍的命令有目录操作&#xff08;cd&#xff09;、清屏操作&#xff08;cls&#xff09;、设置颜色…

Java 10 新特性解析

Java 10 新特性解析 文章目录Java 10 新特性解析1. 引言2. 本地变量类型推断&#xff08;JEP 286&#xff09;2.1. 概述2.2. 使用场景2.3. 限制2.4. 与之前版本的对比2.5. 风格指南2.6. 示例代码2.7. 优点与注意事项3. 应用程序类数据共享&#xff08;JEP 310&#xff09;3.1. …

【WRF工具】服务器中安装编译GrADS

目录 安装编译 GrADS 所需的依赖库 conda下载库包 安装编译 GrADS 编译前检查依赖可用性 安装编译 GrADS 参考 安装编译 GrADS 所需的依赖库 以统一方式在 $HOME/WRFDA_LIBS/grads_deps 下安装所有依赖: # 选择一个目录用于安装所有依赖库 export DIR=$HOME/WRFDA_LIBS库包1…