回答
當你擁有一大組數據並且鍵受到某種限制時,這很好。例如,當您需要訂購一百萬個64位數字的數組時,可以使用它排序8個最低有效位,然後8個等等(應用8次)。這樣這個數組可以在8 * 1M操作中排序,而不是1M * log(1M)。
但是log(1M)是6 ... – Yaniv 2015-01-11 15:08:26
@ N.McA。雖然日誌庫2(1M)等於19.93 ... – 2016-04-12 00:04:22
如果你知道的整數值的範圍,這不是太大,
也許counting sort將你的情況是更好的選擇。
你可能不會像你想象的那樣經常看到它的一個原因是基數排序不像基於比較的排序(quicksort/mergesort/heapsort)那樣具有通用性。它要求您可以將要排序的項目表示爲整數或類似整數的項目。使用標準庫時,很容易定義比較任意對象的比較函數。定義一種將您的任意數據類型正確映射爲整數的編碼可能會更困難。
當離散鍵值的數量相對於數據項的數量較小,並且目標是在不干擾原始數據的情況下產生列表的重新排序副本(因此需要同時維護列表的新舊版本不是一種負擔)。如果可能的密鑰數量太大而無法在一次傳遞中處理,則可以通過多次傳遞將桶類型擴展爲基數排序,但是失去了桶類型可以爲小型密鑰提供的速度優勢。
在一些外部排序情況下,特別是當不同鍵值的數量非常小(例如兩個)時,需要穩定的排序,並且I/O設備只能用一個順序數據流高效地運行,可能對K通過源數據流有用,其中K是鍵值的數量。在第一遍中,複製鑰匙爲最小合法值的所有物品,並跳過其餘部分,然後複製鑰匙位於下一個較高值的所有物品,跳過其餘部分,等等。這種方法顯然效率非常高如果有很多不同的關鍵值,但是如果有兩個關鍵值則會很好。
- 1. 我什麼時候可以使用Task.Yield()?
- 2. 什麼時候可以使用filter_input()
- 3. 什麼時候可以使用IORef?
- 4. 什麼時候可以使用lodash.after()?
- 5. 你什麼時候可以使用uint_least16_t
- 6. 我什麼時候可以使用AppDomain?
- 7. 什麼時候可以調用BarcodeScanner.GetDefaultAsync()?
- 8. 什麼是BigInteger,我們什麼時候可以使用它?
- 9. 什麼時候應該使用可可?
- 10. 什麼時候可以安全使用PHP strtolower()函數?
- 11. 什麼時候可以使用isset和GET函數
- 12. KineticJS:我什麼時候使用toImage()以及什麼時候使用緩存()
- 13. 什麼時候DataView可用?
- 14. 什麼時候使用__proto__和什麼時候使用原型
- 15. 什麼時候應該使用AWS,什麼時候不使用
- 16. intn_t什麼時候使用它,什麼時候不使用
- 17. 什麼時候使用Ruby和什麼時候使用PHP
- 18. 什麼時候使用ByteString,什麼時候不使用?
- 19. 什麼時候會話數據可用?
- 20. R的class.ind()函數做什麼?我什麼時候可以使用它?
- 21. 什麼時候可以寫Mockito.anyInt()?
- 22. 什麼時候可以捕獲RuntimeException
- 23. 什麼時候可以mktime返回-1?
- 24. 什麼時候可以ManualResetEvent.Set()返回false?
- 25. TDD。什麼時候可以繼續?
- 26. 什麼時候可以ValidatorUtils.getValueAsString()返回null?
- 27. 什麼時候可以Request.Url爲空?
- 28. 什麼時候應用程序可以成爲遊戲?
- 29. 你什麼時候可以用降序定義一個索引?
- 30. 什麼時候應該使用async/await,什麼時候不用?
你有沒有一個你期望它被使用的地方的例子,但它不是? – 2010-03-02 04:03:31
基數排序對比較類型比比較排序提出了更強的要求,並不總是顯着更快。對於整數,基數可能更快。 – 2012-05-07 22:22:10