啊哈算法 之 簡單的桶排序

算法介紹

從今天起要開始攻讀《啊哈,算法》這本最初級的算法書了,計劃一週之內讀完。
第一個算法 桶排序。
這個算法就好比有很多個桶,每出現一個數就在他對應的桶中插一個小旗子,最後數數每個桶中有幾個小旗子就OK了,這樣就能正確的輸出排序後的數了。

舉個栗子

下面我們舉個例子,來說明一下該算法的實現原理。
期末考試完了,老師要根據同學們的分數進行從高到低進行排序,這五個同學的分數分別是,5,3,5,2,8,哎。考的慘不忍睹(最高10分),下面我們要用桶排序進行排序,排序後的輸出應該是 8 5 5 3 2 。
首先我們要申請一個大小爲11的數組,把a[0] -- a[10]都初始化爲0,表示分數還沒有人得過。例如a[0] 等於0 說明沒人得到0分,以此類推,a[1] 等於1 表示有一個人得了1分。下面我們就將五個人的分數一次賦值給數組a。第一位同學爲5分,那麼a[5]的值+1,第二位同學爲3分,a[3]的值+1,第三位。。。。。。

代碼實現

#include <stdio.h>
int main(int argc, const char * argv[])
{
    int a[11],i,j,t;
    for (int i = 0; i < 11; i++) {
        a[i] = 0; //數組a的所有數都初始化爲0
    }
    for (i = 1; i <= 5; i++) { //循環讀入5個數
        scanf("%d",&t); //把變量中的每個數讀入t
        a[t]++; //把t賦值數組
    }
    for (int i = 0; i < 11; i++) {
        for (j = 1; j <= a[i]; j++) {
            printf("%d ",i);
        }
    }
    printf("\n");
    return 0;
}

上面就是代碼實現了,結合註釋,大家理解起來應該沒什麼難度。

時間複雜度

第一個for循環了 11次,加上 int m = 11,就是m次,第二for循環了循環了5次,加上 int n =5就是n次,第三個,第四個for循環就是一共循環了  m+n次,所以該算法的時間複雜度爲: m+n+m+n次,我們用大寫字母O來表示時間複雜度,那麼該算法的時間複雜度爲O(m+n+m+n)即O(2*(m+n)),我們在計算時間複雜度的時候可以省略較小的常數,所以該算法的時間複雜度就是O(m+n),還有一點表示時間複雜度是時候,一般m 和 n都用大寫表示,即: O(M+N)。

算法的優缺點

同排序的優點,大家可以通過時間複雜度的可以看出,該算法是非常快的,相比大家比較熟悉的冒泡排序,要快很多很多。但是該算法的缺點同樣明顯,那就是太浪費空間了,例如你要對20000000個數進行排序,那麼你就要申請20000000的數組來存儲這些數,這無疑是非常浪費內存的。所以,具體應用場景還要大家根據自己的實際情況進行選擇,到底應該是以空間換效率還是以效率換空間。

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