說明:本文部分內容借鑑《啊哈!演算法》,如有版權問題,請聯絡jouzeyu@163.com
前言:什麼是桶排序
桶排序其實就是一種歸納排序,他將要進行排序的陣列分到有限的桶裡面,然後對桶進行歸納排序,可以理解成他是一個歸納結果。
案例,來自《啊哈!演算法》
小哼的班上只有 5 個同學,這 5 個同學分別考了 5 分、3 分、 5 分、2 分和 8 分,哎考得真是慘不忍睹(滿分是 10
分)。接下來將分數進行從小到大排序, 排序後是 2 3 5 5 8。思路分析
首先,他的總分是10分,也就是說有11種情況,所以我們需要11個桶,開始的時候我們都不給這些桶加水,也就是每個桶是0,每個桶都標號從0開始到10結束。
然後呢我們可以看到有5個同學,所以,我們可以透過迴圈拿到這五個同學的分數,拿到分數後,比如我先拿到的是8分,那麼我們就給標號為8的桶加1刻度水(當然也不一定是刻度為單位,也可以是升,毫升什麼的,這裡是方便理解),這樣下來,標號為2的桶裡有1刻度水,標號為3的桶裡有1刻度水,標號為5的桶裡有2刻度水,標號為8的桶裡有1刻度水。
最後,我們對這些桶裡面的水進行統計,從前往後,有一刻度水的就列印這個桶編號1次,兩刻度水的就列印桶編號2次
原始碼實現
#include <stdio.h>
int main()
{
int a[11],i,j,t;
for(i=0;i<=10;i++)
a[i]=0; //初始化為0
for(i=1;i<=5;i++) //迴圈讀入5個數
{
scanf("%d",&t); //把每一個數讀到變數t中
a[t]++; //進行計數
}
for(i=0;i<=10;i++) //依次判斷a[0]~a[10]
for(j=1;j<=a[i];j++) //出現了幾次就列印幾次
printf("%d ",i);
getchar();getchar();
//這裡的getchar();用來暫停程式,以便檢視程式輸出的內容
//也可以用system("pause");等來代替
return 0;
}
這個是Java的實現過程,但是我平時用的是PHP,那麼PHP的實現程式碼是什麼樣子的呢?
public function index()
{
//需要進行排序的陣列
$arr = array(5, 3, 5, 2, 8);
//宣告一個空陣列
$list = array();
//將空陣列賦值0
for ($i = 0; $i <= 10; $i++) {
$list[$i] = 0;
}
//按照相應的進行重新賦值
for ($j = 0; $j < sizeof($arr); $j++) {
$list[$arr[$j]]++;
}
//列印排序後的結果
for ($i = 1; $i <= 10; $i++) {
for ($j = 1; $j <= $list[$i]; $j++) {
var_dump($i);
}
}
}
其實差不了多少,只不過語法不同,精簡了少部分程式碼,因為沒有深入研究java的關係,沒搞明白那5個數字怎麼輸入進去,所以定義了一個需要排序的陣列,第一個for迴圈分配了所需要的桶,第二個for迴圈相當於給桶裡面加水,第三個for迴圈相當對輸出,你,瞭解了嗎?
如有不對的地方,歡迎留言指正!
本作品採用《CC 協議》,轉載必須註明作者和本文連結