OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4304|回复: 10

C语言排序问题,对不定长数组进行排序。

[复制链接]

20

主题

99

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2020-6-21
在线时间
70 小时
发表于 2020-8-30 11:59:25 | 显示全部楼层 |阅读模式
1金钱
我采集到的adc值很飘,我想采集个20次,用冒泡排序得到中间的5个再算这五个的平均值。
然后写这个程序我想到了一个问题。
如果要对不定长的整数序列进行排序该怎么解决。、
我现在能排序是因为我知道要有5个。

假设是输入任意个整数,然后输出它们的升序。
这个程序该怎么实现呢?用strlen()能得出它们的长度吗?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6745
金钱
6745
注册时间
2017-4-12
在线时间
1258 小时
发表于 2020-8-30 13:50:02 | 显示全部楼层
你自己获取到了多少个AD值不是知道吗,这个长度不就有咯,strlen遇到‘\0’就结束了
回复

使用道具 举报

6

主题

279

帖子

0

精华

高级会员

Rank: 4

积分
750
金钱
750
注册时间
2015-3-27
在线时间
98 小时
发表于 2020-8-30 13:51:19 | 显示全部楼层
strlen() 是字符串长度,不可以用来求数组的长度,因为C标准规定了0值('/0')作为字符串结束的标志,如果你有0值,长度计算就要出错。
求数组的大小用sizeof,求数组元素的个数用sizeof/arr[0]:
  1. {
  2.     int data[10];
  3.     int length;
  4.     length=sizeof(data)/sizeof(data[0]);
复制代码
回复

使用道具 举报

11

主题

2149

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4926
金钱
4926
注册时间
2015-1-10
在线时间
618 小时
发表于 2020-8-30 15:40:29 | 显示全部楼层
这种软件滤波的方式很粗糙啊,ADC可能会出现0的,我觉得还是解决ADC为什么会飘更可靠一点
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-8-30 18:04:31 | 显示全部楼层
要么用链表要么用柔性数组
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8024
金钱
8024
注册时间
2014-8-13
在线时间
1595 小时
发表于 2020-8-30 18:11:02 | 显示全部楼层
如果是固定采集20个的话,你可以将这20个数值去掉8个最高值,再去掉8个最低值,剩下4个数值做平均。如果去掉8个需要排序,那么你就可以每次去掉1个最高值,重复8次。估计效率也不会低太多。
回复

使用道具 举报

12

主题

3399

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8674
金钱
8674
注册时间
2020-5-11
在线时间
4143 小时
发表于 2020-8-31 08:26:34 | 显示全部楼层
取平均需要排序?我常用的算法是去掉最大值、最小值,剩下的求平均。
  1. U16 average(U16 a[],U8 n)
  2. {
  3.         U16 max,min,ave=0;
  4.         U32 sum=0;
  5.         U8 i;
  6.         if(n<1)return 0;
  7.         if(n<2)return a[0];       
  8.         if(n<3)return (((U32)a[0]+a[1])/2);               
  9.     max=a[0];
  10.     min=a[0];
  11.     for(i=0;i<n;i++)
  12.         {
  13.                 if(max<a[i])max=a[i];
  14.                 if(min>a[i])min=a[i];
  15.                 sum+=a[i];
  16.         }
  17.         ave=(sum-min-max)/(n-2);
  18.         return ave;
  19. }
复制代码
专治疑难杂症
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2020-8-31 12:30:19 | 显示全部楼层
请使用互补滤波 算法,或者是卡尔曼之类的..
回复

使用道具 举报

2

主题

459

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4504
金钱
4504
注册时间
2018-5-14
在线时间
962 小时
发表于 2020-8-31 12:33:51 | 显示全部楼层
创建20个字节的fifo不就行了,先入先出保证数组中始终都是20个字节长度。
回复

使用道具 举报

20

主题

99

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2020-6-21
在线时间
70 小时
 楼主| 发表于 2020-8-31 13:09:16 | 显示全部楼层
我知道采集固定个数的要怎么做。

我是在做这个时候产生了疑问,如果个数是不固定的怎么办。

也就是输入 任意长度的一组整数,我能知道这组数有多少长吗?
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2020-9-1 13:54:51 | 显示全部楼层
本帖最后由 szczyb1314 于 2020-9-1 14:02 编辑
flyingPiggy 发表于 2020-8-31 13:09
我知道采集固定个数的要怎么做。

我是在做这个时候产生了疑问,如果个数是不固定的怎么办。

你先说,你怎么实现输入这个不定长的一组数据??数组不定长,就没有顺序可言,你咋能知道不定长的数据的顺序?在某一瞬间数据定长了才有固定的大小顺序。要是数据不定长了你咋能知道后面数据是多少个?多大?该排序在哪里?
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-12 19:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表