X
首页
技术
模拟电子
单片机
半导体
电源管理
嵌入式
传感器
最能打国产芯
应用
汽车电子
工业控制
家用电子
手机便携
安防电子
医疗电子
网络通信
测试测量
物联网
最能打国产芯
大学堂
首页
直播
专题
TI 培训
论坛
汽车电子
国产芯片
电机驱动控制
电源技术
单片机
模拟电子
PCB设计
电子竞赛
DIY/开源
嵌入式系统
医疗电子
颁奖专区
【厂商专区】
【电子技术】
【创意与实践】
【行业应用】
【休息一下】
最能打国产芯
活动中心
直播
发现活动
颁奖区
电子头条
参考设计
下载中心
分类资源
文集
排行榜
电路图
Datasheet
最能打国产芯
嵌入式系统
[分享] CMake构建实战读书笔记04-CMake快速排序
DDZZ669
2024-10-7 10:40
楼主
本篇来学习CMake构建实战的第5章:CMake快速排序。 第5章只有一个使用CMake编写的快速排序的脚本,我们就来分析下这个脚本。 # 1 CMake快速排序脚本分析 ## 1.1 分区算法 定义一个partition函数,参数有: - arr:输入的数组(或称列表),作为输入参数 - pivot:主元(或称分界值),作为输入参数 - left:比主元小的数据组成的数组,作为结果输出 - right:比主元大或相等的数据组成的数组,作为结果输出 这里使用set命令中的PARENT_SCOPE来实现将内部变量传递到外层 ```cmake function(partition arr pivot left right) foreach(x ${arr}) if(${x} LESS ${pivot}) list(APPEND _left ${x}) else() list(APPEND _right ${x}) endif() endforeach() set(${left} ${_left} PARENT_SCOPE) set(${right} ${_right} PARENT_SCOPE) endfunction() ``` ## 1.2 快速排序函数 定义一个quick_sort函数,参数有: - input:待排序的数组(或称列表),作为输入参数 - res:排序结果数组,作为结果输出 该函数中,首先会判断待排序的数组长度是否小于等于(LESS_EQUAL)1,如果是,则不需要排序了。 然后通过list的GET方法来获取待排序数组中的第一个元素作为主元, 然后通过SUBLIST来将第一个元素去除后得到新的数组,并对该数组带哦有分区算法函数, 将得到的主元左、右的子数组,通过递归调用的方式,分别得到其排序结果, 最后将左数组的排序结果,连接主元,再连接右数组的排序结果,即可得到最终原始数组的排序结果。 ```cmake function(quick_sort input res) list(LENGTH input input_len) if(${input_len} LESS_EQUAL 1) set(${res} "${input}" PARENT_SCOPE) return() endif() list(GET input 0 pivot) list(SUBLIST input 1 -1 input) partition("${input}" ${pivot} left right) quick_sort("${left}" left) quick_sort("${right}" right) list(APPEND _res ${left} ${pivot} ${right}) set(${res} "${_res}" PARENT_SCOPE) endfunction() ``` ## 1.3 客户端代码 通过for循环来接收参数的方式来获取要排序的数据,这里数字4表示要忽略前面的4个参数,后面开始是要排序的数据。 然后调用quick_sort函数进行排序,并打印排序前后的结果: ```cmake foreach(i RANGE 4 ${CMAKE_ARGC}) list(APPEND input ${CMAKE_ARGV${i}}) endforeach() message("排序前: ${input}") quick_sort("${input}" res) message("排序后: ${res}") ``` 测试结果如下:
# 2 改写成C++ 也可以改写成C++代码来做下对比,这里使用std::vector存储排序的数组。 ## 2.1 分区算法 也是4个参数,通过for循环,来将数据根据主元(pivot)分为左右两个部分 ```c++ void partition(std::vector
&arr, int pivot, std::vector
&left, std::vector
&right) { left.clear(); right.clear(); for (int &it : arr) { (it < pivot) ? left.push_back(it) : right.push_back(it); } } ``` ## 2.2 快速排序 可以只有一个待排序数组作为参数,并将排序结果通过返回值返回 ```c++ std::vector
quick_sort(std::vector
&input) { if(input.size() <= 1) { return input; } int pivot = input[0]; input.erase(input.begin()); std::vector
left; std::vector
right; partition(input, pivot, left, right); left = quick_sort(left); right = quick_sort(right); left.push_back(pivot); left.insert(left.end(), right.begin(), right.end()); return left; } ``` ## 2.3 客户端代码 通过main函数的参数接收功能来实现待排序数据的获取,并单独写一个printf_vector来实现数据的打印。 ```c++ //g++ -o test01 -std=c++11 test01.cpp #include
#include
#include
std::string printf_vector(std::vector
data) { std::string res; for (int it : data) { res += std::to_string(it); } return res; } int main(int argc, char **argv) { std::vector
input; for (int i=1; i
)); } printf("排序前: %s\n", printf_vector(input).c_str()); input = quick_sort(input); printf("排序后: %s\n", printf_vector(input).c_str()); return 0; } ``` 测试结果如下:
# 3 总结 本篇介绍了CMake构建实战的第5章:CMake快速排序,分析了脚本的代码逻辑,并通过改写为C++语言,进行对比。
点赞
回复评论 (3)
沙发
秦天qintian0303
CMake编写这些经典程序会比较方便吗?
在爱好的道路上不断前进,在生活的迷雾中播撒光引
点赞
2024-10-7 11:32
板凳
高级灰0090
感谢作者无私的分享。非常精彩的内容,学习了,受益匪浅。非常感谢。
点赞
2024-10-7 17:07
4楼
DDZZ669
引用:
秦天qintian0303 发表于 2024-10-7 11:32
CMake编写这些经典程序会比较方便吗?
可以用来学习CMake语法
点赞
2024-10-12 21:12
最新活动
是德科技有奖直播 | 应对未来高速算力芯片的设计与测试挑战
免费申请 | 上百份MPS MIE模块,免费试用还有礼!
TI 有奖直播 | 使用基于 Arm 的 AM6xA 处理器设计智能化楼宇
Follow me第二季第3期来啦!与得捷一起解锁高性能开发板【EK-RA6M5】超能力!
报名直播赢【双肩包、京东卡、水杯】| 高可靠性IGBT的新选择——安世半导体650V IGBT
30套RV1106 Linux开发板(带摄像头),邀您动手挑战边缘AI~
随便看看
对板子覆铜,焊盘和覆铜之间的连线太细,怎么调整?
急急急,求大神帮忙,万分感谢
两个always块同时对一个reg类型变量赋值的问题
连我的帖子也删,唉……
gprs模块如何打电话??
M4开发板试用周计划-Shower.xu
列举下哪些处理器带IDE硬盘接口
MSP430 32kHz 晶体振荡器使用指南(中文资料哦)
Modbus12路开关量输入10路12位0-5V模拟量采集3路继电器模块光耦
关于定时A与串口二者应用的问题,求大神帮忙
一个小电路的问题求助
C++计时的几种方法说明及例程
电平不符的辣手问题
哦也,我当爸爸了
为什么我今天才知道有团购这一回事。。。
如何对USB摄像头进行视频捕捉
MSP43编程器怎样将程序写入快闪中?
定时器,让流水灯以1S时间闪烁
Bluetooth RF测试-正确的无线电设计测试
求助
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
京公网安备 11010802033920号
回复
写回复
收藏
回复