**:
#include int這種排序方法我們暫且叫他「桶排序」。因為其實真正的桶排序要比這個複雜一些,以後再詳細討論,目前此演算法已經能夠滿足我們的需求了。main()
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");等來代替
return0;
}
這個演算法就好比有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 #include 2最後來說下時間複雜度的問題。**中第6行的迴圈一共迴圈了m次(m為桶的個數),第9行的**迴圈了n次(n為待排序數的個數),第14和15行一共迴圈了m+n次。所以整個排序演算法一共執行了m+n+m+n次。我們用大寫字母o來表示時間複雜度,因此該演算法的時間複雜度是o(m+n+m+n)即o(2*(m+n))。我們在說時間複雜度時候可以忽略較小的常數,最終桶排序的時間複雜度為o(m+n)。還有一點,在表示時間複雜度的時候,n和m通常用大寫字母即o(m+n)。intmain()313
for(i=1000;i>=0;i--) //
依次判斷編號1000~0的桶
14for(j=1;j<=book[i];j++) //
出現了幾次就將桶的編號列印幾次
15 printf("
%d "
,i);
1617
getchar();getchar();
18return0;
19 }
這是乙個非常快的排序演算法。桶排序從2023年就開始被使用,該演算法的基本思想是由e.j.issac和r.c.singleton提出來。之前我有說過,其實這並不是真正的桶排序演算法,真正的桶排序演算法要比這個更加複雜。但是考慮到此處是演算法講解的第一篇,我想還是越簡單易懂越好,真正的桶排序留在以後再聊吧。需要說明一點的是:我們目前學習的簡化版桶排序演算法其本質上還不能算是乙個真正意義上的排序演算法。為什麼呢?例如遇到下面這個例子就沒轍了。
現在分別有5個人的名字和分數:huhu 5分、haha 3分、xixi 5分、hengheng 2分和gaoshou 8分。請按照分數從高到低,輸出他們的名字。即應該輸出gaoshou、huhu、xixi、haha、hengheng。發現問題了沒有?如果使用我們剛才簡化版的桶排序演算法僅僅是把分數進行了排序。最終輸出的也僅僅是分數,但沒有對人本身進行排序。也就是說,我們現在並不知道排序後的分數原本對應著哪乙個人!這該怎麼辦呢?不要著急請看下節——氣泡排序。
啊哈演算法 桶排序
桶排序 include includeint main for i 0 i 10 i 依次判斷a 0 a 10 for j 1 j a i j 出現了幾次就列印幾次 printf d i system pause return 0 2019.10.7 不是很懂那個依次判斷a 0 a 10 出現了幾次...
啊哈演算法 之 簡單的桶排序
從今天起要開始攻讀 啊哈,演算法 這本最初級的演算法書了,計畫一周之內讀完。第乙個演算法 桶排序。這個演算法就好比有很多個桶,每出現乙個數就在他對應的桶中插乙個小旗子,最後數數每個桶中有幾個小旗子就ok了,這樣就能正確的輸出排序後的數了。下面我們舉個例子,來說明一下該演算法的實現原理。期末考試完了,...
1 桶排序 啊哈演算法java實現
題目 5個人考試得分分別為 5分,3分,5分,2分,8分 滿分是10分 要將 5 3 5 2 8 這個陣列進行降序排序 即排序後變為 8 5 5 3 2 桶排序解法 建乙個大小為11的一維陣列a,a 0 a 10 元素都初始化為0,用元素下標0 10表示分數,用元素的值表示有多少人得過該元素下標對應...