跟着西瓜兄弟學算法算法
老大:我簡單給你講下吧,你學過那麼多排序,估計一看就懂了。基數排序,是一種基數「桶」的排序,他的排序思路是這樣的:先以個位數的大小來對數據進行排序,接着以十位數的大小來多數進行排序,接着以百位數的大小......數組
排到最後,就是一組有序的元素了。不過,他在以某位數進行排序的時候,是採用「桶」來排序的,基本原理就是把具備相同個(10、百等)位數的數放進同一個桶裏。我直接給你個例子吧,保證你一看就懂。工具
例如咱們如今要對這組元素來排序:開發工具
因爲咱們是以每一個數的某位數來排序的,這位數的範圍是0-9,因此咱們須要10個桶。測試
第一遍,先以個位數排序,把具備相同個位數的數放進桶裏,結果以下:3d
以後再按照從0號桶到9號桶的順序取出來,結果以下指針
個位數排序完成。cdn
第二遍,以十位數來排,結果以下:視頻
再取出來放回去:blog
十位數排序完成,最終的結果就是一組有序的元素。若是元素中有百位數的話,大不了就按照百位數再給他重複排一遍。
老二:那我想問下,爲啥要從個位數開始排序呢?能夠直接從最高位開始排序嗎?若是從最高位開始排序的話,若是一個數最高位比另外一個數大,那麼這個數就必定比另一個數大了,不用在比較次高位了。這樣的話,不是能夠排的更快嗎?
老大:腦子反應的挺快啊。是的,是能夠以最高位來排序的,並且也像你說的,以最高位來排序的話,是能夠減小數據之間比較的次數。但咱們仍然不建議以最高位來排序,由於他有個致命的缺點。
老大:仍是以剛纔那個例子吧,咱們一邊用最高位來排序,一邊來尋找這個致命的缺點。數組以下(元素的順序改變了一些):
第一遍:最高位十位數排序,結果以下(有些沒用到的桶給省略了):
顯然,不在桶一個桶裏的數,他們的大小順序已是已知的了,也就是說,右邊桶的數必定比左邊桶的數大,全部在接下來的個位數排序裏,咱們只須要進行「各部分」單獨排序就能夠了,每一小部分都相似於原問題的一個子問題,作的時候能夠採用遞歸的形式來處理。
最後彙總,便可完成排序:
這種方法確實能夠減小比較的次數,不過請你們注意,在每一個小部分的排序中,咱們也是須要10個桶來將他們進行排序,最後致使的結果就是,每一個不一樣值的元素都會佔據一個「桶」,若是你有1000個元素,而且1000個元素都是不一樣值的話,那麼從最高位排序到最低位,須要1000個桶。
這樣子的話,空間花費不只大,並且看起來有點背離基數排序最初的思想了(「背離」這個詞,我的感受而已)。因此,咱們通常採用從最低位到最高位的順序哦。
關於基數排序,還有如下幾個問題,你不妨也想想?
一、基數排序是一種用空間換時間的排序算法,數據量越大,額外的空間就越大?
個人想法:我以爲基數排序並不是是一種時間換空間的排序,也就是說,數據量越大,額外的空間並不是就越大。由於在把元素放進桶的時候,是徹底能夠用指針指向這個元素的,也就是說,只有初始的那些桶纔算是額外的空間。
二、竟然額外空間不是限制基數排序速度的緣由,那爲啥基數排序沒有快速排序快呢?
基數的時間複雜度爲O(n),不過他是忽略了常數項,即實際排序時間爲kn(其中k是常數項),然而在實際排序的過程當中,這個常數項k實際上是很大的,這會很大程度影響實際的排序時間,而像快速排序雖然是nlogn,但它前面的常數項是相對比較小的,影響也相對比較小。
須要說明的是,基數排序也並不是比快速排序慢,這得看具體狀況,(不要被標題所影響哈)。並且,數據量越大的話,基數排序會越有優點。
三、有人可能會問,說了這麼多,那究竟是基數排序快仍是快速排序快呢?
對於這樣的問題,我只能建議你,本身根據不一樣的場景,擼幾行代碼,本身測試一下。
若是你問我,哪一個排序在實際中用的更多,那麼,我選快速排序。
文章講這裏,也結束了,若是你有什麼其它想法,歡迎後臺來騷擾。
若是你以爲這篇內容對你挺有啓發,爲了讓更多的人看到這篇文章,不妨
一、點贊,讓更多的人也能看到這篇內容(收藏不點贊,都是耍流氓 -_-)
二、關注我和專欄,讓咱們成爲長期關係
三、關注公衆號「苦逼的碼農」,主要寫算法、計算機基礎之類的文章,裏面已有100多篇原創文章,我也分享了不少視頻、書籍的資源,以及開發工具,歡迎各位的關注,第一時間閱讀個人文章。