讀了幾章的內容之後,感覺這本書很適合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) . .快速排序也是是基於一種“二分”的思想是的。沒啥問題。