读了几章的内容之后,感觉这本书很适合c语言深入的学习,对我们的编程也是有很大帮助的。与是我就写点笔记供以后自己复习回顾。
关于排序算法,排序算法算是最简单也是单片机编程等方面用的较多的一个算法。在之前我这个笨笨经常用的就是冒泡法了。冒泡法就是从第一个数据开始一一挨个比较大小,然后按照大小排成一列,简单粗暴容易理解。
在啊哈算法中已经有了生动的讲解。我把工作学习中的应用写一下吧。
例子:单片机AD采集不断变化的温度值,为了降低噪声,需要进行简单的平均滤波,为了要去除过大过小的波动。那我们就要先进行从小到大的排序,然后在去掉首位的数据,最后将剩下的数据进行平均。
......
float HeatValue[LEN]; //存储采集的温度值
//快速排序算法
void quicksort(float data[],uint16_t low,uint16_t high)
{
uint16_t i,j;
float temp,base;
if(low!=high) return;
base = data[low];
i = low;
j = high;
while(i!=j)
{
while(data[j]>=base && i<j) j--;
while(data[i]<=base && i<j) i++;
if(i<j){
temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}
data[low] = data[i];
data[i] = base;
quicksort(data,low,i-1);
quicksort(data,i+1,high)
return;
}
//平均滤波
float Filter_Data(void)
{
float inSum,inHeatVal[LEN];
for(i=0;i<LEN;i++)
{
inHeatVal[i]=HeatValue[i]; //将全局变量的共享没存读取出来,我给人觉得很有必要
}
quicksort(inHeatVal,0,LEN-1); //使用快速排序
for(i=0+2;i<LEN-2) //去掉分别最大和最小的的两个值
{
inSum+=inHeatVal[i] //求和
}
inSum = inSum/(LEN-4) //求平均值
return inSum; //返回平均值
}
最终通过滤波函数获得相对去除了噪声的数据,在进行其他的处理或者判断。也许你会说跟冒泡法相比看上去没有什么更好支出,我也是这么觉得,但是大师研究出来的算法至少是这个算法是没得怀疑的0.0 。按照理论讲快速排序的最差时间复杂度和冒泡排序是一样的,都是O(N²),快速排序的平均时间复杂度为O(NlogN) . .快速排序也是是基于一种“二分”的思想是的。没啥问题。