标题: 求省时的C语言传感器数据排序方法 [打印本页]

作者: han333    时间: 2019-4-1 11:48
标题: 求省时的C语言传感器数据排序方法
传感器测量数据进行排序中值取平均,数据跟上位机通信时一直有延时感觉可能是排序时间过长,求一个省时的排序方法。
我自己试过两种,大神有没有其他的方法
第一种冒泡法
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);
}


作者: 笨笨兔    时间: 2019-4-1 12:45
你是要求排序?还是要求区平均?
要想快:提高单片机的时钟!
作者: devcang    时间: 2019-4-1 13:14
研究的不简单,
https://baike.baidu.com/item/%E6 ... /5399605?fr=aladdin

作者: cicada3301    时间: 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;
}

作者: jerry_fuyi    时间: 2019-4-7 12:01
在单片机可以处理的数据量下,希尔排序一般都比归并要快,因为后者需要递归调用
在更小的数据量下,冒泡和插入比希尔快
关于希尔排序的序列,自行百度




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1