找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1885|回复: 4
打印 上一主题 下一主题
收起左侧

求省时的C语言传感器数据排序方法

[复制链接]
跳转到指定楼层
楼主
ID:318095 发表于 2019-4-1 11:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
传感器测量数据进行排序中值取平均,数据跟上位机通信时一直有延时感觉可能是排序时间过长,求一个省时的排序方法。
我自己试过两种,大神有没有其他的方法
第一种冒泡法
void sequence(float a[],int n)    //从小到大排序
{
  int i=0;
  int j=0;
  float temp=0;
  for(i=0;i<n-1;i++)
  {
    for(j=i+1;j<n;j++)
        {
          if(a[i]>a[j])
          {
            temp=a[i];
                a[i]=a[j];
                a[j]=temp;
          }
        }
  }
}  
第二种希尔排序
void ShellSort(int arr[], int length)
{
        int increasement = length;
        int ii,ij,ik;
        do
        {
                // 确定分组的增量
                increasement = increasement / 3 + 1;
                for (ii = 0; ii < increasement; ii++)
                {
                        for (ij = ii + increasement; ij < length; ij += increasement)
                        {
                                if (arr[ij] < arr[ij - increasement])
                                {
                                        int temp = arr[ij];
                                        for (ik = ij - increasement; ik >= 0 && temp < arr[ik]; ik -= increasement)
                                        {
                                                arr[ik + increasement] = arr[ik];
                                        }
                                        arr[ik + increasement] = temp;
                                }
                        }
                }
        } while (increasement > 1);
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:158375 发表于 2019-4-1 12:45 | 只看该作者
你是要求排序?还是要求区平均?
要想快:提高单片机的时钟!
回复

使用道具 举报

板凳
ID:277550 发表于 2019-4-1 13:14 | 只看该作者
回复

使用道具 举报

地板
ID:505820 发表于 2019-4-6 17:12 | 只看该作者
LSD是比较好的。
#include<stdio.h>

#define Max_ 10      //数组个数
#define RADIX_10 10    //整形排序
#define KEYNUM_31 10     //关键字个数,这里为整形位数

// 打印结果
void Show(int  arr[], int n)
{
    int i;
    for ( i=0; i<n; i++ )
        printf("%d  ", arr[i]);
    printf("\n");
}

// 找到num的从低到高的第pos位的数据
int GetNumInPos(int num,int pos)
{
        int temp = 1;
        for (int i = 0; i < pos - 1; i++)
                temp *= 10;
   
        return (num / temp) % 10;
}


//基数排序  pDataArray 无序数组;iDataNum为无序数据个数
void RadixSort(int* pDataArray, int iDataNum)
{
        int *radixArrays[RADIX_10];    //分别为0~9的序列空间
        for (int i = 0; i < 10; i++)
        {
                radixArrays[i] = (int *)malloc(sizeof(int) * (iDataNum + 1));
                radixArrays[i][0] = 0;    //index为0处记录这组数据的个数
        }
       
        for (int pos = 1; pos <= KEYNUM_31; pos++)    //从个位开始到31位
        {
                for (int i = 0; i < iDataNum; i++)    //分配过程
                {
                        int num = GetNumInPos(pDataArray[i], pos);
                        int index = ++radixArrays[num][0];
                        radixArrays[num][index] = pDataArray[i];
                }
        
                for (int i = 0, j =0; i < RADIX_10; i++)    //收集
                {
                        for (int k = 1; k <= radixArrays[i][0]; k++)
                                pDataArray[j++] = radixArrays[i][k];
                        radixArrays[i][0] = 0;    //复位
                }
        }
}

int main()
{   //测试数据
    int arr_test[Max_] = { 8, 4, 2, 3, 5, 1, 6, 9, 0, 7 };
    //排序前数组序列
    Show( arr_test, Max_ );
    RadixSort( arr_test, Max_);
    //排序后数组序列
    Show( arr_test, Max_ );
    return 0;
}
回复

使用道具 举报

5#
ID:366559 发表于 2019-4-7 12:01 | 只看该作者
在单片机可以处理的数据量下,希尔排序一般都比归并要快,因为后者需要递归调用
在更小的数据量下,冒泡和插入比希尔快
关于希尔排序的序列,自行百度
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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