計數排序(counting sort)的思路很簡單,就是肯定比x小的數有多少個。加入有10個,那麼x就排在第11位。算法
嚴謹來說,在計算機科學中,計數排序是一個根據比較鍵值大小的排序算法,它也是一個整數排序算法。它經過比較對象的數值來操做,並經過這些計數來肯定它們在即將輸出的序列中的位置。它的運行時間是線性的且取決於最大值和最小值之間的差別,當值的變化明顯大於數目時就不太適用了。而它也能夠做爲基排序的子程序。數組
第2-3步,C數組的元素被所有初始化爲0,此時耗費Θ(k)時間。spa
第4-5步,也許不太好想象,其實就是在C數組中來計數A數組中的數。好比說,A數組中元素」3」有4個,那麼C[3]=4。此時耗費Θ(n)時間。.net
第7-8步,也是不太好想象的計算,也就是說若是C[0]=一、C[1]=4,那麼計算後的C[0]不變,C[1]=5。此時耗費Θ(k)時間。對象
第10-12步,把每一個元素A[j]放到它在輸出數組B中的合適位置。好比此時的第一次循環,先找到A[8],而後找到C[A[8]]的值,此時C[A[8]]的意義就在於A[8]應在B數組中的位置。完成這一步後將C[A[8]]的值減一,由於它只是一個計數器。這裏耗費的時間爲Θ(n)。blog
當k=O(n)時,計數排序的運行時間爲Θ(n)。排序
基數排序(radix sort)是一個古老的算法,它用於卡片排序機上。說來也巧,寫這篇博客的前一天晚上還在書上看到這種機器,它有80列,每一列都有12個孔能夠打。圖片
它可使用前面介紹的計數排序做爲子程序,然而它並非原址排序;相比之下,不少運行時間爲Θ(nlgn)的比較排序倒是原址排序。所以當數據過大而內存不太夠時,使用它並非一個明智的選擇。內存
關鍵在於依次對從右往左每一列數進行排序,其餘的列也相應移動。博客
這卻是一個有趣的算法了,它充分利用了鏈表的思想。
桶排序(bucket sort)在平均狀況下的運行時間爲O(n)。
計數排序假設n個輸入元素中的每個都在0和k之間,桶排序假設輸入數據是均勻分佈的,因此他們的速度都很是快。但並不能由於這些是假設就說它們不實用不許確,真正的意義在於你能夠根據狀況選擇合適的算法。好比說,輸入的n個元素並非均勻分佈的,但它們都在0到k之間,那麼就能夠用計數排序。
說到桶,我想到的是裝滿葡萄酒的酒桶以及裝滿火藥的火藥桶。這裏是桶是指的算法將[0,1)區域劃分爲了n個相同大小的空間,它們被稱爲桶。
既然有了這個劃分,那麼就要用到它們。假設輸入的是n個元素的數組A,且對於全部的i都有0≤A[i]<1。你也許會以爲怎麼可能輸入的數組元素都湊巧知足呢,固然不會這麼湊巧,可是你能夠人爲地改造它們呀。好比<10,37,31,87>,你能夠將它們都除以100,獲得<0.10,0.37,0.31,0.87>。
還須要一個臨時的數組B[0…n-1]來保存這些桶(也就是鏈表),而鏈表支持搜索,刪除和插入。關於鏈表的部分後面的博客中會有詳細介紹。
總結自:http://blog.csdn.net/nomasp/article/details/50359787