華山論劍開始,報名名單為:郭靖,黃蓉,洪七公,歐陽鋒,歐陽克,周伯通,瑛姑,黃藥師,楊康,穆念慈,柯鎮惡,尹志平。
要獲取所有參賽者的最終排名,該如何設計演算法呢?
如果用氣泡排序、選擇排序、插入排序、希爾排序、堆排序、快速排序、歸併排序,可能導致一些既浪費時間又浪費表情的比賽,比如:
洪七公 vs 尹志平
歐陽鋒 vs 歐陽克
黃藥師 vs 穆念慈
可以考慮把參賽人分為四個水平段位,然後,在相同的水平段位中分別比較,這就是所謂的桶排序。
高水平洪七公 歐陽鋒 周伯通 黃藥師
中水平郭靖
低水平黃蓉 歐陽克 瑛姑 楊康 柯鎮惡
菜鳥級穆念慈 尹志平
我們先看這樣乙個問題:
問題:高考語數外三門課的滿分都是150分,有n人參加這三門考試,請對考生的語數外三門課的平均分進行排序,要求時間複雜度盡可能低。
基於比較的排序,時間複雜度不符合要求。計數排序(高考分數排序之計數排序
)又無法處理浮點數。怎麼辦呢?還是來看桶排序吧。語數外三科的平均分區間是[0, 150], 且可能取小數,我們可以建立150個桶,如下:
遍歷所有待排序分數,根據值的大小,塞入到對應的桶中,這個過程的時間複雜度為o(n). 分桶的過程,揭示了桶排序的本質:不同的桶之間,不需要比較,因為左邊桶中的所有元素一定小於右邊桶中的所有元素,減少了很多無用的比較。
然而,每個桶內,還是需要比較的,可以採取快速排序。假設桶的個數為m, 平均每個桶內的元素個數為n/m, 桶排序的整體時間複雜度是:
o(n + m*n/mlog(n/m))
當m接近n時,上式近似簡化為o(n),也就是說,此時桶排序是線性時間複雜度的排序。而當m=1時,只有乙個桶,此時桶排序退化為快速排序,時間複雜度為o(nlogn). 所以,要合理選擇桶的個數。
回頭想一下,計數排序其實是桶排序的特殊情況。計數排序時,桶中元素可能有c個完全相等的值,桶類不用排序,直接計數就可以了。比如,要對如下資料進行計數排序:
a: 可以引入7個桶:桶0中有2個0, 桶1中有1個1, 桶2中有3個2, 桶3中有2個3, 桶4中無元素, 桶5中有1個5,桶6中有1個6,如圖:
可見,計數排序確實可以看作是桶排序的特殊情況。
在一些場景下,桶排序可以處理海量資料問題。比如,有這樣乙個問題:
在a檔案中有100億個浮點數,請對這些資料進行排序。
顯然,無法直接把100億個資料讀到記憶體中,bitmap也沒轍了。桶排序出場,步驟如下:
a. 建立合理的檔案數,每個檔案對應乙個桶,遍歷100億個浮點數,歸類到對應的桶中。
b. 分別把每個桶的元素載入到記憶體中,快速排序後,儲存到對應的桶中。
c. 遍歷每個桶的元素,寫入到檔案中,完成100億個資料的排序。
可以看到,用桶排序解決海量資料問題,其本質是分治,桶天然具有分治的能力。在筆試和面試中,桶排序常常會有妙用。
桶排序引入了桶,耗費了空間,節省了時間,這種以空間換時間的技巧,在電腦科學中無處不在。
我們描述了桶排序的演算法,也分析了演算法的時間複雜度,至於程式實現,那就比較簡單了,便不再贅述。掌握思路,才是最重要的。
華山論劍之iOS tableView的雙劍合璧
對待生活,你用什麼的態度對待它,它就會以什麼的態度回報你,那麼請善待你的生活.其實這就是乙個控制器中如何展現兩個tableview的問題的具體化,我們都知道通常情況下,乙個控制器只能有乙個tableview,因為乙個控制器只能實現乙個資料來源方法.下面有兩種解決方案.具體使用哪一種,根據實際情況而定...
桶排序(最簡單的排序演算法)
桶排序的基本思想 將乙個資料表分割成許多buckets,然後每個bucket各自排序,或者用不同的排序演算法,遞迴的 使用bucket sort 演算法,也是一種典型的divide and conquer分而治之的策略,它是一種分布式的排序,介於msd基數排序和lsd基數排序之間 def bucke...
啊哈演算法 之 簡單的桶排序
從今天起要開始攻讀 啊哈,演算法 這本最初級的演算法書了,計畫一周之內讀完。第乙個演算法 桶排序。這個演算法就好比有很多個桶,每出現乙個數就在他對應的桶中插乙個小旗子,最後數數每個桶中有幾個小旗子就ok了,這樣就能正確的輸出排序後的數了。下面我們舉個例子,來說明一下該演算法的實現原理。期末考試完了,...