排序之桶排序
阿新 • • 發佈:2019-02-03
本文以《啊哈!演算法》為教材,個人理解整理。
例:老師要給5個小朋友進行打分,滿分為10分,要求將最終的分數從高到低排序後顯示出來。
輸入:5 3 5 2 8
輸出:8 5 5 3 2
桶排序就像它的名字一樣和桶很相似,如分數的範圍為0~10,那就可以分為11個“桶”,分別為:
桶0,桶1,桶2,桶3,桶4,桶5,桶6,桶7,桶8,桶9,桶10。所有的桶一開始都是空的。
如果一個小朋友得分為5,就在桶5中放入一個代表物,如旗子,表示得分為5的有1人。同樣地,如果一個小朋友得分為3,就在桶3中放入一個旗子,以此類推。
最後,由於要求從高到低排序,因此應該從桶10開始確認每個桶中的旗子數量,有幾個旗子就輸出幾次桶的序號,如桶8一個旗子,桶5兩個旗子,輸出即為8 5 5。
用C語言表示,需要首先定義一個11位的陣列a[11],並將a中每個元素都初始化為0,再迴圈5次獲取5個小朋友的成績,獲取的同時將a中對應位置的數值增加1,如得5分則a[5]++,得8分則a[8]++,以此類推。
最後倒序輸出,即從a[10]開始迴圈,根據每個元素的數值輸出相應次數的下標。
int main() { int a[11], i, j, t; for(i = 0; i <= 10; i++) { a[i] = 0; //初始化桶內為0 } for(i = 0; i < 5; i++) { scanf("%d", &t); a[t]++; //將要排序的數字放入相應的桶中 } for(i = 10; i >= 0; i--) //從大到小排序輸出 { for(j = 1; j <= a[i]; j++) { printf("%d ", i); } } return 0; }
以上是桶排序最簡單的思路了,今天學習完這個,我思考它的特徵,最初猜測是不是在數值最大和最小範圍確定的情況下(現在我還不考慮效率等其他因素),可以使用桶排序解決。但是思考了下,假如例題中分數下界0是確定的,上界是不確定的情況下,只需判斷5個小朋友分數的最高分,也可獲得一個符合例題情況的上界。同理,也可以動態獲得一個下界。
寫著寫著突然覺得其實我可以不用思考這麼多,應用時本身都是需要根據實際情況進行修改的,我從一個當前定死的演算法上去延伸實際應用,面對的可能是無窮無盡的鬱悶。