数据结构与算法基础-学习-32-选择排序之简单选择排序、堆排序

目录

一、简单选择排序基本思路

二、简单选择排序基本操作

三、简单选择排序算法思路

四、简单选择排序代码

1、SimpleSelectSortSentrySqQueue

五、简单选择排序算法分析

1、记录移动次数

2、记录比较次数

六、简单选择排序Linux环境编译测试

七、堆的定义

八、堆调整

1、小根堆

2、大根堆

九、堆排序的算法思路

1、调整为大根堆

2、堆调整为升序序列

十、堆排序代码

1、HeapSiftSentrySqQueue

2、HeapSortSentrySqQueue

十一、堆排序算法分析

1、最大优点

2、辅助存储空间

3、适用情况

十二、堆排序Linux环境编译测试


排序的其他相关知识点和源码分享可以参考之前的博客:   

《数据结构与算法基础-学习-30-插入排序之直接插入排序、二分插入排序、希尔排序》,

《数据结构与算法基础-学习-31-交换排序之冒泡排序、快速排序》

一、简单选择排序基本思路

在待排序的数据中选出最大(小)的元素放在其最终的位置。

二、简单选择排序基本操作

1、首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换。

2、再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换。

3、重复上述操作,共进行n-1趟排序后,排序结束。

三、简单选择排序算法思路

我们还是以这个图为例来进行介绍,升序排列。Min指向最小值的索引号,i表示最小值需要插入的位置,j表示需要比较的元素。

先将1号位的3移动到哨兵位,存储最小值的实际值,Min初始化为1号位,j从Min加一的位置开始扫描。

发现j的2比哨兵的3小,将哨兵位放上2,Min记录最小索引2,j继续向后扫描。

发现j的8比哨兵的2大,j继续向后扫描。

发现j的5比哨兵的2大,j继续向后扫描。

发现j的4比哨兵的2大,j继续向后扫描。

发现j的6比哨兵的2大,j继续向后扫描。

发现j的1比哨兵的2小,将哨兵位放上1,Min记录最小索引7,所有元素已经扫描一遍,已经找到最小值。

将Min和i索引所存储的元素交换,这就得到最小值1了,1号位不需要再扫描了,i继续右移,Min还是以需要扫描的第一个元素为最小值设为2,j初始化为i加1等于3。

快进一下,不然画的图太多了,8,5,4,6,3都比2大,所以只需要右移j。

2号位不需要再扫描了,i继续右移,Min还是以需要扫描的第一个元素为最小值设为3,j初始化为i加1等于4,j开始右移。

发现j的5比哨兵的8小,将哨兵位放上5,Min记录最小索引4,j继续向后扫描。

发现j的4比哨兵的5小,将哨兵位放上4,Min记录最小索引5,j继续向后扫描。

发现j的6比哨兵的4大,j继续向后扫描。

发现j的3比哨兵的4小,将哨兵位放上3,Min记录最小索引7,所有元素已经扫描一遍,已经找到最小值。

3号位不需要再扫描了,i继续右移,Min还是以需要扫描的第一个元素为最小值设为4,j初始化为i加1等于5,j开始右移。

发现j的4比哨兵的5小,将哨兵位放上4,Min记录最小索引5,j继续向后扫描。

发现6,8比哨兵的4大,所有元素已经扫描一遍,已经找到最小值。

虽然数据到这里已经有序了,但其实后面还需要按照前面的逻辑再把数据扫描一遍。

四、简单选择排序代码

1、SimpleSelectSortSentrySqQueue

Status SimpleSelectSortSentrySqQueue(SqQueue* Queue)
{JudgeAllNullPointer(Queue);if (Queue->Flag != INT_TYPE_FLAG){return FailFlag;}QueueLenType i;QueueLenType j;int*         Array    = (int*)(Queue->Data);QueueLenType MinIndex;for (i = 1; i < Queue->SqQueueLen - 1; i++)//n个元素需要n-1趟,才能全部排列好。{MinIndex = i;Array[0] = Array[i];for (j = i + 1; j < Queue->SqQueueLen; j++)//排好序的元素不需要再进行比较。{if (Array[j] < Array[0])//寻找最小值{Array[0] = Array[j];MinIndex = j;}}if (i != MinIndex)//判断是否交换{Array[MinIndex] = Array[i];Array[i]        = Array[0];}}LogFormat(Debug,"Simple Select Sort SqQueue OK.\n");return SuccessFlag;
}

五、简单选择排序算法分析

情况时间复杂度是否稳定
最好O(n^2)不稳定
最坏O(n^2)
平均O(n^2)

1、记录移动次数

最坏是怎么算出来的呢,n个元素最多只用移动n-1次,数据存放到哨兵一次,最小值的位置和最小值需要移动到的正确位置进行交换需要两次,一共三次,所以是3(n - 1)。

情况次数
最好0
最坏3(n - 1)

2、记录比较次数

无论待排序列处于上面状态,选择排序所需进行的比较次数都相同。

n个元素需要比较n-1次可以找出最大或最小值。

找到的元素不用再比较,n-1个元素需要比较n-2次可以找出最大或最小值。

也就是一共需要比较

n-1 + n-2 + n-3 + ... + 1 = (n-1 + 1) * (n-1) / 2 = (n - 1) * n / 2。 

六、简单选择排序Linux环境编译测试

[gbase@czg2 Sort]$ make
gcc -Wall -Wextra -O3 InsertSort.c SwapSort.c SelectSort.c MergeSort.c BucketSort.c main.c -o TestSort -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/Log/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/HashTable/include/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/SqQueue/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/SqStack/ -L /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/Make/Libs/ -lPublicFunction -lLog -lSqQueue
[gbase@czg2 Sort]$ ./TestSort 
2023-9-8--[ Info  ]--SqQueue Data   :
Data           : [ 0 ,50 ,51 ,52 ,53 ,54 ,55 ,56 ,57 ,58 ,59 ,60 ,61 ,62 ,63 ,64 ,65 ,66 ,67 ,68 ,69 ,70 ,71 ,72 ,73 ,74 ,75 ,76 ,77 ,78 ,79 ,80 ,81 ,82 ,83 ,84 ,85 ,86 ,87 ,88 ,89 ,90 ,91 ,92 ,93 ,94 ,95 ,96 ,97 ,98 ,99 ,0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,11 ,12 ,13 ,14 ,15 ,16 ,17 ,18 ,19 ,20 ,21 ,22 ,23 ,24 ,25 ,26 ,27 ,28 ,29 ,30 ,31 ,32 ,33 ,34 ,35 ,36 ,37 ,38 ,39 ,40 ,41 ,42 ,43 ,44 ,45 ,46 ,47 ,48 ,49 ]
FrontIndex     : 0
RearIndex      : 0
SqQueueLen     : 101
SqQueueMaxLen  : 101
Flag           : INT_TYPE_FLAG
2023-9-8--[ Info  ]--Sort Function Elapsed Time   : 0 s
2023-9-8--[ Info  ]--SqQueue Data   :
Data           : [ 98 ,0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,11 ,12 ,13 ,14 ,15 ,16 ,17 ,18 ,19 ,20 ,21 ,22 ,23 ,24 ,25 ,26 ,27 ,28 ,29 ,30 ,31 ,32 ,33 ,34 ,35 ,36 ,37 ,38 ,39 ,40 ,41 ,42 ,43 ,44 ,45 ,46 ,47 ,48 ,49 ,50 ,51 ,52 ,53 ,54 ,55 ,56 ,57 ,58 ,59 ,60 ,61 ,62 ,63 ,64 ,65 ,66 ,67 ,68 ,69 ,70 ,71 ,72 ,73 ,74 ,75 ,76 ,77 ,78 ,79 ,80 ,81 ,82 ,83 ,84 ,85 ,86 ,87 ,88 ,89 ,90 ,91 ,92 ,93 ,94 ,95 ,96 ,97 ,98 ,99 ]
FrontIndex     : 0
RearIndex      : 0
SqQueueLen     : 101
SqQueueMaxLen  : 101
Flag           : INT_TYPE_FLAG

七、堆的定义

若有n个元素的序列{a1,a2,...,an}满足(ai <= a2i 和 ai <= a2i+1)或(ai >= a2i 和 ai >= a2i+1),则分别称为该序列为小根堆和大根堆。

堆的实质是满足如下性质的完全二叉树:二叉树中任一非叶子节点均小于或大于它的孩子结点。

八、堆调整

如何再输出堆顶元素后,调整剩余元素为一个新的堆?

升序为例。

1、小根堆

(1)输出堆顶元素之后,以堆中最后一个元素代替之。

(2)将根节点值与左右子树的根节点值进行比较,并于其中小者进行交换。

(3)重复上述操作,直至叶子节点,将得到新的堆,称这个从堆顶至叶子的调整过程为筛选。

2、大根堆

(1)以堆中最后一个元素代替之根节点的元素,输出堆顶元素。

(2)将根节点值与左右子树的根节点值进行比较,并于其中小者进行交换。

(3)重复上述操作,直至叶子节点,将得到新的堆,称这个从堆顶至叶子的调整过程为筛选。

九、堆排序的算法思路

推排序的实现需要两个大的步骤,一是将待排序的元素调整为大根堆或小根堆。二、堆调整为升序或降序序列。

我们这里以大根堆、升序排列为例,待排元素如下:

1、调整为大根堆

(1)我们需要想把上面的数组想象成满二叉树,如下:

(2)我们的思路是从下到上进行堆调整,需要先把这个树的子树调整为大根堆,上面的双亲结点才能调整成大根堆。

(3)5和4中的最大者5和2进行交换,那这个子树已经调整为大根堆。

(4)数组也变化了。

(5)接下来我们来调整这棵树。

(6)5和8中的最大者8和3进行交换,那这个子树已经调整为大根堆。

(7)那这整棵树就已经变成大根堆了,对应的数组也变化了。

2、堆调整为升序序列

现在我们从上到下进行排序。

(1)第一个结点和最后一个交换位置,是不是感觉出什么了,最后一个元素变为最大值了,变换位置之后这棵子树就不是大根堆了,我们来开始调整。

(2)5和3中的最大者5和4进行交换,那这个子树已经调整为大根堆。

(3)刚刚Index:2变化了,我们看一下这颗子树是否需要调整,发现就是大根堆,可以不调整,欧耶,Index:5不需要调整记得哈。

(4)实际数组变化如下

(5)第一个结点和最后一个Index:4交换位置,变换位置之后这棵子树就不是大根堆了,我们来开始调整。

(6)4和3中的最大者4和2进行交换,那这个子树已经调整为大根堆。

(7)实际数组变化如下

(8)第一个结点和最后一个Index:3交换位置,变换位置之后这棵子树就不是大根堆了,我们来开始调整。

(9)发现不需要调整,本来就是大根堆,完美。

(10)那我们交换一下第一个结点和最后一个Index:2交换位置。n个元素需要调整n-1次,五个元素我们已经调整了4次,堆已经是升序排列了。

(11)实际数组变化如下

十、堆排序代码

1、HeapSiftSentrySqQueue

Status HeapSiftSentrySqQueue(SqQueue* Queue, QueueLenType StartSiftIndex, QueueLenType EndSiftIndex)
{JudgeAllNullPointer(Queue);QueueLenType i     = StartSiftIndex;QueueLenType j     = 2 * i;int*         Array = (int*)(Queue->Data);while (j <= EndSiftIndex)//满足的话,表示有左右子树。{if (j < EndSiftIndex && Array[j] < Array[j + 1])//第一个条件成立的话,表示还有右子树。如果右子树大于左子树,将索引号移动到右子树上。{j++;}if (Array[i] < Array[j])//子树与根节点比较,如果子树大,进入此判断,进行数据交换。{Array[0] = Array[i];Array[i] = Array[j];Array[j] = Array[0];}i = j;    //移动到下一个子树的根节点。j = 2 * i;//移动到下一个子树的根节点的子树。}LogFormat(Debug,"Heap Sift Sentry SqQueue OK.\n");return SuccessFlag;
}

2、HeapSortSentrySqQueue

//需要一个哨兵,也就是预留位置,为的是方便通过数组计算左右子树。
Status HeapSortSentrySqQueue(SqQueue* Queue)
{JudgeAllNullPointer(Queue);if (Queue->Flag != INT_TYPE_FLAG){return FailFlag;}QueueLenType i;QueueLenType EndIndex = Queue->SqQueueLen - 1;int*         Array    = (int*)(Queue->Data);for (i = EndIndex / 2; i >= 1; i--)//从下往上建立大根堆{HeapSiftSentrySqQueue(Queue, i, EndIndex);}//堆调整变化为升序序列,从上往下进行调整。//n个元素需要调整n-1次。for (i = 1; i <= EndIndex - 1; i++){Array[0]                = Array[1];Array[1]                = Array[EndIndex - i + 1];Array[EndIndex - i + 1] = Array[0];HeapSiftSentrySqQueue(Queue, 1, EndIndex - i);}LogFormat(Debug,"Heap Sort Sentry SqQueue OK.\n");return SuccessFlag;
}

十一、堆排序算法分析

情况时间复杂度是否稳定
最好O(n * log2^n)不稳定
最坏O(n * log2^n)
平均O(n * log2^n)

1、最大优点

堆排序在最坏情况、最好情况下都是O(n * log2^n),都不会使排序处于

最优或最差的状态。

2、辅助存储空间

仅需要一个辅助空间,也就是哨兵位或0号位。

3、适用情况

适用于待排序记录个数n较大的情况。

十二、堆排序Linux环境编译测试

[gbase@czg2 Sort]$ make
gcc -Wall -Wextra -O3 InsertSort.c SwapSort.c SelectSort.c MergeSort.c BucketSort.c main.c -o TestSort -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/Log/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/HashTable/include/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/SqQueue/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/SqStack/ -L /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/Make/Libs/ -lPublicFunction -lLog -lSqQueue
[gbase@czg2 Sort]$ time ./TestSort 
2023-9-8--[ Debug ]--Init SqQueue OK
2023-9-8--[ Debug ]--Enter SqQueue OK
2023-9-8--[ Debug ]--Enter SqQueue OK
2023-9-8--[ Debug ]--Enter SqQueue OK
2023-9-8--[ Debug ]--Enter SqQueue OK
2023-9-8--[ Debug ]--Enter SqQueue OK
2023-9-8--[ Debug ]--Enter SqQueue OK
2023-9-8--[ Debug ]--Enter SqQueue OK
2023-9-8--[ Debug ]--Enter SqQueue OK
2023-9-8--[ Debug ]--Enter SqQueue OK
2023-9-8--[ Debug ]--Enter SqQueue OK
2023-9-8--[ Debug ]--Enter SqQueue OK
2023-9-8--[ Info  ]--SqQueue Data   :
Data           : [ 0 ,5 ,6 ,7 ,8 ,9 ,0 ,1 ,2 ,3 ,4 ]
FrontIndex     : 0
RearIndex      : 0
SqQueueLen     : 11
SqQueueMaxLen  : 11
Flag           : INT_TYPE_FLAG
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sort Sentry SqQueue OK.
2023-9-8--[ Info  ]--Sort Function Elapsed Time   : 0 s
2023-9-8--[ Info  ]--SqQueue Data   :
Data           : [ 1 ,0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ]
FrontIndex     : 0
RearIndex      : 0
SqQueueLen     : 11
SqQueueMaxLen  : 11
Flag           : INT_TYPE_FLAG
2023-9-8--[ Debug ]--Destroy SqQueue OKreal    0m0.003s
user    0m0.001s
sys     0m0.001s

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

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

相关文章

A6120 Emerson 机箱地震振动监测器

A6120 Emerson 机箱地震振动监测器 艾默生过程管理公司宣布&#xff0c;PlantWeb数字工厂架构已经安装在化学工业CATCH(技术能力评估中心)培训中心&#xff0c;该中心位于北林肯郡格里姆斯比附近的Stallingborough。这座价值820万英镑的设施是为了满足行业对培训中心的需求而开…

教师如何私密发布成绩查询?

随着科技的不断发展&#xff0c;教育领域也逐渐引入了各种在线工具来提高教学效果和管理效率。其中&#xff0c;易查分作为一款功能强大的在线查询工具&#xff0c;帮助老师们更好的利用该工具进行成绩查询。 好消息&#xff01;博主给大家争取到的易查分福利&#xff0c;只需要…

C++中的红黑树

红黑树 搜索二叉树搜索二叉树的模拟实现平衡搜索二叉树(AVL Tree)平衡搜索二叉树的模拟实现红黑树(Red Black Tree)红黑树的模拟实现 红黑树的应用(Map 和 Set)Map和Set的封装 搜索二叉树 搜索二叉树的概念&#xff1a;二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&…

电脑文件批量重命名:高效操作技巧

随着时间的推移&#xff0c;我们积累的文件和文件夹数量越来越多&#xff0c;需要对它们进行合理的命名和管理&#xff0c;以便更方便地查找和利用。而文件批量重命名功能可以帮助我们更高效地管理文件夹。下面介绍五种方式&#xff0c;帮助你更好地利用文件批量重命名工具&…

leetcode刷题--栈与递归

文章目录 1. 682 棒球比赛2. 71 简化路径3. 388 文件的最长绝对路径4. 150 逆波兰表达式求值5. 227. 基本计算器II6. 224. 基本计算器7. 20. 有效的括号8. 636. 函数的独占时间9. 591. 标签验证器10. 32.最长有效括号12. 341. 扁平化嵌套列表迭代器13. 394.字符串解码 1. 682 棒…

算法之双指针题型:

双指针例题小总结&#xff1a; 力扣27&#xff1a; 移除元素 力扣题目链接 双指针分为&#xff1a; 快慢双指针&#xff1a;同一个起点&#xff0c;同向出发 相向双指针&#xff1a;从两端出发&#xff0c;方向相反&#xff0c;终会相遇 经典的双指针&#xff08;快慢双指…

消息队列理解

rocketMQ RocketMQ消息存储原理_码上得天下的博客-CSDN博客 领域模型概述 | RocketMQ kafka Kafka基本架构介绍-腾讯云开发者社区-腾讯云 看完这篇Kafka&#xff0c;你也许就会了Kafka_心的步伐的博客-CSDN博客 Apache Kafka

技术解码 | GB28181/SIP/SDP 协议--EasyGBS国标GB28181平台国标视频技术SDP解析

EasyGBS去年更换了新内核&#xff0c;新内核版本的平台性能更加稳定&#xff0c;我们也在不断对平台进行持续的功能优化和升级&#xff0c;始终保持EasyGBS平台在安防视频监控市场的技术先进性。EasyGBS拥有视频直播、录像存储、检索与回放、云台控制、告警上报、语音对讲、平台…

Tomcat服务的部署及配置优化

文章目录 1. Tomcat的相关介绍1.1 Tomcat简介1.2 Tomcat的核心组件1.2.1 Web容器1.2.2 Servlet容器1.2.3 JSP容器 1.3 Tomcat的功能组件1.3.1 connector连接器1.3.2 container容器1.3.2.1 子容器及其相关功能 1.4 主要作用1.5 Tmocat处理请求的过程 2. Tomcata服务部署2.1 安装…

VSCode自动分析代码的插件

今天来给大伙介绍一款非常好用的插件&#xff0c;它能够自动分析代码&#xff0c;并帮你完成代码的编写 效果如下图 首先我们用的是VSCode&#xff0c;&#xff08;免费随便下&#xff09; 找到扩展&#xff0c;搜索CodeGeeX&#xff0c;将它下载好&#xff0c;就可以实现了 到…

QVector 和 QMap

QVector_QMap QVector简介 头文件&#xff1a;#include<QVector> 模块&#xff1a; QT core 功能&#xff1a; QVector类是动态数组的模板类&#xff0c;顺序容器&#xff0c;它将自己的每一个对象存储在连续的内存中&#xff0c;可以使用索引号来快速访问它们 常用…

【MySQL系列】视图特性

「前言」文章内容大致是MySQL事务管理。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 视图1.1 视图概念1.2 创建视图1.3 修改互相影响1.4 删除视图1.5 视图规则和限制 视图 1.1 视图概念 视图是一个虚拟表&#xff0c;其内容由查询定义同真实的表一样…

uniapp 实现多音频同时播放 解决sessionCategory = “ambient“不生效问题

1.1完整代码 <template><view></view> </template><script>export default {data() {return {BGInnerAudioContext1: null, //背景1BGInnerAudioContext2: null, //背景2}},onLoad() {this.play1()this.play2()},methods: {//音频1play1() {//背…

保护个人隐私,自建个性图床:Cpolar+Qchan轻量级搭建教程分享

文章目录 前言1. Qchan网站搭建1.1 Qchan下载和安装1.2 Qchan网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar云端设置2.2 Cpolar本地设置 3. 公网访问测试总结 前言 图床作为云存储的一项重要应用场景&#xff0c;在大量开发人员的努力下&#xff0c;已经开发出大…

h5开发网站-使用jquery来实现二层嵌套的左侧列表,点击后显示右侧内容的效果

一、需求&#xff1a; 使用jquery来实现二层嵌套的左侧列表&#xff0c;点击后显示右侧内容的效果。 二、思路&#xff1a; 为一级列表项和二级子列表项分别添加了点击事件处理程序。当一级列表项被点击时&#xff0c;使用.slideToggle()方法展开或收起对应的二级子列表项。…

如何激励员工?

如何激励员工&#xff1f;激励就是发现员工的需求&#xff0c;并满足它。 今天想给大家介绍下“马斯洛需求理论”&#xff0c;毕竟想要更好的激励下属创造价值&#xff0c;你首先需要了解他想要什么。对吧。 马斯洛需求理论是美国心理学家马斯洛在上世纪四十年代年提出的。他…

C语言深入理解指针(非常详细)(五)

目录 回调函数qsort使用举例qsort函数的模拟实现sizeof和strlen的对比sizeofstrlensizeof和strlen的对比一道关于sizeof的题 回调函数 回调函数就是一个通过函数指针调用的函数 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另一个函数&#xff0c;当这个指…

Python项目开发:Flask基于Python的天气数据可视化平台

目录 步骤一&#xff1a;数据获取 步骤二&#xff1a;设置Flask应用程序 步骤三&#xff1a;处理用户输入和数据可视化 步骤四&#xff1a;渲染HTML模板 总结 在这个数字化时代&#xff0c;数据可视化已经成为我们理解和解释信息的重要手段。在这个项目中&#xff0c;我们…

OpenCV(三十):图像膨胀

1.图像膨胀原理 图像膨胀的原理是将一个结构元素&#xff08;也称为核或模板&#xff09;在图像上滑动&#xff0c;并将其与图像中对应位置的像素进行比较。如果结构元素的所有像素与图像中对应位置的像素都匹配&#xff0c;那么该位置的像素值保持不变。如果结构元素的任何一个…