常用排序演算法之桶排序

Jouzeyu發表於2019-11-26

說明:本文部分內容借鑑《啊哈!演算法》,如有版權問題,請聯絡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 協議》,轉載必須註明作者和本文連結
空舟湖上~      ——Jouzeyu

相關文章