讀《啊哈算法》學習筆記---快速排序

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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章