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

八大排序算法(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语言版)之插入排序

八大排序详解 目录&#xff1a;一、排序的概念1.1 排序的概念1.2 排序的应用 二、直接插入排序三、希尔排序四、排序算法复杂度及稳定性分析 目录&#xff1a; 八大排序算法&#xff1a; #mermaid-svg-7qCaGEYz0Jyj9dYw {font-family:"trebuchet ms",verdana,arial,…...

Linux系统安装redis并配置为服务

一、Linux环境 1、下载 官网提供的源码下载地址&#xff1a; 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) 直接与外部网卡交换数据&#xff0c;绕过了主存储器。优点: 减少了CPU和网卡等待内存的时间。提高了数据包的处理速度。减少了…...

【MATLAB源码-第58期】基于蛇优化算法(SO)和粒子群优化算法(PSO)的栅格地图路径规划最短路径和适应度曲线对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 粒子群算法 (Particle Swarm Optimization, PSO) 1. 算法概述 粒子群算法是一种基于群体智能的优化算法&#xff0c;模拟鸟群觅食的行为。算法中的每个粒子代表问题的一个可能解&#xff0c;并且具有位置和速度两个属性。粒…...

nlp与知识图谱代码解读

词嵌入 简单原理 我们要给一群14岁的孩子讲解词嵌入。可以使用一些比喻和生活中的例子&#xff1a; 老师&#xff1a; 你们还记得玩乐高积木的时候&#xff0c;每个积木块代表了一个特定的事物或形状吗&#xff1f;现在&#xff0c;想象一下&#xff0c;每个词都像是一个乐高…...

Redis设计与实现(3)字典

Redis的字典使用哈希表作为底层实现&#xff0c;一个哈希表里面可以有多个哈希表节点&#xff0c;而每一个哈希表节点就保存了字典中的一个键值对 redis字典所使用的哈希表由dict.h/dictht typedef struct dictht{//哈希表数组dictEntry **table;//哈希表大小unsigned long si…...

STM32MP157D BSP

一&#xff0c;全志R16、IMX6ULL和STM32MP157D启动相关 1&#xff0c;IMX6ULL是EMMC启动后&#xff0c;通过uboot fat命令的load进内存进行启动测试 2&#xff0c;openedv应该也是参考的官方的板子&#xff0c;类似调试口等均应该是一致的&#xff0c;所以目前就是用正点原子…...

最新SQL注入漏洞修复建议

点击星标&#xff0c;即时接收最新推文 本文选自《web安全攻防渗透测试实战指南&#xff08;第2版&#xff09;》 点击图片五折购书 SQL注入漏洞修复建议 常用的SQL注入漏洞的修复方法有两种。 1&#xff0e;过滤危险字符 多数CMS都采用过滤危险字符的方式&#xff0c;例如&…...

新人FPGA验证书籍推荐

1、FPGA之道 推荐理由&#xff1a;FPGA基础知识讲解全面&#xff0c;可以作为参考书时常翻阅&#xff1b; 2、Verilog数字系统设计教程 推荐理由&#xff1a;FPGA语法详细的介绍&#xff0c;案例比较有代表性&#xff1b; 工具类书籍推荐&#xff1a; 3、ModelSim电子系统…...

TypeError: data.reduce is not a function:数据类型不匹配

错误展示&#xff1a; 错误分析&#xff1a; 首先来看看前端代码&#xff1a;我表格绑定的数据模型是tableData&#xff0c;而我tableData定义的是一个数组 其次看看后端给的数据&#xff1a; 传递的是一个对象&#xff0c;而不是一个数组&#xff01; 这样原因就找出了&…...

出租屋智能视频监控系统方案:全面保卫租客安全

除了我们常见的家庭、社区、园区等智能监控&#xff0c;出租房作为很多人的暂住所也极易发生盗窃等事件&#xff0c;为保障大众租户的财产安全&#xff0c;旭帆科技特地针对出租屋制定了智能监控系统方案。 1、安装智能安防摄像头 高清晰度、夜视功能良好的智能摄像头&#xf…...

代码解读-自然语言处理

目录 demo3文本转为向量代码解读给出每一步的输出 demo3文本转为向量 代码 from tensorflow.keras.preprocessing.text import Tokenizer # 标记器(每一个词&#xff0c;以我们的数值做映射&#xff0c;)words [LaoWang has a Wechat account., He is not a nice person., …...

docker指令

镜像操作&#xff1a; # 搜索镜像 docker search image_name # 搜索结果过滤&#xff1a;是否是官方 docker search --filter --filter is-official image_name # 搜索结果过滤&#xff1a;是否是自动化构建 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的时候&#xff0c;报出了如下的错误&#xff0c; 系统资源不足。 有关详细信息&#xff0c;请参阅一下堆栈跟踪。 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.与区块链相关的技术 区块链技术的核心是一系列的信息安全技术&#xff0c;其体系结构为&#xff1a; 区块链技术核心相关技术&#xff1a;A..非对称加密 B.时间戳 C.哈希函数 D.智能合约 E.POS 2.哈希函数 哈希算法 MD5SHA 哈希算法作用 用于保障信息完…...

SQL 选择数据库 USE语句

SQL 选择数据库 USE语句 当SQL Schema中有多个数据库时&#xff0c;在开始操作之前&#xff0c;需要选择一个执行所有操作的数据库。 SQL USE语句用于选择SQL架构中的任何现有数据库。 句法 USE语句的基本语法如下所示 : USE DatabaseName;数据库名称在RDBMS中必须是唯一的。…...

FL Studio21版无限破解版下载 软件内置破解补丁

FL Studio是一款非常好用方便的音频媒体制作工具&#xff0c;它的功能是非常的强大全面的&#xff0c;想必那些喜欢音乐创作的朋友们应该都知道这款软件是多么的好用吧&#xff0c;它还能够给用户们带来更多的创作灵感&#xff0c;进一步加强提升我们的音乐制作能力。该软件还有…...

【代码随想录】算法训练计划02

1、977. 有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,100] 思路&#xff1a; 这题思路在于——双指针…...

【优化设计】基于人工蜂群算法机械设计优化附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f447; 关注我领取海量matlab电子书和数学建模资料&#x1f34a;个人信条&#xff1a;格物致知,完整Matl…...

从无人机防抖到股票预测:聊聊卡尔曼滤波在你身边的那些‘隐藏’应用

从无人机防抖到股票预测&#xff1a;卡尔曼滤波如何悄悄优化你的日常生活 想象一下&#xff0c;你正在用手机拍摄一段奔跑中的宠物视频&#xff0c;画面却出奇地稳定&#xff1b;或者驾驶着搭载自动驾驶辅助系统的车辆&#xff0c;它总能精准预判前车距离。这些看似"智能&…...

Ostrakon-VL-8B与ComfyUI工作流结合:可视化视觉分析流程搭建

Ostrakon-VL-8B与ComfyUI工作流结合&#xff1a;可视化视觉分析流程搭建 1. 引言&#xff1a;当视觉大模型遇上可视化编程 如果你玩过AI绘画&#xff0c;大概率听说过ComfyUI。这个工具把复杂的AI图像生成过程&#xff0c;变成了一个个可以拖拽、连接的“积木块”&#xff0c…...

别再手动一个个点了!用Labelme批量标注关键点数据的3个高效技巧(附快捷键设置)

别再手动一个个点了&#xff01;用Labelme批量标注关键点数据的3个高效技巧&#xff08;附快捷键设置&#xff09; 在计算机视觉项目的关键点标注任务中&#xff0c;效率往往是决定项目进度的关键因素。我曾参与过一个包含5000张图像的人体姿态估计项目&#xff0c;最初采用传…...

Cadence计算器实战:从波形运算到自定义函数编程

1. 差分信号处理的核心挑战 在模拟电路设计中&#xff0c;差分信号的处理一直是工程师们面临的常见难题。我刚入行时&#xff0c;第一次看到差分信号的波形图完全懵了——两条看似镜像对称的曲线&#xff0c;到底该怎么计算它们的共模电压、差模电压这些关键参数&#xff1f;传…...

Steam Depot Manifest自动化下载架构:构建现代化游戏资源同步解决方案

Steam Depot Manifest自动化下载架构&#xff1a;构建现代化游戏资源同步解决方案 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 在当今游戏开发和分发生态中&#xff0c;资源管理正面临着前所…...

GraspNet环境配置与编译问题实战指南

1. GraspNet环境配置避坑指南 第一次接触GraspNet这个3D抓取检测框架时&#xff0c;我花了整整三天时间才把环境配好。现在回想起来&#xff0c;大部分时间都浪费在了一些完全可以避免的问题上。今天我就把这些经验总结出来&#xff0c;帮你少走弯路。 GraspNet对CUDA和cuDNN的…...

Laravel ResponseCache 快速入门:5个步骤实现全站缓存加速

Laravel ResponseCache 快速入门&#xff1a;5个步骤实现全站缓存加速 【免费下载链接】laravel-responsecache Speed up a Laravel app by caching the entire response 项目地址: https://gitcode.com/gh_mirrors/la/laravel-responsecache Laravel ResponseCache 是一…...

【Houdini】HDA参数编辑实战:从基础到高级技巧

1. HDA参数编辑基础入门 第一次打开Houdini的HDA参数面板时&#xff0c;我完全被那些密密麻麻的选项搞懵了。后来才发现&#xff0c;掌握几个核心概念就能轻松上手。HDA&#xff08;Houdini Digital Asset&#xff09;是Houdini中最强大的功能之一&#xff0c;它允许我们把复杂…...

Pixel Script Temple多场景落地:政务宣传短视频、乡村振兴纪录片脚本生成

Pixel Script Temple多场景落地&#xff1a;政务宣传短视频、乡村振兴纪录片脚本生成 1. 专业剧本创作工具介绍 Pixel Script Temple&#xff08;像素剧本圣殿&#xff09;是一款基于Qwen2.5-14B-Instruct大模型深度优化的专业剧本创作工具。它将先进的AI推理能力与独特的8-B…...