八大排序算法(C语言版)之插入排序
八大排序详解
- 目录:
- 一、排序的概念
- 1.1 排序的概念
- 1.2 排序的应用
- 二、直接插入排序
- 三、希尔排序
- 四、排序算法复杂度及稳定性分析
目录:
八大排序算法:
超链接:
插入排序
选择排序
交换排序
归并排序
非比较排序
一、排序的概念
1.1 排序的概念
排序:所谓排序,就是使一串记录, 按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j], 且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
内部排序:数据元素全部放在内存中的排序。
外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。
1.2 排序的应用
排序的目的通常是为了方便查找,或者统计最多或者最少的重复次数。
1.游戏竞赛。 游戏规则是随机一组30张图片,要求参加比赛的10人在30秒之内把图片按照从小到大顺序排序,时间最少的获胜。
2.调查问卷。 在1~10000中随机生成N个数,对于重复的数只保留一个,不同的数对应着不同学生的学号,再把这些数从小到大排序,按顺序找同学调查。
3.颁发特等奖学金。 某个大学有n名学生,每个人都有m门课,按照综合成绩排名,需要挑出最优秀的k位学生颁发特等奖学金。
二、直接插入排序
直接插入排序的基本思想:
把待排序的内容记录并逐一与排序好的有序序列比较,插入到有序序列中,直到待排序列的记录全部插入完毕,得到一个新的有序序列,这就是直接插入排序

代码如下
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <time.h>
#include <windows.h>
#define m 1000
void IsertSort(int* arr, int n)
{int i;for (i = 1; i < n; i++)//i为待排序的第一个数下标{int end = i - 1;//end 为已排好序列的尾下标int tmp = arr[i];//把待排序的第一个数存起来//遍历已排序列,进行比较然后插入,这里我进行从小到大排序while (end >= 0){if (arr[end] > tmp)//如果前面的数大,就把他往后移动一个{arr[end + 1] = arr[end];end--;}//否则就跳出elsebreak;arr[end + 1] = tmp;}}//打印排序后的数据for (i = 0; i < n; i++){printf("%d ", arr[i]);}
}
int main()
{int head, end,arr[m];//srand(初始化时间),time(直接返回时间戳)srand((unsigned)time(NULL));head = clock();for (int i = 0; i < m; i++)arr[i] = rand();//,时间不停的变化,每次产生不同的随机值IsertSort(arr,sizeof(arr)/sizeof(arr[0]));end = clock();//排序需要花费的时间printf("\n%d\n ", end - head);return 0;
}
直接插入排序的性能总结:
1.元素集合越接近有序,直接插入排序算法的时间效率越高。
2.时间复杂度:O(N^2)
3.空间复杂度为:O(1),它是一种稳定的排序算法
4.稳定性:稳定
三、希尔排序
希尔排序又叫缩小增量法。
希尔排序的基本思想:
先选定一个整数,然后把待排序的记录分成这个整数的组,所有距离为这个整数的记录被分在同一个组,并对每一个组内的记录进行排序。先预排序,然后在插入排序。

代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <Windows.h>
#define m 10000
SheelSort(int* arr, int n)
{int gap = 3;//多趟for(int j=0;j<gap; j++)//每组进行插入排序for (int i =j; i < n - gap; i += gap){//单趟int end = i;int tmp = arr[end + gap];while (end >= 0){if (arr[end] < tmp)//从大到小排序{arr[end + gap] = arr[end];end -= gap;}elsebreak; }arr[end + gap] = tmp;}
}
int main()
{int head, tail, i;int arr[m] = {0};srand((unsigned)time(NULL));for (i = 0; i < m; i++)arr[i] = rand()%1000;head = clock();SheelSort(arr, sizeof(arr) / sizeof(arr[0]));tail = clock();printf("%d ", tail - head);return 0;
}
效率如下

我们可以优化一下(减少一个循环,但是效率还是差不多得,而且代码更简洁):
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <Windows.h>
#define m 10000
SheelSort_1(int* arr, int n)
{int gap = 3;//按顺序,一组一组排序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;}elsebreak;}arr[end + gap] = tmp;}
}
int main()
{int head, tail, i;int arr[m] = {0};srand((unsigned)time(NULL));for (i = 0; i < m; i++)arr[i] = rand()%1000;head = clock();SheelSort_1(arr, sizeof(arr) / sizeof(arr[0]));tail = clock();printf("%d ", tail - head);return 0;
}

我们可以得知预排序的意义:
1.gap越大,大的数可以更快的到后面,小的数可以更快到前面,gap越大跳的越快,越不接近有序。
2.gap越小,大的小的数挪动越慢,越接近有序。
3.gap= =1,就是直接插入排序。
但是我们不知道gap取什么值最好
我们在把代码变一变,让gap无论是多少,最后都等于gap= =1.(gap >1为预排序)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <Windows.h>
#define m 10000
SheelSort_3(int* arr, int n)
{int gap = n;while(gap >1)//先预排序,预排序结束后,直接插入排序{gap=gap/3+1;//gap=gap/2;//按顺序,一组一组排序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;}elsebreak;}arr[end + gap] = tmp;}}
}
int main()
{int head, tail, i;int arr[m] = {0};srand((unsigned)time(NULL));for (i = 0; i < m; i++)arr[i] = rand()%1000;head = clock();SheelSort_3(arr, sizeof(arr) / sizeof(arr[0]));tail = clock();printf("%d ", tail - head);return 0;
}
计算它的时间复杂度?
1.gap很大时gap=n / 3+1,可分为n/3组数据,每组3个元素,每组最坏的比较次数为3次所以一共:n / 3 * 3次。
2.gap很小时,gap=1,每组1个元素,很接近有序,间距为gap的这些数据,数据往后挪动的次数:n。
3.gap很大时,n / 9个组,9个元素,每组最坏比较36次。(1+2……+8),间距为gap的这些数据。合计挪动数据:n / 9* 36=4n次
4.外面那个循环运算了log3^N次
总结:合计n / gap组,每组gap个,每组插入:1+2+3+……+gap。合计:(1+gap) * gap / 2
时间复杂度O(N^1.3)最好情况
稳定性:不稳定
四、排序算法复杂度及稳定性分析
如图:

表格:

相关文章:
八大排序算法(C语言版)之插入排序
八大排序详解 目录:一、排序的概念1.1 排序的概念1.2 排序的应用 二、直接插入排序三、希尔排序四、排序算法复杂度及稳定性分析 目录: 八大排序算法: #mermaid-svg-7qCaGEYz0Jyj9dYw {font-family:"trebuchet ms",verdana,arial,…...
Linux系统安装redis并配置为服务
一、Linux环境 1、下载 官网提供的源码下载地址: https://github.com/redis/redis/archive/7.0.5.tar.gz 2、将源码上传至服务器 3、解压缩 # 将解压缩后的文件放置在同目录的source文件夹下 tar -zxvf redis-7.0.5.tar.gz -C ./source4、编译安装 对源码进行编…...
DDIO和DMA有什么区别
DDIO 和 DMA 的区别 DDIO (Data Direct I/O Technology) 主要应用: 主要用于网卡和CPU之间的数据传输。工作原理: 通过CPU的Last Level Cache (LLC) 直接与外部网卡交换数据,绕过了主存储器。优点: 减少了CPU和网卡等待内存的时间。提高了数据包的处理速度。减少了…...
【MATLAB源码-第58期】基于蛇优化算法(SO)和粒子群优化算法(PSO)的栅格地图路径规划最短路径和适应度曲线对比。
操作环境: MATLAB 2022a 1、算法描述 粒子群算法 (Particle Swarm Optimization, PSO) 1. 算法概述 粒子群算法是一种基于群体智能的优化算法,模拟鸟群觅食的行为。算法中的每个粒子代表问题的一个可能解,并且具有位置和速度两个属性。粒…...
nlp与知识图谱代码解读
词嵌入 简单原理 我们要给一群14岁的孩子讲解词嵌入。可以使用一些比喻和生活中的例子: 老师: 你们还记得玩乐高积木的时候,每个积木块代表了一个特定的事物或形状吗?现在,想象一下,每个词都像是一个乐高…...
Redis设计与实现(3)字典
Redis的字典使用哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,而每一个哈希表节点就保存了字典中的一个键值对 redis字典所使用的哈希表由dict.h/dictht typedef struct dictht{//哈希表数组dictEntry **table;//哈希表大小unsigned long si…...
STM32MP157D BSP
一,全志R16、IMX6ULL和STM32MP157D启动相关 1,IMX6ULL是EMMC启动后,通过uboot fat命令的load进内存进行启动测试 2,openedv应该也是参考的官方的板子,类似调试口等均应该是一致的,所以目前就是用正点原子…...
最新SQL注入漏洞修复建议
点击星标,即时接收最新推文 本文选自《web安全攻防渗透测试实战指南(第2版)》 点击图片五折购书 SQL注入漏洞修复建议 常用的SQL注入漏洞的修复方法有两种。 1.过滤危险字符 多数CMS都采用过滤危险字符的方式,例如&…...
新人FPGA验证书籍推荐
1、FPGA之道 推荐理由:FPGA基础知识讲解全面,可以作为参考书时常翻阅; 2、Verilog数字系统设计教程 推荐理由:FPGA语法详细的介绍,案例比较有代表性; 工具类书籍推荐: 3、ModelSim电子系统…...
TypeError: data.reduce is not a function:数据类型不匹配
错误展示: 错误分析: 首先来看看前端代码:我表格绑定的数据模型是tableData,而我tableData定义的是一个数组 其次看看后端给的数据: 传递的是一个对象,而不是一个数组! 这样原因就找出了&…...
出租屋智能视频监控系统方案:全面保卫租客安全
除了我们常见的家庭、社区、园区等智能监控,出租房作为很多人的暂住所也极易发生盗窃等事件,为保障大众租户的财产安全,旭帆科技特地针对出租屋制定了智能监控系统方案。 1、安装智能安防摄像头 高清晰度、夜视功能良好的智能摄像头…...
代码解读-自然语言处理
目录 demo3文本转为向量代码解读给出每一步的输出 demo3文本转为向量 代码 from tensorflow.keras.preprocessing.text import Tokenizer # 标记器(每一个词,以我们的数值做映射,)words [LaoWang has a Wechat account., He is not a nice person., …...
docker指令
镜像操作: # 搜索镜像 docker search image_name # 搜索结果过滤:是否是官方 docker search --filter --filter is-official image_name # 搜索结果过滤:是否是自动化构建 docker search --filter --filter is-automated image_name # 搜索结…...
【MySql】9- 实践篇(七)
文章目录 1. 一主多从的主备切换1.1 基于位点的主备切换1.2 GTID1.3 基于 GTID 的主备切换1.4 GTID 和在线 DDL 2. 读写分离问题2.1 强制走主库方案2.2 Sleep 方案2.3 判断主备无延迟方案2.4 配合 semi-sync方案2.5 等主库位点方案2.6 GTID 方案 3. 如何判断数据库是否出问题了…...
Maven compile时报错 系统资源不足,出现OOM:GC overhead limit exceeded
今天在对项目进行Maven clean compile的时候,报出了如下的错误, 系统资源不足。 有关详细信息,请参阅一下堆栈跟踪。 java.lang.OutOfMemoryError: GC overhead limit exceededat java.util.EnumSet.noneOf(EnumSet.java:115)at com.sun.too…...
启动内核ip转发和其他优化
1.临时修改 echo 1 > /proc/sys/net/ipv4/ip_forward echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse 2.配置文件修改 vim /etc/sysctl.conf net.ipv4.ip_forward 1 net.ipv4.tcp_tw_reuse 1 vm.swappiness 0 kernel.sysrq 1 net.ipv4.neigh.default.gc_stale_t…...
信息安全技术
1.与区块链相关的技术 区块链技术的核心是一系列的信息安全技术,其体系结构为: 区块链技术核心相关技术:A..非对称加密 B.时间戳 C.哈希函数 D.智能合约 E.POS 2.哈希函数 哈希算法 MD5SHA 哈希算法作用 用于保障信息完…...
SQL 选择数据库 USE语句
SQL 选择数据库 USE语句 当SQL Schema中有多个数据库时,在开始操作之前,需要选择一个执行所有操作的数据库。 SQL USE语句用于选择SQL架构中的任何现有数据库。 句法 USE语句的基本语法如下所示 : USE DatabaseName;数据库名称在RDBMS中必须是唯一的。…...
FL Studio21版无限破解版下载 软件内置破解补丁
FL Studio是一款非常好用方便的音频媒体制作工具,它的功能是非常的强大全面的,想必那些喜欢音乐创作的朋友们应该都知道这款软件是多么的好用吧,它还能够给用户们带来更多的创作灵感,进一步加强提升我们的音乐制作能力。该软件还有…...
【代码随想录】算法训练计划02
1、977. 有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 输入:nums [-4,-1,0,3,10] 输出:[0,1,9,16,100] 思路: 这题思路在于——双指针…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
