1. 程式人生 > >排序之桶排序

排序之桶排序

本文以《啊哈!演算法》為教材,個人理解整理。

例:老師要給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個小朋友分數的最高分,也可獲得一個符合例題情況的上界。同理,也可以動態獲得一個下界。

寫著寫著突然覺得其實我可以不用思考這麼多,應用時本身都是需要根據實際情況進行修改的,我從一個當前定死的演算法上去延伸實際應用,面對的可能是無窮無盡的鬱悶。