無論是歸併排序、堆排序或是快速排序,它們都是通過元素之間的比較進行排序,所以在這些排序方法的執行過程中,數組自身的性質(數組中各元素的排列順序)會直接影響到時間或者內存成本的大小。這類排序算法稱爲比較排序,這些排序算法的下界都是。
計數排序不是比較排序,它的執行效果不依賴於願數組本身元素的排列。
計數排序的思想是假設大小爲的數組中的所有元素都是在區間上的整數,這樣對於每一個元素,只要確定數組中小於的元素個數,我們就可以將放到正確的排序位置上。例如確定了有10個元素小於,這樣的話,當輸出結果序列時(從小到大排列的數組),我們就可以確定一定是在結果序列的第十一個位置。當然,如果有元素的值相同的話,符號上的細節處要略作修改,不能出現多個相同的值出現在同一個位置上。
對於一個有個元素的數組,對其進行計數排序時,需要一個對其元素數目進行記錄的數組以及一個相同大小的輸出數組。
具體的python實現如下。
#待排序數組爲l0,數組元素值域爲[0,k)
def counting_sort(l0,k):
#初始化結果數組l2,記錄數組l1
l1=[0]*k
l2=[-1]*len(l0)
#遍歷原數組,使用l1記錄所有元素的個數,將元素值爲t的個數記錄在l1[t]中
for i in range(len(l0)):
l1[l0[i]]=l1[l0[i]]+1
#累加得到原數組中小於t的元素個數
for j in range(1,k,1):
l1[j]=l1[j]+l1[j-1]
#根據l1中得到的數據(小於t的元素個數)將每個元素放到結果數組l2中正確的位置上
for i in range(len(l0)-1,-1,-1):
#從原數組的最後向前循環可以保證:具有相同值的元素在輸出數組中的相對位置與在元素組中一樣
l2[l1[l0[i]]-1]=l0[i]
#個數減一,下一個相同的元素往前排
l1[l0[i]]=l1[l0[i]]-1
return l2
我借用《算法導論》裏的例子來解釋這個程序的運行。對於要排序的數組,我們還需要知道的一個值就是所有元素的值域,顯然這裏。
下面來展示下函數運行過程中,變量和變化情況。
對於數組,當時,排序的運行時間爲。是一個很優秀的算法。