发新帖本帖赏金 30.00元(功能说明)我要提问
返回列表
打印
[资料干货]

你用过排序算法?测试过执行时间?一起来看看吧!

[复制链接]
1567|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dffzh|  楼主 | 2025-5-6 17:07 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dffzh 于 2025-5-6 17:29 编辑

#申请原创#
@21小跑堂

在软件数据处理中,我们会经常使用排序算法先对数据进行降序排序(从大到小)或者升序排序(从小到大)后,再执行进一步处理,比如常见的应用就是采集一定数量的传感器数据后进行排序算法处理。
那你一般都用哪种排序算法呢?有没有遇到数据量多了以后排序算法的执行效率降低的情况?或者有没有研究过不同排序算法之间在执行时间上有什么差别?这篇文章将带你揭晓答案!
以下将从工作原理,算法步骤,时间复杂度,空间复杂度,稳定性,源代码和仿真验证等方面阐述数据排序算法。
在一般的嵌入式系统中,以下介绍的三种都属于较简单的且性能类似的排序算法,在大多数情况下都可以满足应用需求。

1、冒泡排序算法
工作原理:
通过重复遍历要排序的数据列表,比较相邻的元素并按照升序或降序的要求交换它们的位置来实现。会重复遍历数据列表,直到数据列表已经完成排序操作。
算法步骤:
比较相邻的元素:从列表的第一个元素开始,比较当前元素与下一个元素;
交换位置:如果当前元素比下一元素大(升序排序),则交换它们的位置;降序排序则相反;
重复遍历:对列表的每一对相邻元素重复上述过程,直到列表的末尾;这样,最大(最小)元素就会“冒泡”到列表的最后位置;
缩小范围:忽略已经排序好的最后一个元素,重复上述步骤,直到整个列表排序完成。
时间复杂度:
平均情况:O(n²)
随着数据列表的规模增大,排序工作量将按平方级别的规模变大。
空间复杂度:
O(1)(仅需要常数级的内存空间)
稳定性:
因为相等的元素不会交换位置,因此冒泡排序是稳定的排序算法。
源代码:
(文章里的代码均以升序排序为例的C代码,读者可参考自行实现降序排序代码)


仿真验证:
先在Visual C++ 6.0软件上验证算法代码的正确性:

然后使用硬件板子在Keil软件上测试了排序100个随机数据的算法执行时间:
这个时间结果并非绝对时间,只是相对时间,与MCU主频有关,我的测试主频是240MHz;



排序100个随机数据的算法执行时间t:
t = 18.04128625秒 –18.04077735秒 = 508.9微秒,0.5毫秒左右。

2、选择排序算法
工作原理:每次从待排序的数据列表中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据列表的元素排完。
算法步骤:
初始状态:
无序区为S[0..n-1],有序区为空;
第i趟排序(i=0,1,2...n-2)开始时,当前有序区和无序区分别为S[0..i-1]和S[i..n-1];
该趟排序从当前无序区中选出关键值最小的记录S[k];
将S[k]与无序区的第1个记录S交换;重复以上步骤,共n-1趟,完成排序。
时间复杂度:
平均情况:O(n²)无论数据如何排列,选择排序都需要进行n(n-1)/2次比较。
间复杂度:
O(1)(属于原地排序算法)
稳定性:
交换可能会改变相等元素的相对位置,因此选择排序是不稳定的排序算法。
源代码:
仿真验证:
先在Visual C++ 6.0软件上验证算法代码的正确性:
然后使用硬件板子在Keil软件上测试了排序100个随机数据的算法执行时间:
排序100个随机数据的算法执行时间t:
t = 0.14538003秒 – 0.14512233秒= 257.7微秒
执行速度上比冒泡排序算法快。

3、插入排序算法
工作原理:
每次从无序部分取出一个数据,插入到有序部分的正确位置。
算法步骤:
从数组的第二个元素开始遍历(即索引为1的元素);
将当前元素与它之前的元素逐一比较,如果当前元素小,则将之前的元素后移;
找到正确的位置后,将当前元素插入到该位置;
重复以上步骤,直到数组遍历完成。
时间复杂度:
平均情况:O(n²)
空间复杂度:
O(1)(属于原地排序算法)
稳定性:
插入排序是稳定的排序算法。
源代码:
以下两种实现方法都可以
仿真验证:
先在Visual C++ 6.0软件上验证算法代码的正确性:
然后使用硬件板子在Keil软件上测试了排序100个随机数据的算法执行时间:
排序100个随机数据的算法执行时间t:
t = 0.14535409秒 –0.14512319秒 = 230.9微秒
在执行速度上,三种排序算法的时间分别是508.9微秒、257.7微秒、230.9微秒;即插入排序算法用时最少,执行最快

从以上对三种常用的简单数据排序算法的阐述和验证上可以得出以下结论:
1、在算法执行速度上,插入排序算法 > 选择排序算法 > 冒泡排序算法,即插入排序算法是简单排序算法里性能较好的一种,值得你拥有;
2、对时间实时性或者响应速度要求不高的场景,三种排序算法你都可以使用;
3、对于有符号数和浮点数类型的操作,在算法上无本质区别,只要修改数据类型即可;
4、对于更高级的嵌入式系统应用,响应时间都是纳秒甚至更高级别,比如航空航天和军事应用等,则可能需要更高效的数据排序算法,比如归并排序算法和快速排序算法,后面文章会更新。

附件有排序算法的源代码pdf文件,可以参考!

553456819cfd3efcfa.png (205.02 KB )

553456819cfd3efcfa.png

sort_alg.pdf

114.25 KB

排序算法

使用特权

评论回复

打赏榜单

21小跑堂 打赏了 30.00 元 2025-05-20
理由:恭喜通过原创审核!期待您更多的原创作品~~

评论
21小跑堂 2025-5-20 17:48 回复TA
对比测试三种常用的排序算法的执行时间,在执行速度上给出参考,测试效果差异较为明显,结论符合事实。 

相关帖子

沙发
飞思啦| | 2025-5-6 18:01 | 只看该作者
结果应该是和不同的数据有关系,有些数据确实更适合冒泡排序,不同的数据,应该选用不同的排序方式

使用特权

评论回复
板凳
大大财迷| | 2025-5-7 08:10 | 只看该作者
楼主keil哪个版本,可以直接测试间啊

使用特权

评论回复
地板
dffzh|  楼主 | 2025-5-7 08:46 | 只看该作者
大大财迷 发表于 2025-5-7 08:10
楼主keil哪个版本,可以直接测试间啊

我使用的是Keil5,Keil4应该也可以;
有兴趣可以看下我之前发的这篇帖子,上面有关于怎么查看运行时间的介绍:
https://bbs.21ic.com/icview-3446186-1-1.html

使用特权

评论回复
5
dffzh|  楼主 | 2025-5-7 08:51 | 只看该作者
飞思啦 发表于 2025-5-6 18:01
结果应该是和不同的数据有关系,有些数据确实更适合冒泡排序,不同的数据,应该选用不同的排序方式 ...

嗯,其实这三种简单的排序算法应用在小规模数据里,问题都不大;
真正大规模数据里面,还是需要用到归并排序和快速排序等高级排序算法。

使用特权

评论回复
6
xch| | 2025-5-7 10:37 | 只看该作者
本帖最后由 xch 于 2025-5-7 10:38 编辑

应当用随机数发生器产生样本数组,多测几次或者生成个超大数组 然后获得计算时长统计数据

使用特权

评论回复
7
zjk103| | 2025-5-7 13:20 | 只看该作者
数值多的话差异会比较大

使用特权

评论回复
8
dffzh|  楼主 | 2025-5-7 13:37 | 只看该作者
xch 发表于 2025-5-7 10:37
应当用随机数发生器产生样本数组,多测几次或者生成个超大数组 然后获得计算时长统计数据 ...

使用统计学技术,可以的

使用特权

评论回复
9
dffzh|  楼主 | 2025-5-7 13:37 | 只看该作者
zjk103 发表于 2025-5-7 13:20
数值多的话差异会比较大

是的,数据越多,差异越大

使用特权

评论回复
10
zjsx8192| | 2025-5-8 17:20 | 只看该作者
有几个排序是不稳定吧

使用特权

评论回复
11
dffzh|  楼主 | 2025-5-9 08:42 | 只看该作者
zjsx8192 发表于 2025-5-8 17:20
有几个排序是不稳定吧

是的

使用特权

评论回复
发新帖 本帖赏金 30.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

566

帖子

5

粉丝