算法介紹
從今天起要開始攻讀《啊哈,算法》這本最初級的算法書了,計劃一週之內讀完。
第一個算法 桶排序。
這個算法就好比有很多個桶,每出現一個數就在他對應的桶中插一個小旗子,最後數數每個桶中有幾個小旗子就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的數組來存儲這些數,這無疑是非常浪費內存的。所以,具體應用場景還要大家根據自己的實際情況進行選擇,到底應該是以空間換效率還是以效率換空間。