最快最簡單的排序——桶排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#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;
}
|
5 3 5 2 8這個演算法就好比有11個桶,編號從0~10。每出現一個數,就將對應編號的桶中的放一個小旗子,最後只要數數每個桶中有幾個小旗子就OK了。例如2號桶中有1個小旗子,表示2出現了一次;3號桶中有1個小旗子,表示3出現了一次;5號桶中有2個小旗子,表示5出現了兩次;8號桶中有1個小旗子,表示8出現了一次。 現在你可以請嘗試一下輸入n個0~1000之間的整數,將他們從大到小排序。提醒一下如果需要對資料範圍在0~1000之間的整數進行排序,我們需要1001個桶,來表示0~1000之間每一個數出現的次數,這一點一定要注意。另外此處的每一個桶的作用其實就是“標記”每個數出現的次數,因此我喜歡將之前的陣列a換個更貼切的名字book(book這個單詞有記錄、標記的意思),程式碼實現如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include
<stdio.h>
int main()
{
int book[1001],i,j,t,n;
for (i=0;i<=1000;i++)
book[i]=0;
scanf ( "%d" ,&n); //輸入一個數n,表示接下來有n個數
for (i=1;i<=n;i++) //迴圈讀入n個數,並進行桶排序
{
scanf ( "%d" ,&t); //把每一個數讀到變數t中
book[t]++; //進行計數,對編號為t的桶放一個小旗子
}
for (i=1000;i>=0;i--) //依次判斷編號1000~0的桶
for (j=1;j<=book[i];j++) //出現了幾次就將桶的編號列印幾次
printf ( "%d
" ,i);
|