公司現在要對所有員工的年齡進行排序,因為公司員工的人數非常多,所以要求排序演算法的效率要非常高,要求時間複雜度為o(n)
使用桶排序:
例子:首先出場的我們的主人公小哼,上面這個可愛的娃就是啦。期末考試完了老師要將同學們的分數按照從高到低排序。小哼的班上只有5個同學,這5個同學分別考了5分、3分、5分、2分和8分,哎考的真是慘不忍睹(滿分是10分)。接下來將分數進行從大到小排序,排序後是8 5 5 3 2。你有沒有什麼好方法編寫一段程式,讓計算機隨機讀入5個數然後將這5個數從大到小輸出?請先想一想,至少想15分鐘再往下看吧(*^__^*) 。
我們這裡只需借助乙個一維陣列就可以解決這個問題。請確定你真的仔細想過再往下看哦。
首先我們需要申請乙個大小為11的陣列int a[11]。ok現在你已經有了11個變數,編號從a[0]~a[10]。剛開始的時候,我們將a[0]~a[10]都初始化為0,表示這些分數還都沒有人得過。例如a[0]等於0就表示目前還沒有人得過0分,同理a[1]等於0就表示目前還沒有人得過1分……a[10]等於0就表示目前還沒有人得過10分。
下面開始處理每乙個人的分數,第乙個人的分數是5分,我們就將相對應a[5]的值在原來的基礎增加1,即將a[5]的值從0改為1,表示5分出現過了一次。
第二個人的分數是3分,我們就把相對應a[3]的值在原來的基礎上增加1,即將a[3]的值從0改為1,表示3分出現過了一次。
注意啦!第三個人的分數也是「5分」,所以a[5]的值需要在此基礎上再增加1,即將a[5]的值從1改為2。表示5分出現過了兩次。
按照剛才的方法處理第四個和第五個人的分數。最終結果就是下面這個圖啦。
你發現沒有,a[0]~a[10]中的數值其實就是0分到10分每個分數出現的次數。接下來,我們只需要將出現過的分數列印出來就可以了,出現幾次就列印幾次,具體如下。
a[0]為0,表示「0」沒有出現過,不列印。
a[1]為0,表示「1」沒有出現過,不列印。
a[2]為1,表示「2」出現過1次,列印2。
a[3]為1,表示「3」出現過1次,列印3。
a[4]為0,表示「4」沒有出現過,不列印。
a[5]為2,表示「5」出現過2次,列印5 5。
a[6]為0,表示「6」沒有出現過,不列印。
a[7]為0,表示「7」沒有出現過,不列印。
a[8]為1,表示「8」出現過1次,列印8。
a[9]為0,表示「9」沒有出現過,不列印。
a[10]為0,表示「10」沒有出現過,不列印。
所以員工的題目可以使用桶排序:
package jichu;
public class tong
for(int i=0;i<100;i++)}}
public static void main(string args);
so(a);}}
劍指offer 員工年齡排序
典型的以空間換時間問題,思路非常重要!員工年齡排序 員工可能有幾萬名,要求時間複雜度為o n 思路 員工的年齡必定在乙個範圍內,比方0 99,那麼我們建立乙個大小為100的輔助陣列,然後遍歷 員工年齡,取到乙個年齡就將該年齡相應陣列位置的值加1,終於陣列中便儲存了不同年齡的員工的個數 最後,列印陣列...
劍指Offer 對公司人員年齡進行排序
題目 對公司所有員工年齡進行排序。公司有大約幾萬名的員工,要求時間複雜度在o n 內,可以借助常數項的輔助空間。public static void sortages int ages int length ages.length int timesofage new int 99 1 掃瞄整個有效...
《劍指offer》 排序
一 資料流中的中位數 題目描述 如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert 方法讀取資料流,使用getmedian 方法獲取當前讀取資料...